Commit Graph

105 Commits

Author SHA1 Message Date
r-zakarya 9ae7b58767 fix(apk): le formulaire garde la vue 'detail', sinon chaque champ perdait le focus
Un gardien defocalise tout ce qui prend le focus hors de l'ecran courant, en
comparant 'view' a l'identifiant de l'ecran. Le formulaire vit dans l'ecran
'detail' ; poser view='edit' le faisait donc blurer a chaque focusin - clavier
ouvert, pas de curseur, rien ne rentrait. Un drapeau 'editing' dit desormais
qu'on modifie, et 'view' continue de nommer l'ecran.

Mesure au protocole DevTools sur le telephone : le champ etait bien atteignable
et focalise, ce qui a elimine le DOM et le CSS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 17:03:27 +01:00
r-zakarya 2a461cad26 fix(apk): depot vide + changements en attente = premiere publication, et delais reseau plus longs
Le telephone verifiait le mot de passe de synchro en telechargeant
l'instantane et s'arretait sur 404 : rien ne partait jamais vers un depot
neuf. Mesure : un 404 de GitHub a pris 16,3 s, au-dela du delai de 15 s du
client et sous le garde-fou de 25 s - d'ou les 'HTTP 0' intermittents.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 16:31:16 +01:00
r-zakarya e0f8bf441f fix(apk): l'icone se pose a cote du titre de l'en-tete, le nom n'est plus ecrit deux fois
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 15:39:38 +01:00
r-zakarya 49738d0b74 fix(apk): retour depuis le formulaire = revenir a l'entree, pas a la liste
Le formulaire se declare comme une vue ('state?view=edit') : la fleche de
l'en-tete et la touche retour du telephone le referment d'abord.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 15:27:14 +01:00
r-zakarya 29f737b831 ui(apk): icone et nom en tete du formulaire, arrondis unifies, retour au formulaire apres une action d'icone
L'icone se commet comme un champ : Delphi rouvrait l'entree et la vue de
lecture reprenait la place au milieu d'une modification. Le formulaire est
maintenant rouvert avec ce qui y etait deja tape.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 15:18:41 +01:00
r-zakarya 0f90b816fc fix(apk): le crayon par ligne disparait, l'edition passe par le formulaire
L'editeur d'une ligne n'a plus de bouton : sa machinerie part avec lui. Seule
la liste des dossiers en est gardee (folderSelect), pour que le champ Folder du
formulaire reste un choix et non une faute de frappe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 15:05:58 +01:00
r-zakarya 0c12997ad4 feat(apk): edition de l'entree entiere en un seul enregistrement, et icone choisie dans la galerie
Un crayon ouvre un formulaire pre-rempli : tous les champs modifiables a la
fois, un seul Save, donc UN commit au lieu d'un par champ ('setfields',
plusieurs PatchEntryField dans le meme CommitChange).

L'icone quitte le menu de l'entree pour ce formulaire : From site (recherche),
Image... (galerie, reduite a 128 px, provenance custom) et Remove.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 14:57:58 +01:00
r-zakarya 5f1a98df7d ui(apk): le formulaire de nouvelle entree devient une seule carte
Sept champs faisaient sept cartes, chacune contenant un champ avec son propre
fond et ses coins - rectangle dans rectangle. Une carte, des lignes dedans, le
champ reduit a son trait de saisie ; le bouton Save sort de sa carte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 14:39:31 +01:00
r-zakarya 6a98f113ee fix(apk): pas de menu Duplicate/Delete sur l'ecran d'une nouvelle entree
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-25 14:33:59 +01:00
r-zakarya 0e32a51bf1 feat(apk): bouton de copie du code 2FA sur chaque ligne de la liste
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:58:09 +01:00
r-zakarya 255d685e73 fix(apk): 2 min de grace apres une copie, retour automatique decoche par defaut
Android ne laisse pas choisir l'app qui passe devant : moveTaskToBack
ramenait souvent l'ecran d'accueil. Le coffre se reverrouillait aussi
apres 30 s, avant qu'on revienne chercher le mot de passe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:48:23 +01:00
r-zakarya f7ad65c02d feat(apk): Settings -> Copy and search, deux cases pour le retour apres copie et le clavier sur la recherche
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:33:18 +01:00
r-zakarya 946880ecf4 feat(apk): copier renvoie a l'app d'avant, recherche prete a l'ouverture et au retour
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:28:52 +01:00
r-zakarya 9a09cc5d29 feat: survol a l'accent sur la barrette, grande fleche de retour dans l'APK
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:16:45 +01:00
r-zakarya d310b2004f fix(apk): coffre ferme, le champ du mot de passe de synchro dit qu'il est range dans le coffre
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 12:12:47 +01:00
r-zakarya 119b493a43 fix(apk): le message d'erreur des reglages est bien rouge
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 12:04:47 +01:00
r-zakarya 05fc75e8f8 fix(apk): un faux mot de passe de synchro n'ouvre plus le depot, et il se verifie a l'enregistrement
- OpenContainer reutilisait la cle de l'ancien mot de passe : jamais tant
  qu'un nouveau n'est pas verifie
- un essai rate vidait FKey (parametres out TBytes) : derivation dans des
  locales, rangee seulement apres succes
- Save coffre ouvert : verification immediate (DoSync), le bon mot de passe
  est range dans le coffre scelle ; coffre ferme, le champ est grise

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 11:51:02 +01:00
r-zakarya af6e8a2d9a feat(apk): Save des reglages actif seulement s'il y a un changement, coche apres enregistrement
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:59:03 +01:00
r-zakarya 3c16b41714 feat(sync): GitHub en plus de Gitea, et refus d'un depot public
GitHub parle la meme API des contenus (base64, sha, corps du PUT) : meme
chemin, reconnu a api.github.com/repos/. User-Agent pose partout (GitHub
refuse sans). Un depot public est refuse avant toute lecture ou ecriture,
Gitea comme GitHub : l'historique garde tous les instantanes chiffres.
Telephone : github.com/O/R se convertit en URL d'API et inversement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:36:18 +01:00
r-zakarya ba8c4205f9 feat(apk): generateur de mot de passe, erreurs du depot affichees dans les reglages
- de sur le champ mot de passe (nouvelle entree et modification), tirage
  crypto.getRandomValues avec rejet
- Download vault sans reglages ouvre les reglages
- 404/401 tranches (jeton refuse, utilisateur ou depot inexistant, fichier
  absent) et mauvais mot de passe de synchro : les reglages s'ouvrent avec
  le message en rouge

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:18:47 +01:00
r-zakarya 9b79d62553 fix(apk): l'aide de la synchro s'adapte selon que le coffre est ouvert
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:34:02 +01:00
r-zakarya 061ea211c0 docs(apk): l'aide de la synchro ne renvoie plus a une section masquee
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:29:00 +01:00
r-zakarya 034fa48994 docs: QR des reglages, trois facons d'ouvrir, scanner, AllowCreateLocal, debuggable
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:19:01 +01:00
r-zakarya 405f058a92 fix(apk): le titre Diagnostics disparait avec son bouton en release
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:08:48 +01:00
r-zakarya 1d2ea55bec feat(apk): creer un coffre local seulement en debogage (AllowCreateLocal)
En release le telephone ne sait que reprendre le coffre du depot : l'ecran
d'accueil n'offre plus que Download vault, et RegisterLocal refuse aussi.
Depot vide (404) ou conteneur illisible : rien n'est cree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 21:14:16 +01:00
r-zakarya dd9fd62dcb feat(apk): scanner le QR du poste depuis l'app (ZXing.Delphi, Apache 2.0)
Le scanner du systeme demandait avec quoi ouvrir le lien. L'app ouvre la
camera arriere, decode une image sur quatre et remplit URL + jeton des
qu'un lien pmserver://sync est lu. Rien n'est enregistre avant Save.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:38:41 +01:00
r-zakarya f817a6df43 feat(sync): QR des reglages sur le PC, Paste settings sur le telephone
Le poste genere le QR (DelphiZXingQRCode, Apache 2.0) depuis ses prefs :
URL + jeton, jamais le mot de passe de synchro. Le telephone lit le texte
copie par l'appareil photo et remplit les champs ; Save valide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:03:00 +01:00
r-zakarya 05ff08886d fix(apk): la zone URL prend la hauteur de son texte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:42:51 +01:00
r-zakarya 826b0809aa feat(apk): URL du depot affichee en forme courte + sync password quand le coffre vient de la synchro
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:38:47 +01:00
r-zakarya a9618e9395 fix(apk): URL du depot sur plusieurs lignes, la fin n'etait pas atteignable
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:33:45 +01:00
r-zakarya 333af8c28f fix(apk): entrer dans un champ place le curseur a la fin du texte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:23:25 +01:00
r-zakarya 732b93e5dd feat(apk): URL du depot telle que dans le navigateur + croix qui ne mange plus la fin du champ
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:23:09 +01:00
r-zakarya 231e3f98ae feat(apk): bouton Save dans les reglages, fermer n'enregistre plus
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:14:31 +01:00
r-zakarya d6bf06b6a7 feat(apk): coche sur la facon d'ouvrir en place + journal du mode detecte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 15:02:22 +01:00
r-zakarya 030df48559 fix(apk): Screen lock explique pourquoi il est indisponible au lieu de rester muet
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 14:52:49 +01:00
r-zakarya 799f75d53d feat(apk): choisir d'ouvrir avec le verrouillage d'ecran, un code ou le mot de passe du coffre
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 14:44:08 +01:00
r-zakarya 23568049da feat(android): saisir le secret 2FA des la creation d'une entree
Le formulaire New entry n'avait pas le champ et AddEntry ecrivait
totp_secret = '' en dur : il fallait enregistrer l'entree puis la rouvrir
pour poser un second facteur, alors que l'editeur portait deja le champ.

Meme intitule que l'editeur ("2FA secret"), masque pour une note comme
site et identifiant, et achemine par &o= — t, s, u, p, k, d etaient
pris.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:18:39 +01:00
r-zakarya b2c677997e fix(android): un faux echec de synchronisation, et des boutons colles
Le chien de garde mesurait la duree TOTALE, alors que son message dit
"no reply from the server". Sur un coffre devenu gros - 286 Ko - la
reponse arrivait en 841 ms et les vingt secondes suivantes partaient dans
la derivation de la cle puis l'affichage : il criait donc a l'absence de
reponse alors que tout avait reussi, cache ecrit compris. Un faux echec
est pire qu'un vrai, il apprend a se mefier de ce que l'application dit.

Il est desarme des que le statut HTTP est connu, quel qu'il soit : ce qui
suit ne depend plus du reseau, et le voile est leve par le finally.

Au passage, les boutons des reglages n'avaient pas de margin-top : le
champ du code et ses deux boutons se touchaient et se lisaient comme un
seul bloc. Les piles de l'accueil ont leur gap ; ici les elements se
suivent en flux normal, donc c'est au bouton de reserver sa place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 00:22:45 +01:00
r-zakarya 4fda63ec30 feat(android): creer une entree et son dossier d'un seul geste
"+ new folder" n'existait qu'a l'edition. Creer une entree ET son dossier
demandait donc trois gestes - creer, rouvrir, changer le dossier - pour
ce que le meme controle sait faire ailleurs en un seul. L'asymetrie ne se
voyait qu'en s'en servant.

Deux cas que le chemin de l'edition ne posait pas : un champ laisse vide
et le marqueur interne du "+ new folder" retombent tous deux sur All -
sans quoi valider sans rien taper aurait envoye au coffre un nom de
dossier fait d'un caractere de controle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 22:54:46 +01:00
r-zakarya 85691bb2f1 feat(android): un bouton pour jeter le coffre local, en debogage seulement
Il vit en bas des reglages, apres tout le reste, et demande deux appuis :
un effacement sans retour ne se declenche pas sur un doigt qui glisse.

Absent en release, et pas seulement cache : la commande du pont n'est pas
compilee et Delphi ne devoile la section que dans une version de
debogage. Le bouton ne peut donc pas reapparaitre par accident. Verifie -
Release compte 8060 lignes contre 8072 en debug, soit exactement ce bloc.

DropLocalVault efface le cache, le conteneur local et le drapeau
d'attente, chacun sous son propre try : un fichier absent ou verrouille
ne doit pas empecher les deux autres de partir. Les reglages du depot
restent - c'est le coffre qu'on jette, pas la facon d'aller le rechercher.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 21:47:53 +01:00
r-zakarya d43176576f style(android): les boutons du bandeau sont ronds 2026-08-28 17:52:18 +01:00
r-zakarya cc51540283 fix(android): le clavier se replie une fois l'appui passe
Retenir le focus au mousedown fait atteindre la cible du premier coup,
mais laissait le clavier ouvert : apres "Open vault" il restait dresse
par-dessus la liste. Les deux moities vont ensemble - on retient le focus
le temps de l'appui, on le lache des que l'action est partie.

Sauf si le bouton agit sur le champ lui-meme : un oeil qui devoile, une
fleche qui deroule. Ceux-la vivent dans la meme rangee que le champ, et
replier le clavier apres eux obligerait a le rouvrir pour continuer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 17:47:59 +01:00
r-zakarya 0ec32a7c19 fix(android): le message ne se cache plus derriere le clavier
Le toast vit a bottom: 14px, donc sous le clavier des que celui-ci est
leve : il ne se decouvrait qu'en quittant l'ecran, quand le clavier se
repliait. Et depuis qu'un appui sur un bouton ne vole plus le focus, le
clavier RESTE ouvert - ce qui a rendu systematique un defaut jusque-la
occasionnel.

Il remonte au-dessus de la reserve que body.typing menage deja pour le
clavier : meme mesure, meme raison.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 17:43:26 +01:00
r-zakarya 0930a866c2 fix(android): le premier appui n'est plus mange par le clavier
Un bouton touche pendant qu'un champ a le focus recevait d'abord le
blur : le clavier se repliait, la reserve de body.typing disparaissait,
la page remontait - et le bouton n'etait plus sous le doigt quand le clic
partait. Il fallait appuyer deux fois, la premiere ne servant qu'a fermer
le clavier.

Empecher le defaut du mousedown empeche le TRANSFERT DE FOCUS, pas le
clic : le champ garde le curseur, rien ne bouge, et l'appui atteint sa
cible du premier coup. Pose sur toute la page - le piege n'a aucune
raison d'etre propre aux reglages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 17:40:19 +01:00
r-zakarya b3f725137e fix(android): le message se voit dans les reglages, et le code s'y cache coffre ferme
Le toast n'avait pas de z-index : il se peignait DERRIERE l'ecran des
reglages, qui est a 80. "Unlock code set" partait bien, mais sous la
page, et ne se decouvrait qu'en sortant - quand il ne s'etait pas deja
eteint. Un message qui ne se voit pas la ou on l'a provoque ne sert a
rien.

La section du code de deverrouillage ne parait plus que coffre ouvert.
Poser comme retirer exigent le clair en main : coffre ferme, les deux ne
pouvaient que refuser, et proposer une action qui refuse toujours vaut
moins que ne rien proposer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 17:36:37 +01:00
r-zakarya a41c61405c fix(android): retirer le code de deverrouillage demande de le connaitre
Le coffre ouvert ne prouvait rien : il peut l'etre depuis une heure et
rester a l'ecran. Quiconque trouvait le telephone dans cet etat levait la
protection en deux appuis, sans que rien ne le lui demande.

Le code courant voyage maintenant avec la demande, et Delphi le compare a
FPinSealed - ce sous quoi le cache est REELLEMENT scelle, pose seulement
par une ouverture reussie, jamais par un champ.

Fermee au passage : SetUnlockCode('') retirait le code en silence, ce qui
contournait le controle qu'on vient de poser.

Le FBusy de ClearUnlockCode ne sort plus sans un mot - une sortie muette
se lit comme une reussite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:30:30 +01:00
r-zakarya 203f45eb7c fix(android): les refus se voient, et la croix se recale sur le champ
Un refus s'affichait du meme gris qu'un etat : "Master password: 8
characters at least" se lisait comme "Vault on this device", et rien ne
disait que l'application venait de refuser. StatusErr le met en rouge -
deux procedures plutot qu'un drapeau devine du texte, parce que trier des
messages sur leur contenu a deja detruit un cache dans ce projet. C'est
l'appelant qui sait s'il refuse.

La croix des champs etait calee a top: 8px, en compensation du margin-top
du champ. Les piles annulent ce margin depuis qu'on y a unifie
l'espacement, et la croix restait donc 8 px trop bas. Elle s'ancre
desormais au bord INFERIEUR, le seul que le champ touche dans les deux
cas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:25:07 +01:00
r-zakarya ed7ccdd2d6 feat(android): deux secrets separes, comme sur le poste
Le mot de passe de creation scellait le conteneur local ET pretendait
sceller l'instantane du depot. Un coffre cree ici publiait donc sous son
propre mot de passe, que le poste ne savait plus ouvrir - et le
rafraichissement echouait avec "wrong password" sur un depot pourtant
intact.

FVaultPwd ouvre le conteneur local et s'arrete la. Le secret du depot vit
dans les reglages, doit etre le meme sur tous les appareils, et c'est lui
seul qui ouvre et rescelle l'instantane.

Les deux ne se rencontrent qu'a UN endroit, la reconciliation : le
conteneur local s'ouvre sous le sien, puis la cle est jetee avant de
toucher au depot - la garder rescellerait le depot sous le mauvais
secret. Ailleurs ils ne se croisent jamais : un coffre ne ici ne publie
pas, un coffre publie n'a plus de conteneur local.

Migration : rien a rechiffrer. Les coffres existants ont simplement les
deux valeurs egales, et cessent d'etre forces de le rester.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 15:58:17 +01:00
r-zakarya ea2450abfd feat(android): dire pourquoi le cache est illisible, et accepter un mot de passe comme code
"Local vault unreadable" laissait croire a une corruption, donc a une
perte, alors que le coffre est intact dans le depot. Quand Android a
lui-meme detruit la cle - verrouillage d'ecran retire ou reinitialise -
l'application le dit maintenant, et dit aussi que rien n'est perdu.

Le tri passe par un drapeau pose la ou l'invalidation se constate, pas
par un test sur le texte du message : c'est ce tri-la, fait sur des
chaines, qui detruisait autrefois le cache en se trompant.

Le code de deverrouillage accepte un mot de passe, et l'a toujours
accepte - aucune validation n'a jamais impose des chiffres. Seul
inputmode="numeric" le laissait croire, et le clavier numerique
decourageait d'essayer. Clavier complet, libelles et note mis a jour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 15:24:29 +01:00
r-zakarya 1a19c838cd fix(android): un seul espacement entre les elements d'une pile
Un champ porte son propre margin-top de 8 px, dont il a besoin dans les
reglages ou les champs se suivent en flux normal, sans gap. Dans une
pile, ce margin s'ajoutait au gap : deux champs se retrouvaient a 16 px
l'un de l'autre, un champ et un bouton a 8. Dans une pile, c'est le gap
qui commande.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 14:51:45 +01:00