From 794b68d36409b2041cbdfc4ffdba885e008f0541 Mon Sep 17 00:00:00 2001 From: Oleg Semenenko <146032743+oleg-livefront@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:28:32 -0600 Subject: [PATCH] Save the value for showing the initial autofill dialog (#916) --- .../datasource/disk/SettingsDiskSource.kt | 5 ++ .../datasource/disk/SettingsDiskSourceImpl.kt | 10 ++++ .../platform/repository/SettingsRepository.kt | 5 ++ .../repository/SettingsRepositoryImpl.kt | 6 +++ .../datasource/disk/SettingsDiskSourceTest.kt | 49 +++++++++++++++++++ .../disk/util/FakeSettingsDiskSource.kt | 7 +++ .../repository/SettingsRepositoryTest.kt | 13 +++++ 7 files changed, 95 insertions(+) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt index 5fdcb89537..1d39779c58 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt @@ -18,6 +18,11 @@ interface SettingsDiskSource { */ var appLanguage: AppLanguage? + /** + * Has the initial autofill dialog been shown to the user. + */ + var initialAutofillDialogShown: Boolean? + /** * The currently persisted app theme (or `null` if not set). */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt index 921abc6832..ef2accb658 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt @@ -32,6 +32,7 @@ private const val SYSTEM_BIOMETRIC_INTEGRITY_SOURCE_KEY = "$BASE_KEY:biometricIn private const val ACCOUNT_BIOMETRIC_INTEGRITY_VALID_KEY = "$BASE_KEY:accountBiometricIntegrityValid" private const val CRASH_LOGGING_ENABLED_KEY = "$BASE_KEY:crashLoggingEnabled" private const val CLEAR_CLIPBOARD_INTERVAL_KEY = "$BASE_KEY:clearClipboard" +private const val INITIAL_AUTOFILL_DIALOG_SHOWN = "$BASE_KEY:addSitePromptShown" /** * Primary implementation of [SettingsDiskSource]. @@ -77,6 +78,15 @@ class SettingsDiskSourceImpl( ) } + override var initialAutofillDialogShown: Boolean? + get() = getBoolean(key = INITIAL_AUTOFILL_DIALOG_SHOWN) + set(value) { + putBoolean( + key = INITIAL_AUTOFILL_DIALOG_SHOWN, + value = value, + ) + } + override var systemBiometricIntegritySource: String? get() = getString(key = SYSTEM_BIOMETRIC_INTEGRITY_SOURCE_KEY) set(value) { diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt index e9b1539e9a..516bc26ead 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt @@ -32,6 +32,11 @@ interface SettingsRepository { */ val appThemeStateFlow: StateFlow + /** + * Has the initial autofill dialog been shown to the user. + */ + var initialAutofillDialogShown: Boolean + /** * The currently stored last time the vault was synced. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt index baefe67a30..896ec1cfbe 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt @@ -65,6 +65,12 @@ class SettingsRepositoryImpl( initialValue = settingsDiskSource.appTheme, ) + override var initialAutofillDialogShown: Boolean + get() = settingsDiskSource.initialAutofillDialogShown ?: false + set(value) { + settingsDiskSource.initialAutofillDialogShown = value + } + override var vaultLastSync: Instant? get() = vaultLastSyncStateFlow.value set(value) { diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt index 06d821cc9b..6b201caba9 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt @@ -936,4 +936,53 @@ class SettingsDiskSourceTest { settingsDiskSource.getClearClipboardFrequencySeconds(mockUserId), ) } + + @Test + fun `initialAutofillDialogShown should pull from and update SharedPreferences`() { + val initialAutofillDialogShownKey = "bwPreferencesStorage:addSitePromptShown" + val expectedValue = true + + assertEquals(null, settingsDiskSource.initialAutofillDialogShown) + assertFalse(fakeSharedPreferences.getBoolean(initialAutofillDialogShownKey, false)) + + // Update SharedPreferences updates the disk source + fakeSharedPreferences.edit { + putBoolean(initialAutofillDialogShownKey, expectedValue) + } + + assertEquals( + expectedValue, + settingsDiskSource.initialAutofillDialogShown, + ) + + // Updating the disk source updates shared preferences + settingsDiskSource.initialAutofillDialogShown = false + + assertFalse(fakeSharedPreferences.getBoolean(initialAutofillDialogShownKey, true)) + } + + @Suppress("MaxLineLength") + @Test + fun `initialAutofillDialogShown should clear the SharedPreferences value if the value is null `() { + val initialAutofillDialogShownKey = "bwPreferencesStorage:addSitePromptShown" + val expectedValue = true + + assertEquals(null, settingsDiskSource.initialAutofillDialogShown) + assertFalse(fakeSharedPreferences.getBoolean(initialAutofillDialogShownKey, false)) + + // Update SharedPreferences updates the disk source + fakeSharedPreferences.edit { + putBoolean(initialAutofillDialogShownKey, expectedValue) + } + + assertEquals( + expectedValue, + settingsDiskSource.initialAutofillDialogShown, + ) + + // Updating the disk source updates shared preferences + settingsDiskSource.initialAutofillDialogShown = null + + assertFalse(fakeSharedPreferences.contains(initialAutofillDialogShownKey)) + } } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt index d340b6f5e2..33ebdc6b8f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt @@ -51,6 +51,7 @@ class FakeSettingsDiskSource : SettingsDiskSource { private val storedBlockedAutofillUris = mutableMapOf?>() private var storedIsIconLoadingDisabled: Boolean? = null private var storedIsCrashLoggingEnabled: Boolean? = null + private var storedInitialAutofillDialogShown: Boolean? = null private val storedApprovePasswordLoginsEnabled = mutableMapOf() private val storedScreenCaptureAllowed = mutableMapOf() private var storedSystemBiometricIntegritySource: String? = null @@ -83,6 +84,12 @@ class FakeSettingsDiskSource : SettingsDiskSource { mutableIsIconLoadingDisabled.tryEmit(value) } + override var initialAutofillDialogShown: Boolean? + get() = storedInitialAutofillDialogShown + set(value) { + storedInitialAutofillDialogShown = value + } + override val isIconLoadingDisabledFlow: Flow get() = mutableIsIconLoadingDisabled.onSubscription { emit(isIconLoadingDisabled) diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt index adc21f2b31..bc6ca629bb 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt @@ -898,6 +898,19 @@ class SettingsRepositoryTest { settingsRepository.clearClipboardFrequency, ) } + + @Suppress("MaxLineLength") + @Test + fun `initialAutofillDialogShown should pull from and update SettingsDiskSource`() = + runTest { + fakeAuthDiskSource.userState = MOCK_USER_STATE + + fakeSettingsDiskSource.initialAutofillDialogShown = true + assertTrue(settingsRepository.initialAutofillDialogShown) + + settingsRepository.initialAutofillDialogShown = false + assertEquals(false, fakeSettingsDiskSource.initialAutofillDialogShown) + } } private val MOCK_USER_STATE =