feat(android): mark the clipboard sensitive, and lock after 3 min idle

Since Android 13 the system shows a preview of whatever was just copied, at the bottom of the screen. For a password that is precisely what we are trying to avoid: it appears in clear, outside the app, for several seconds. The flag that suppresses it is a ClipDescription extra, which IFMXClipboardService does not expose - hence going straight to ClipboardManager. Note Jcontent_ClipboardManager, not JClipboardManager: the latter is the deprecated android.text one, which knows only bare text and has no ClipData to carry an extra.

Backgrounding already locks; the idle timer covers the phone left face-up on a table with the app open. It samples timestamps every 15 s rather than counting seconds - a wake-up per second would cost battery for no precision that matters.

Attachments dropped from the plan: this vault has none.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-15 14:58:27 +01:00
parent 0e39cf7e56
commit 7939d268f3
4 changed files with 199 additions and 23 deletions
+7 -7
View File
@@ -171,13 +171,13 @@ Par ordre de gravité, pas de taille.
Rangé par ce que ça apporte réellement sur un téléphone.
1. **Pièces jointes** — elles sont dans l'instantané, personne ne les lit.
Lister nom/taille par entrée, et enregistrer. **Décision à prendre avant
d'écrire quoi que ce soit** : où enregistrer sur Android 10+. Le répertoire
privé de l'application ne sert à rien à l'utilisateur, et *Téléchargements*
passe par `MediaStore` ou un `Intent` de partage. C'est cette question, pas
le code, qui bloque. Attention aussi à la mémoire : `content_b64` est déjà
décodé en RAM avec le reste de l'instantané, un coffre avec des PDF pèse.
1. ~~**Pièces jointes**~~ — **abandonné** (2026-08-15) : le coffre n'en contient
pas. Elles restent dans l'instantané et le client les ignore, ce qui ne
coûte rien. À reprendre le jour où il y en aura, en tranchant d'abord où un
fichier atterrit sur Android 10+ — le répertoire privé ne sert à rien à
l'utilisateur, *Téléchargements* passe par `MediaStore` ou un partage par
`Intent` — et en surveillant la mémoire, `content_b64` étant décodé en RAM
avec le reste de l'instantané.
2. ~~**Filtre dossier**~~ — **fait**, liste déroulante à côté de la recherche,
alimentée par le tableau `folders`, et le choix survit à un rafraîchissement
de fond. **Pas de filtre d'étiquette** : la recherche texte couvre déjà les