diff --git a/android-client/web/app.html b/android-client/web/app.html
index fadcfec..a97e7c1 100644
--- a/android-client/web/app.html
+++ b/android-client/web/app.html
@@ -409,8 +409,12 @@
regle, toute ecriture du cache rescellait sous ce qui trainait dans
le champ - une synchronisation, qui ne demande pourtant aucun code,
suffisait a le changer sans qu'un mot le dise.
- Cache tant qu'aucun code n'est pose : on n'en change pas un qui
- n'existe pas, on le pose avec le champ du dessus. -->
+
+ PLUS JAMAIS MONTRE. Les reglages posent et changent le code, et ce
+ champ 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, donc il porte toujours la valeur - il ne la
+ demande plus. -->
@@ -1630,7 +1634,8 @@ var PM = {
setPinNeeded: function (on) {
document.getElementById('pin').placeholder =
on ? 'unlock code' : 'set an unlock code (optional)';
- document.getElementById('pin2wrap').hidden = !on;
+ // pin2wrap n'est plus deplie : le champ du nouveau code vit dans les
+ // reglages, celui-ci n'en est que le porteur.
},
/// Le code vient d'etre change : le champ du nouveau n'a plus rien a dire,
/// et le laisser rempli le reproposerait a chaque ouverture.
diff --git a/mainApk.pas b/mainApk.pas
index d7ad009..4ebb49f 100644
--- a/mainApk.pas
+++ b/mainApk.pas
@@ -160,6 +160,11 @@ type
FHistory: TArray;
/// 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;