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:
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,
)
}