From adad1425d8415355f53f009d91318fd5a8ea2ec8 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 14 Jul 2026 16:14:00 -0400 Subject: [PATCH] Navigate reglock mismatch to account locked in regV5. --- .../pinentry/PinEntryForRegistrationLockViewModel.kt | 5 +++-- .../PinEntryForRegistrationLockViewModelTest.kt | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt index 2195e3bcd1..cffa6c14f7 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModel.kt @@ -25,6 +25,7 @@ import org.signal.registration.RegistrationRoute import org.signal.registration.screens.EventDrivenViewModel import org.signal.registration.screens.util.navigateBack import org.signal.registration.screens.util.navigateTo +import kotlin.time.Duration.Companion.days /** * ViewModel for the registration lock PIN entry screen. @@ -173,8 +174,8 @@ class PinEntryForRegistrationLockViewModel( state } is NetworkController.RegisterAccountError.RegistrationLock -> { - Log.w(TAG, "[PinEntered] Still getting registration lock error after providing token. This shouldn't happen. Resetting state.") - parentEventEmitter(RegistrationFlowEvent.ResetState) + Log.w(TAG, "[PinEntered] Still getting registration lock error after providing token. This implies that the MasterKey and reglock token on AccountAttributes is out of sync. All we can do is report the account as locked.") + parentEventEmitter.navigateTo(RegistrationRoute.AccountLocked(7.days.inWholeMilliseconds)) state } is NetworkController.RegisterAccountError.RateLimited -> { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModelTest.kt index 8bd51f9cbb..6c5853e9c7 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForRegistrationLockViewModelTest.kt @@ -27,6 +27,7 @@ import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute +import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.seconds class PinEntryForRegistrationLockViewModelTest { @@ -296,7 +297,7 @@ class PinEntryForRegistrationLockViewModelTest { } @Test - fun `PinEntered with registration lock error during registration emits ResetState`() = runTest { + fun `PinEntered with registration lock error during registration navigates to AccountLocked`() = runTest { val masterKey = mockk(relaxed = true) val registrationLockData = mockk(relaxed = true) val initialState = PinEntryState(mode = PinEntryState.Mode.RegistrationLock) @@ -312,7 +313,12 @@ class PinEntryForRegistrationLockViewModelTest { assertThat(emittedParentEvents).hasSize(2) assertThat(emittedParentEvents[0]).isInstanceOf() - assertThat(emittedParentEvents[1]).isEqualTo(RegistrationFlowEvent.ResetState) + assertThat(emittedParentEvents[1]) + .isInstanceOf() + .prop(RegistrationFlowEvent.NavigateToScreen::route) + .isInstanceOf() + .prop(RegistrationRoute.AccountLocked::timeRemainingMs) + .isEqualTo(7.days.inWholeMilliseconds) } @Test