diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt index 7bbac4202..b537f1f19 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt @@ -476,10 +476,15 @@ class VaultLockManagerImpl( } else -> { - // Only perform action for users losing "fully active" status in some way. when (checkTimeoutReason) { - // Don't perform delayed actions when first starting the app - CheckTimeoutReason.APP_RESTARTED -> Unit + // Always preform the timeout action on app restart to ensure the user is + // in the correct state. + CheckTimeoutReason.APP_RESTARTED -> { + handleTimeoutAction( + userId = userId, + vaultTimeoutAction = vaultTimeoutAction, + ) + } // User no longer active or engaging with the app. CheckTimeoutReason.APP_BACKGROUNDED, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModel.kt index 03ef3e9aa..300b2487e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModel.kt @@ -63,8 +63,7 @@ class RootNavViewModel @Inject constructor( val specialCircumstance = action.specialCircumstance val updatedRootNavState = when { userState?.activeAccount?.trustedDevice?.isDeviceTrusted == false && - !userState.activeAccount.isVaultUnlocked && - !userState.activeAccount.hasManualUnlockMechanism -> RootNavState.TrustedDevice + !userState.activeAccount.isVaultUnlocked -> RootNavState.TrustedDevice userState?.activeAccount?.needsMasterPassword == true -> RootNavState.SetPassword diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt index faf54539e..284e898de 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt @@ -275,7 +275,7 @@ class VaultLockManagerTest { fakeAppForegroundManager.appForegroundState = AppForegroundState.FOREGROUNDED - assertTrue(vaultLockManager.isVaultUnlocked(USER_ID)) + assertFalse(vaultLockManager.isVaultUnlocked(USER_ID)) } @Suppress("MaxLineLength") @@ -330,6 +330,8 @@ class VaultLockManagerTest { // Start in a foregrounded state fakeAppForegroundManager.appForegroundState = AppForegroundState.BACKGROUNDED + // We want to skip the first time since that is different from subsequent foregrounds + fakeAppForegroundManager.appForegroundState = AppForegroundState.FOREGROUNDED // Will be used within each loop to reset the test to a suitable initial state. fun resetTest(vaultTimeout: VaultTimeout) { diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt index a06ccb5e1..0f9746d42 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt @@ -170,8 +170,9 @@ class RootNavViewModelTest : BaseViewModelTest() { ) } + @Suppress("MaxLineLength") @Test - fun `when the active user has an untrusted device the nav state should be TrustedDevice`() { + fun `when the active user has an untrusted device without password the nav state should be TrustedDevice`() { mutableUserStateFlow.tryEmit( UserState( activeUserId = "activeUserId", @@ -207,7 +208,7 @@ class RootNavViewModelTest : BaseViewModelTest() { @Suppress("MaxLineLength") @Test - fun `when the active user has an untrusted device with password the nav state should be VaultLocked`() { + fun `when the active user has an untrusted device with password the nav state should be TrustedDevice`() { mutableUserStateFlow.tryEmit( UserState( activeUserId = "activeUserId", @@ -238,7 +239,7 @@ class RootNavViewModelTest : BaseViewModelTest() { ), ) val viewModel = createViewModel() - assertEquals(RootNavState.VaultLocked, viewModel.stateFlow.value) + assertEquals(RootNavState.TrustedDevice, viewModel.stateFlow.value) } @Suppress("MaxLineLength")