diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java index 10a8c1a2db..38d36b75cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java @@ -171,6 +171,8 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements return STATE_WELCOME_PUSH_SCREEN; } else if (SignalStore.storageService().needsAccountRestore()) { return STATE_ENTER_SIGNAL_PIN; + } else if (userHasSkippedOrForgottenPin()) { + return STATE_CREATE_SIGNAL_PIN; } else if (userMustSetProfileName()) { return STATE_CREATE_PROFILE_NAME; } else if (userMustCreateSignalPin()) { @@ -190,6 +192,10 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements return !SignalStore.registrationValues().isRegistrationComplete() && !SignalStore.kbsValues().hasPin() && !SignalStore.kbsValues().lastPinCreateFailed() && !SignalStore.kbsValues().hasOptedOut(); } + private boolean userHasSkippedOrForgottenPin() { + return !SignalStore.registrationValues().isRegistrationComplete() && !SignalStore.kbsValues().hasPin() && !SignalStore.kbsValues().hasOptedOut() && SignalStore.kbsValues().isPinForgottenOrSkipped(); + } + private boolean userMustSetProfileName() { return !SignalStore.registrationValues().isRegistrationComplete() && Recipient.self().getProfileName().isEmpty(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/KbsValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/KbsValues.java index a6018237af..8c867c3a36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/KbsValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/KbsValues.java @@ -23,6 +23,7 @@ public final class KbsValues extends SignalStoreValues { private static final String LOCK_LOCAL_PIN_HASH = "kbs.registration_lock_local_pin_hash"; private static final String LAST_CREATE_FAILED_TIMESTAMP = "kbs.last_create_failed_timestamp"; public static final String OPTED_OUT = "kbs.opted_out"; + private static final String PIN_FORGOTTEN_OR_SKIPPED = "kbs.pin.forgotten.or.skipped"; KbsValues(KeyValueStore store) { super(store); @@ -156,6 +157,14 @@ public final class KbsValues extends SignalStoreValues { return getLocalPinHash() != null; } + public synchronized boolean isPinForgottenOrSkipped() { + return getBoolean(PIN_FORGOTTEN_OR_SKIPPED, false); + } + + public synchronized void setPinForgottenOrSkipped(boolean value) { + putBoolean(PIN_FORGOTTEN_OR_SKIPPED, value); + } + /** Should only be called by {@link org.thoughtcrime.securesms.pin.PinState}. */ public synchronized void optOut() { getStore().beginWrite() diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreActivity.java b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreActivity.java index 0b1e9da179..ac709e4559 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreActivity.java @@ -34,5 +34,6 @@ public final class PinRestoreActivity extends AppCompatActivity { final Intent chained = PassphraseRequiredActivity.chainIntent(createPin, main); startActivity(chained); + finish(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java index eba184790a..f7cd660bc4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java @@ -227,6 +227,7 @@ public class PinRestoreEntryFragment extends LoggingFragment { } private void onAccountLocked() { + PinState.onPinRestoreForgottenOrSkipped(); SafeNavigation.safeNavigate(Navigation.findNavController(requireView()), PinRestoreEntryFragmentDirections.actionAccountLocked()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/PinState.java b/app/src/main/java/org/thoughtcrime/securesms/pin/PinState.java index 506c75331f..a296e3b92b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/PinState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/PinState.java @@ -86,6 +86,7 @@ public final class PinState { SignalStore.kbsValues().setKbsMasterKey(kbsData, pin); SignalStore.kbsValues().setV2RegistrationLockEnabled(false); SignalStore.pinValues().resetPinReminders(); + SignalStore.kbsValues().setPinForgottenOrSkipped(false); SignalStore.storageService().setNeedsAccountRestore(false); resetPinRetryCount(context, pin); ClearFallbackKbsEnclaveJob.clearAll(); @@ -99,6 +100,7 @@ public final class PinState { public static synchronized void onPinRestoreForgottenOrSkipped() { SignalStore.kbsValues().clearRegistrationLockAndPin(); SignalStore.storageService().setNeedsAccountRestore(false); + SignalStore.kbsValues().setPinForgottenOrSkipped(true); updateState(buildInferredStateFromOtherFields()); } @@ -122,6 +124,7 @@ public final class PinState { KbsPinData kbsData = pinChangeSession.setPin(hashedPin, masterKey); kbsValues.setKbsMasterKey(kbsData, pin); + kbsValues.setPinForgottenOrSkipped(false); TextSecurePreferences.clearRegistrationLockV1(context); SignalStore.pinValues().setKeyboardType(keyboard); SignalStore.pinValues().resetPinReminders(); diff --git a/app/src/main/res/navigation/pin_restore.xml b/app/src/main/res/navigation/pin_restore.xml index 410c8c228c..a8fa0b0729 100644 --- a/app/src/main/res/navigation/pin_restore.xml +++ b/app/src/main/res/navigation/pin_restore.xml @@ -16,8 +16,8 @@ app:destination="@id/pinLockedFragment" app:enterAnim="@anim/nav_default_enter_anim" app:exitAnim="@anim/nav_default_exit_anim" - app:popEnterAnim="@anim/nav_default_pop_enter_anim" - app:popExitAnim="@anim/nav_default_pop_exit_anim" /> + app:popUpTo="@id/signup" + app:popUpToInclusive="true" />