PM-14414 hides autofill card for all users if autofill service is enabled. (#4297)

This commit is contained in:
Dave Severns 2024-11-13 10:41:14 -05:00 committed by GitHub
parent 1e0e4831b8
commit 072c3a992c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 83 additions and 4 deletions

View file

@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.platform.manager
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.repository.util.activeUserIdChangesFlow
import com.x8bit.bitwarden.data.autofill.manager.AutofillEnabledManager
import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource
import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager
import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState
@ -30,6 +31,7 @@ class FirstTimeActionManagerImpl @Inject constructor(
private val settingsDiskSource: SettingsDiskSource,
private val vaultDiskSource: VaultDiskSource,
private val featureFlagManager: FeatureFlagManager,
private val autofillEnabledManager: AutofillEnabledManager,
) : FirstTimeActionManager {
private val unconfinedScope = CoroutineScope(dispatcherManager.unconfined)
@ -78,7 +80,7 @@ class FirstTimeActionManagerImpl @Inject constructor(
.filterNotNull()
.flatMapLatest {
// Can be expanded to support multiple autofill settings
settingsDiskSource.getShowAutoFillSettingBadgeFlow(userId = it)
getShowAutofillSettingBadgeFlowInternal(userId = it)
.map { showAutofillBadge ->
listOfNotNull(showAutofillBadge)
}
@ -128,7 +130,7 @@ class FirstTimeActionManagerImpl @Inject constructor(
listOf(
getShowImportLoginsFlowInternal(userId = activeUserId),
settingsDiskSource.getShowUnlockSettingBadgeFlow(userId = activeUserId),
settingsDiskSource.getShowAutoFillSettingBadgeFlow(userId = activeUserId),
getShowAutofillSettingBadgeFlowInternal(userId = activeUserId),
getShowImportLoginsSettingBadgeFlowInternal(userId = activeUserId),
),
) {
@ -165,7 +167,7 @@ class FirstTimeActionManagerImpl @Inject constructor(
FirstTimeState(
showImportLoginsCard = authDiskSource.getShowImportLogins(it),
showSetupUnlockCard = settingsDiskSource.getShowUnlockSettingBadge(it),
showSetupAutofillCard = settingsDiskSource.getShowAutoFillSettingBadge(it),
showSetupAutofillCard = getShowAutofillSettingBadgeInternal(it),
showImportLoginsCardInSettings = settingsDiskSource
.getShowImportLoginsSettingBadge(it),
)
@ -236,4 +238,23 @@ class FirstTimeActionManagerImpl @Inject constructor(
showImportLogins ?: false && ciphers.isEmpty()
}
}
/**
* Internal implementation to get a flow of the showAutofill value which takes
* into account if autofill is already enabled globally.
*/
private fun getShowAutofillSettingBadgeFlowInternal(userId: String): Flow<Boolean> {
return settingsDiskSource
.getShowAutoFillSettingBadgeFlow(userId)
.combine(
autofillEnabledManager.isAutofillEnabledStateFlow,
) { showAutofill, autofillEnabled ->
showAutofill ?: false && !autofillEnabled
}
}
private fun getShowAutofillSettingBadgeInternal(userId: String): Boolean {
return settingsDiskSource.getShowAutoFillSettingBadge(userId) ?: false &&
!autofillEnabledManager.isAutofillEnabled
}
}

View file

@ -6,6 +6,7 @@ import androidx.core.content.getSystemService
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.autofill.manager.AutofillEnabledManager
import com.x8bit.bitwarden.data.platform.datasource.disk.EventDiskSource
import com.x8bit.bitwarden.data.platform.datasource.disk.PushDiskSource
import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource
@ -293,12 +294,14 @@ object PlatformManagerModule {
vaultDiskSource: VaultDiskSource,
dispatcherManager: DispatcherManager,
featureFlagManager: FeatureFlagManager,
autofillEnabledManager: AutofillEnabledManager,
): FirstTimeActionManager = FirstTimeActionManagerImpl(
authDiskSource = authDiskSource,
settingsDiskSource = settingsDiskSource,
vaultDiskSource = vaultDiskSource,
dispatcherManager = dispatcherManager,
featureFlagManager = featureFlagManager,
autofillEnabledManager = autofillEnabledManager,
)
@Provides

View file

@ -8,6 +8,7 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.util.FakeAuthDiskSource
import com.x8bit.bitwarden.data.auth.datasource.network.model.KdfTypeJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.TrustedDeviceUserDecryptionOptionsJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson
import com.x8bit.bitwarden.data.autofill.manager.AutofillEnabledManager
import com.x8bit.bitwarden.data.platform.base.FakeDispatcherManager
import com.x8bit.bitwarden.data.platform.datasource.disk.util.FakeSettingsDiskSource
import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState
@ -37,17 +38,24 @@ class FirstTimeActionManagerTest {
every { getFeatureFlagFlow(FlagKey.ImportLoginsFlow) } returns mutableImportLoginsFlow
}
private val mutableAutofillEnabledFlow = MutableStateFlow(false)
private val autofillEnabledManager = mockk<AutofillEnabledManager> {
every { isAutofillEnabledStateFlow } returns mutableAutofillEnabledFlow
every { isAutofillEnabled } returns false
}
private val firstTimeActionManager = FirstTimeActionManagerImpl(
authDiskSource = fakeAuthDiskSource,
settingsDiskSource = fakeSettingsDiskSource,
vaultDiskSource = vaultDiskSource,
featureFlagManager = featureFlagManager,
dispatcherManager = FakeDispatcherManager(),
autofillEnabledManager = autofillEnabledManager,
)
@Suppress("MaxLineLength")
@Test
fun `allAutoFillSettingsBadgeCountFlow should emit the value of flags set to true and update when changed`() =
fun `allAutoFillSettingsBadgeCountFlow should emit the value of flags set to true and update when saved value is changed or autofill enabled state changes`() =
runTest {
fakeAuthDiskSource.userState = MOCK_USER_STATE
firstTimeActionManager.allAutofillSettingsBadgeCountFlow.test {
@ -62,6 +70,13 @@ class FirstTimeActionManagerTest {
showBadge = false,
)
assertEquals(0, awaitItem())
fakeSettingsDiskSource.storeShowAutoFillSettingBadge(
userId = USER_ID,
showBadge = true,
)
assertEquals(1, awaitItem())
mutableAutofillEnabledFlow.update { true }
assertEquals(0, awaitItem())
}
}
@ -240,6 +255,46 @@ class FirstTimeActionManagerTest {
firstTimeActionManager.storeShowImportLoginsSettingsBadge(showBadge = false)
assertFalse(fakeSettingsDiskSource.getShowImportLoginsSettingBadge(userId = USER_ID)!!)
}
@Test
fun `show autofill badge when autofill is already enabled should be false`() {
fakeAuthDiskSource.userState = MOCK_USER_STATE
every { autofillEnabledManager.isAutofillEnabled } returns true
assertFalse(firstTimeActionManager.currentOrDefaultUserFirstTimeState.showSetupAutofillCard)
}
@Test
fun `first time state flow should update when autofill is enabled`() = runTest {
fakeAuthDiskSource.userState = MOCK_USER_STATE
firstTimeActionManager.firstTimeStateFlow.test {
assertEquals(
FirstTimeState(
showImportLoginsCard = true,
),
awaitItem(),
)
fakeSettingsDiskSource.storeShowAutoFillSettingBadge(
userId = MOCK_USER_STATE.activeUserId,
showBadge = true,
)
assertEquals(
FirstTimeState(
showImportLoginsCard = true,
showSetupAutofillCard = true,
),
awaitItem(),
)
mutableAutofillEnabledFlow.update { true }
assertEquals(
FirstTimeState(
showImportLoginsCard = true,
showSetupAutofillCard = false,
),
awaitItem(),
)
}
}
}
private const val USER_ID: String = "userId"