commit 1d293fda8b4d2e823ff345f28a4c29c20918946e parent 69f55982c0aa8f82864fd0a7435204232b802fc8 Author: t-p-white <towhite@mozilla.com> Date: Wed, 10 Dec 2025 22:28:08 +0000 Bug 1997011 - Add secret setting to enable persistent onboarding. r=android-reviewers,joberhauser Differential Revision: https://phabricator.services.mozilla.com/D275796 Diffstat:
6 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -434,6 +434,11 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { isChecked = context.settings().isRelayFeatureEnabled onPreferenceChangeListener = SharedPreferenceUpdater() } + + requirePreference<SwitchPreference>(R.string.pref_key_enable_persistent_onboarding).apply { + isChecked = context.settings().enablePersistentOnboarding + onPreferenceChangeListener = SharedPreferenceUpdater() + } } override fun onPreferenceTreeClick(preference: Preference): Boolean { 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 @@ -2140,15 +2140,30 @@ class Settings( hasUserBeenOnboarded: Boolean, isLauncherIntent: Boolean, ): Boolean { - return if (featureEnabled && !hasUserBeenOnboarded && isLauncherIntent) { + val shouldShowByDefaultConditions = featureEnabled && !hasUserBeenOnboarded && isLauncherIntent + + val shouldShow = shouldShowByDefaultConditions || enablePersistentOnboarding + + if (shouldShow) { FxNimbus.features.junoOnboarding.recordExposure() - true - } else { - false } + + return shouldShow } /** + * Secret setting preference that forces the onboarding flow to be shown every time `HomeActivity` + * is created. When `true`, onboarding is displayed on each launch; when `false`, onboarding is only + * shown based on the default conditions. + * + * Build specific onboarding cards configuration (as defined in `onboarding.yaml.fml`) still applies. + */ + var enablePersistentOnboarding by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_enable_persistent_onboarding), + default = false, + ) + + /** * Indicates if the onboarding feature is enabled. */ var onboardingFeatureEnabled = FeatureFlags.onboardingFeatureEnabled diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml @@ -452,6 +452,7 @@ <string name="pref_key_enable_lna_feature_enabled" translatable="false">pref_key_enable_lna_feature_enabled</string> <string name="pref_key_enable_isolated_process" translatable="false">pref_key_enable_isolated_process</string> <string name="pref_key_enable_app_zygote_process" translatable="false">pref_key_enable_app_zygote_process</string> + <string name="pref_key_enable_persistent_onboarding" translatable="false">pref_key_enable_persistent_onboarding</string> <!-- Logins --> <string name="pref_key_enable_compose_logins" translatable="false">pref_key_enable_compose_logins</string> diff --git a/mobile/android/fenix/app/src/main/res/values/static_strings.xml b/mobile/android/fenix/app/src/main/res/values/static_strings.xml @@ -115,6 +115,8 @@ <string name="preferences_debug_settings_settings_search" translatable="false">Enable Settings Search</string> <!-- Label for enabling the DNS over HTTPS settings --> <string name="preferences_debug_settings_enable_doh_settings" translatable="false">Enable DNS over HTTPS settings</string> + <!-- Label for enabling the persistent onboarding --> + <string name="preferences_debug_settings_enable_persistent_onboarding" translatable="false">Show onboarding on each app cold open</string> <!-- Label for toggling the Tab Manager enhancements --> <string name="preferences_tab_manager_enhancements" translatable="false">Enable Tab Manager enhancements</string> diff --git a/mobile/android/fenix/app/src/main/res/xml/secret_settings_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/secret_settings_preferences.xml @@ -174,4 +174,8 @@ android:key="@string/pref_key_enable_relay_email_masks" android:title="@string/preferences_enable_relay_email_masks" app:iconSpaceReserved="false" /> + <SwitchPreference + android:key="@string/pref_key_enable_persistent_onboarding" + android:title="@string/preferences_debug_settings_enable_persistent_onboarding" + app:iconSpaceReserved="false" /> </PreferenceScreen> diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/utils/SettingsTest.kt @@ -914,6 +914,20 @@ class SettingsTest { } @Test + fun `GIVEN should not show by default WHEN enablePersistentOnboarding is true THEN shouldShowOnboarding returns true`() { + val settings = spyk(settings) + every { settings.enablePersistentOnboarding } returns true + + val actual = settings.shouldShowOnboarding( + featureEnabled = false, + hasUserBeenOnboarded = true, + isLauncherIntent = false, + ) + + assertTrue(actual) + } + + @Test fun `GIVEN Https-only mode is disabled THEN the engine mode is HttpsOnlyMode#DISABLED`() { settings.shouldUseHttpsOnly = false