diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt index f17273725..6b088f080 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt @@ -53,6 +53,11 @@ interface VaultRepository { */ fun getVaultFolderStateFlow(folderId: String): StateFlow<DataState<FolderView?>> + /** + * Locks the vault for the current user if currently unlocked. + */ + fun lockVaultForCurrentUser() + /** * Locks the vault for the user with the given [userId] if necessary. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 8b6b6af25..e559a546e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -159,6 +159,12 @@ class VaultRepositoryImpl constructor( initialValue = DataState.Loading, ) + override fun lockVaultForCurrentUser() { + authDiskSource.userState?.activeUserId?.let { + lockVaultIfNecessary(it) + } + } + override fun lockVaultIfNecessary(userId: String) { setVaultToLocked(userId = userId) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt index aed448a1f..b300f597a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository +import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.ui.platform.base.BaseViewModel import com.x8bit.bitwarden.ui.platform.base.util.Text import com.x8bit.bitwarden.ui.platform.base.util.asText @@ -24,6 +25,7 @@ private const val KEY_STATE = "state" @HiltViewModel class AccountSecurityViewModel @Inject constructor( private val authRepository: AuthRepository, + private val vaultRepository: VaultRepository, savedStateHandle: SavedStateHandle, ) : BaseViewModel<AccountSecurityState, AccountSecurityEvent, AccountSecurityAction>( initialState = savedStateHandle[KEY_STATE] @@ -99,8 +101,7 @@ class AccountSecurityViewModel @Inject constructor( } private fun handleLockNowClick() { - // TODO BIT-467: Lock the app - sendEvent(AccountSecurityEvent.ShowToast("Lock the app.".asText())) + vaultRepository.lockVaultForCurrentUser() } private fun handleLoginRequestToggle(action: AccountSecurityAction.LoginRequestToggle) { diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 7f082a987..4a037a6af 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -469,6 +469,31 @@ class VaultRepositoryTest { } } + @Suppress("MaxLineLength") + @Test + fun `lockVaultForCurrentUser should lock the vault for the current user if it is currently unlocked`() = + runTest { + fakeAuthDiskSource.userState = MOCK_USER_STATE + val userId = "mockId-1" + verifyUnlockedVault(userId = userId) + + assertEquals( + VaultState( + unlockedVaultUserIds = setOf(userId), + ), + vaultRepository.vaultStateFlow.value, + ) + + vaultRepository.lockVaultForCurrentUser() + + assertEquals( + VaultState( + unlockedVaultUserIds = emptySet(), + ), + vaultRepository.vaultStateFlow.value, + ) + } + @Test fun `lockVaultIfNecessary should lock the given account if it is currently unlocked`() = runTest { diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt index 48fd4f2e6..9e6c4336f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt @@ -3,10 +3,13 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.accountsecurity import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.x8bit.bitwarden.data.auth.repository.AuthRepository +import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest import com.x8bit.bitwarden.ui.platform.base.util.asText import io.mockk.every +import io.mockk.just import io.mockk.mockk +import io.mockk.runs import io.mockk.verify import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals @@ -80,12 +83,13 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { } @Test - fun `on LockNowClick should emit ShowToast`() = runTest { - val viewModel = createViewModel() - viewModel.eventFlow.test { - viewModel.trySendAction(AccountSecurityAction.LockNowClick) - assertEquals(AccountSecurityEvent.ShowToast("Lock the app.".asText()), awaitItem()) + fun `on LockNowClick should call lockVaultForCurrentUser`() { + val vaultRepository = mockk<VaultRepository>(relaxed = true) { + every { lockVaultForCurrentUser() } just runs } + val viewModel = createViewModel(vaultRepository = vaultRepository) + viewModel.trySendAction(AccountSecurityAction.LockNowClick) + verify { vaultRepository.lockVaultForCurrentUser() } } @Test @@ -230,11 +234,13 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { private fun createViewModel( authRepository: AuthRepository = mockk(relaxed = true), + vaultRepository: VaultRepository = mockk(relaxed = true), savedStateHandle: SavedStateHandle = SavedStateHandle().apply { set("state", DEFAULT_STATE) }, ): AccountSecurityViewModel = AccountSecurityViewModel( authRepository = authRepository, + vaultRepository = vaultRepository, savedStateHandle = savedStateHandle, )