fix(android): Sync ouvre puis synchronise, et l'accueil ne demande plus le nouveau code

Le garde pose juste avant fermait la seule porte : le bouton Sync ne vit
que sur l'accueil, et une fois le coffre ouvert on est sur la liste, ou
il n'existe pas. Synchroniser devenait impossible des qu'un code etait
pose. Sync ouvre donc le coffre - ce qui verifie le code, seul LoadVault
le peut - et OpenLocalNow reprend la synchronisation ou elle s'est
arretee. Le drapeau est consomme des sa lecture, pour qu'un code faux ne
laisse pas une synchronisation en embuscade.

Le champ "new unlock code" quitte l'accueil : les reglages posent et
changent le code, il y faisait doublon sur l'ecran ou l'on veut seulement
ouvrir. Il reste dans la page, cache - c'est lui que "Set this code"
remplit avant pushConfig.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 12:50:15 +01:00
parent 138abea88d
commit 6c5fb2f4ea
2 changed files with 39 additions and 6 deletions
+31 -3
View File
@@ -160,6 +160,11 @@ type
FHistory: TArray<string>;
/// Des modifications sont rangees ici sans avoir atteint le depot.
FPending: Boolean;
/// Le geste etait "synchroniser", et l'ouverture n'a servi qu'a verifier le
/// code de deverrouillage. Remis a faux des sa lecture : sans cela une
/// ouverture ordinaire, plus tard, declencherait une synchronisation que
/// personne n'a demandee.
FSyncAfterOpen: Boolean;
/// Le depot porte quelque chose que nous n'avons pas.
FRemoteAhead: Boolean;
/// Ticks du minuteur d'inactivite depuis la derniere verification du depot.
@@ -1910,7 +1915,12 @@ procedure TForm8.OpenLocalNow;
var
LPlain, LETag, LPwd: string;
LSw: TStopwatch;
LChainSync: Boolean;
begin
// LU ET CONSOMME ICI, une fois pour toutes : un drapeau qui survivrait a un
// code faux ferait synchroniser la prochaine ouverture, sans rapport.
LChainSync := FSyncAfterOpen;
FSyncAfterOpen := False;
// CHRONOMETRE EN TROIS TEMPS. Une ouverture depuis le cache doit etre
// instantanee : c'est toute la raison d'etre de PMA.Store. Quand elle ne
// l'est pas, il faut savoir LEQUEL des trois coute - la lecture du fichier
@@ -2016,7 +2026,12 @@ begin
// Afficher d'abord, synchroniser ensuite : le coffre est a l'ecran, le
// reseau se debrouille derriere. Sans mot de passe range, on ne peut
// rien ouvrir de nouveau - inutile d'aller voir.
if FSyncPwd = '' then
// Le geste de depart etait "synchroniser" : on enchaine sur la vraie
// synchronisation - qui publie et reconcilie - et non sur le simple
// rafraichissement de fond, qui ne fait que tirer.
if LChainSync then
TThread.ForceQueue(nil, procedure begin DoSync(nil); end)
else if FSyncPwd = '' then
Log(' no stored sync password - no background refresh')
else if (FLastRefresh > 0) and
(MinutesBetween(Now, FLastRefresh) < REFRESH_MIN_MINUTES) then
@@ -2163,8 +2178,21 @@ begin
// verification recopiee ici.
if VaultNeedsPin and (FVault.Count = 0) then
begin
Status('Open the vault first');
WebCall('PM.focusPin()');
// NE PAS S'ARRETER LA. Refuser tout court fermait la seule porte : le
// bouton Sync ne vit que sur l'accueil, et une fois le coffre ouvert on est
// sur la liste, ou il n'existe pas. Synchroniser devenait impossible des
// qu'un code etait pose.
//
// On ouvre donc - ce qui verifie le code, seul LoadVault le peut - et
// OpenLocalNow reprend la synchronisation la ou elle s'est arretee.
if FPin = '' then
begin
Status('Unlock code required');
WebCall('PM.focusPin()');
Exit;
end;
FSyncAfterOpen := True;
OpenVault(False);
Exit;
end;