diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 938af48c6..3343a717b 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -746,6 +746,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { adjustCreative.set(settings.adjustCreative) adjustNetwork.set(settings.adjustNetwork) + settings.migrateSearchWidgetInstalledPrefIfNeeded() searchWidgetInstalled.set(settings.searchWidgetInstalled) val openTabsCount = settings.openTabsCount diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 884323025..70c0f6a09 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1216,14 +1216,31 @@ class Settings(private val appContext: Context) : PreferencesHolder { * exists on home screen or if it has been removed completely. */ fun setSearchWidgetInstalled(installed: Boolean) { - val key = appContext.getPreferenceKey(R.string.pref_key_search_widget_installed) + val key = appContext.getPreferenceKey(R.string.pref_key_search_widget_installed_2) preferences.edit() .putBoolean(key, installed) .apply() } + /** + * In Bug 1853113, we changed the type of [searchWidgetInstalled] from int to boolean without + * changing the pref key, now we have to migrate users that were using the previous type int + * to the new one boolean. The migration will only happens if pref_key_search_widget_installed + * is detected. + */ + fun migrateSearchWidgetInstalledPrefIfNeeded() { + val oldKey = "pref_key_search_widget_installed" + val installedCount = preferences.getInt(oldKey, 0) + + if (installedCount > 0) { + setSearchWidgetInstalled(true) + preferences.edit() + .remove(oldKey).apply() + } + } + val searchWidgetInstalled by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_search_widget_installed), + appContext.getPreferenceKey(R.string.pref_key_search_widget_installed_2), default = false, ) diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 26ea06ae5..b0a9fcfb1 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -95,7 +95,7 @@ pref_key_sign_out pref_key_sync_sign_in project_id - pref_key_search_widget_installed + pref_key_search_widget_installed_2 pref_key_saved_logins_sorting_strategy pref_key_sync_credit_cards diff --git a/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt b/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt index 87c0cff1f..4e6ca6a5d 100644 --- a/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt +++ b/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt @@ -105,7 +105,8 @@ class FenixApplicationTest { every { settings.adjustAdGroup } returns "group" every { settings.adjustCreative } returns "creative" every { settings.adjustNetwork } returns "network" - every { settings.searchWidgetInstalled } returns true + // Testing [settings.migrateSearchWidgetInstalledPrefIfNeeded] + settings.preferences.edit().putInt("pref_key_search_widget_installed", 5).apply() every { settings.openTabsCount } returns 1 every { settings.topSitesSize } returns 2 every { settings.installedAddonsCount } returns 3 diff --git a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt index 651c93f90..268555130 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -18,6 +18,7 @@ import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue +import org.junit.Assert.fail import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -950,4 +951,48 @@ class SettingsTest { settings.openLinksInExternalApp = "pref_key_open_links_in_apps_never" assertEquals(settings.getOpenLinksInAppsString(), "Never") } + + @Test + fun `GIVEN a written integer value for pref_key_search_widget_installed WHEN reading searchWidgetInstalled THEN do not throw a ClassCastException`() { + val expectedInt = 5 + val oldPrefKey = "pref_key_search_widget_installed" + + settings.preferences.edit().putInt(oldPrefKey, expectedInt).apply() + + try { + assertEquals(expectedInt, settings.preferences.getInt(oldPrefKey, 0)) + assertFalse(settings.searchWidgetInstalled) + } catch (e: ClassCastException) { + fail("Unexpected ClassCastException") + } + } + + @Test + fun `GIVEN previously stored pref_key_search_widget_installed value WHEN calling migrateSearchWidgetInstalledIfNeeded THEN migrate the value`() { + val expectedInt = 5 + val oldPrefKey = "pref_key_search_widget_installed" + + settings.preferences.edit().putInt(oldPrefKey, expectedInt).apply() + + assertEquals(expectedInt, settings.preferences.getInt(oldPrefKey, 0)) + assertFalse(settings.searchWidgetInstalled) + + settings.migrateSearchWidgetInstalledPrefIfNeeded() + + assertTrue(settings.searchWidgetInstalled) + } + + @Test + fun `GIVEN none previously stored pref_key_search_widget_installed value WHEN calling migrateSearchWidgetInstalledIfNeeded THEN migration should not happen`() { + val oldPrefKey = "pref_key_search_widget_installed" + val expectedDefaultValue = 0 + val storedValue = settings.preferences.getInt(oldPrefKey, expectedDefaultValue) + + assertEquals(expectedDefaultValue, storedValue) + + settings.migrateSearchWidgetInstalledPrefIfNeeded() + + assertEquals(expectedDefaultValue, settings.preferences.getInt(oldPrefKey, expectedDefaultValue)) + assertFalse(settings.searchWidgetInstalled) + } }