tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 620b9a6634addf13e2fbb3823f4477c13ec55ef6
parent b0d730fb2af22b556adbf05e9489f54c32f3ee12
Author: t-p-white <towhite@mozilla.com>
Date:   Mon,  8 Dec 2025 19:43:24 +0000

Bug 2002784 - Refactor the naming for lazyFeatureFlagPreference and lazyFeatureFlagPreference to be more explicit. Update the documentation for featureFlagBooleanPreference to match lazyFeatureFlagBooleanPreference r=android-reviewers,mavduevskiy

Differential Revision: https://phabricator.services.mozilla.com/D274323

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/settings/FeatureFlagPreference.kt | 45+++++++++++++++++++++++++++++++++++----------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 35+++++++++++++++++------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/settings/FeatureFlagPreferenceTest.kt | 4++--
3 files changed, 54 insertions(+), 30 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/settings/FeatureFlagPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/settings/FeatureFlagPreference.kt @@ -19,22 +19,47 @@ private class DummyProperty : ReadWriteProperty<PreferencesHolder, Boolean> { /** * Property delegate for getting and setting a boolean shared preference gated by a feature flag. * - * @param key Key for the shared preference. - * @param default Default value to return. - * @param featureFlag If true, returns the shared preference value. If false, returns false. + * @param key The key for the shared preference. + * @param defaultValue The default value to return when the preference is unset. + * @param featureFlag If `true`, the shared preference value is returned; if `false`, this always + * returns `false`, regardless of the stored value. + * + * Note: If you intend to always pass `true` for [featureFlag], consider using [booleanPreference] + * directly instead, as the feature flag provides no additional behavior in that case. + * + * For example, this is **not** recommended: + * ``` + * val isMyFeatureEnabled by lazyFeatureFlagPreference( + * … + * isMyFeatureEnabled = true, + * … + * ) + * ``` + * + * [featureFlag] may be controlled through various mechanisms - for example, via an + * alternative feature-flag system like [FeatureFlags], or internal conditionals. + * + * For example, recommended use: + * ``` + * val isMyFeatureEnabled by lazyFeatureFlagPreference( + * … + * isMyFeatureEnabled = FeatureFlags.onboardingFeatureEnabled, + * … + * ) + * ``` */ -fun featureFlagPreference(key: String, default: Boolean, featureFlag: Boolean) = +fun featureFlagBooleanPreference(key: String, defaultValue: Boolean, featureFlag: Boolean) = if (featureFlag) { - booleanPreference(key, default) + booleanPreference(key, defaultValue) } else { DummyProperty() } -private class LazyPreference(val key: String, val default: () -> Boolean) : +private class LazyBooleanPreference(val key: String, val defaultValue: () -> Boolean) : ReadWriteProperty<PreferencesHolder, Boolean> { override fun getValue(thisRef: PreferencesHolder, property: KProperty<*>): Boolean = - thisRef.preferences.getBoolean(key, default()) + thisRef.preferences.getBoolean(key, defaultValue()) override fun setValue(thisRef: PreferencesHolder, property: KProperty<*>, value: Boolean) = thisRef.preferences.edit { putBoolean(key, value) } @@ -71,11 +96,11 @@ private class LazyPreference(val key: String, val default: () -> Boolean) : * ) * ``` * - * @param default The default value to return when the preference is unset. + * @param defaultValue The default value to return when the preference is unset. */ -fun lazyFeatureFlagPreference(key: String, featureFlag: Boolean, default: () -> Boolean) = +fun lazyFeatureFlagBooleanPreference(key: String, featureFlag: Boolean, defaultValue: () -> Boolean) = if (featureFlag) { - LazyPreference(key, default) + LazyBooleanPreference(key, defaultValue) } else { DummyProperty() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -45,8 +45,8 @@ import org.mozilla.fenix.R import org.mozilla.fenix.autofill.address.RegionAddressFeatureGate import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.settings.counterPreference -import org.mozilla.fenix.components.settings.featureFlagPreference -import org.mozilla.fenix.components.settings.lazyFeatureFlagPreference +import org.mozilla.fenix.components.settings.featureFlagBooleanPreference +import org.mozilla.fenix.components.settings.lazyFeatureFlagBooleanPreference import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.debugsettings.addresses.EmptyAddressesDebugRegionRepository import org.mozilla.fenix.debugsettings.addresses.SharedPrefsAddressesDebugRegionRepository @@ -199,10 +199,10 @@ class Settings( /** * Indicates if the stories homescreen section should be shown. */ - var showPocketRecommendationsFeature by lazyFeatureFlagPreference( + var showPocketRecommendationsFeature by lazyFeatureFlagBooleanPreference( appContext.getPreferenceKey(R.string.pref_key_pocket_homescreen_recommendations), featureFlag = ContentRecommendationsFeatureHelper.isContentRecommendationsFeatureEnabled(appContext), - default = { homescreenSections[HomeScreenSection.POCKET] == true }, + defaultValue = { homescreenSections[HomeScreenSection.POCKET] == true }, ) /** @@ -238,9 +238,9 @@ class Settings( /** * Indicates if the Pocket recommendations homescreen section should also show sponsored stories. */ - val showPocketSponsoredStories by lazyFeatureFlagPreference( + val showPocketSponsoredStories by lazyFeatureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_pocket_sponsored_stories), - default = { homescreenSections[HomeScreenSection.POCKET_SPONSORED_STORIES] == true }, + defaultValue = { homescreenSections[HomeScreenSection.POCKET_SPONSORED_STORIES] == true }, featureFlag = ContentRecommendationsFeatureHelper.isPocketSponsoredStoriesFeatureEnabled(appContext), ) @@ -499,9 +499,8 @@ class Settings( default = false, ) - val appIconSelection by lazyFeatureFlagPreference( + val appIconSelection by booleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_app_icon_selection_enabled), - featureFlag = true, default = { FxNimbus.features.appIconSelection.value().enabled }, ) @@ -1967,15 +1966,15 @@ class Settings( /** * Address Sync feature. */ - var isAddressSyncEnabled by featureFlagPreference( + var isAddressSyncEnabled by featureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_enable_address_sync), - default = true, + defaultValue = true, featureFlag = isAddressFeatureEnabled(appContext), ) - var addressFeature by featureFlagPreference( + var addressFeature by featureFlagBooleanPreference( appContext.getPreferenceKey(R.string.pref_key_show_address_feature), - default = true, + defaultValue = true, featureFlag = isAddressFeatureEnabled(appContext), ) @@ -2403,9 +2402,9 @@ class Settings( /** * Indicates if Firefox Suggest is enabled. */ - var enableFxSuggest by lazyFeatureFlagPreference( + var enableFxSuggest by lazyFeatureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_enable_fxsuggest), - default = { FxNimbus.features.fxSuggest.value().enabled }, + defaultValue = { FxNimbus.features.fxSuggest.value().enabled }, featureFlag = FeatureFlags.FX_SUGGEST, ) @@ -2427,9 +2426,9 @@ class Settings( * Indicates if the user has chosen to show sponsored search suggestions in the awesomebar. * The default value is computed lazily, and based on whether Firefox Suggest is enabled. */ - var showSponsoredSuggestions by lazyFeatureFlagPreference( + var showSponsoredSuggestions by lazyFeatureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_show_sponsored_suggestions), - default = { enableFxSuggest }, + defaultValue = { enableFxSuggest }, featureFlag = FeatureFlags.FX_SUGGEST, ) @@ -2438,9 +2437,9 @@ class Settings( * awesomebar. The default value is computed lazily, and based on whether Firefox Suggest * is enabled. */ - var showNonSponsoredSuggestions by lazyFeatureFlagPreference( + var showNonSponsoredSuggestions by lazyFeatureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_show_nonsponsored_suggestions), - default = { enableFxSuggest }, + defaultValue = { enableFxSuggest }, featureFlag = FeatureFlags.FX_SUGGEST, ) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/settings/FeatureFlagPreferenceTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/settings/FeatureFlagPreferenceTest.kt @@ -55,9 +55,9 @@ class FeatureFlagPreferenceTest { private inner class FeatureFlagHolder(featureFlag: Boolean) : PreferencesHolder { override val preferences = testPreferences - var property by featureFlagPreference( + var property by featureFlagBooleanPreference( "key", - default = false, + defaultValue = false, featureFlag = featureFlag, ) }