diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 15872282a..115a8a85e 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -93,9 +93,12 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { val context = requireContext() val components = context.components - initTabStrip() + val isTabletAndTabStripEnabled = context.settings().isTabletAndTabStripEnabled + if (isTabletAndTabStripEnabled) { + initTabStrip() + } - if (context.settings().isSwipeToolbarToSwitchTabsEnabled) { + if (!isTabletAndTabStripEnabled && context.settings().isSwipeToolbarToSwitchTabsEnabled) { binding.gestureLayout.addGestureListener( ToolbarGestureHandler( activity = requireActivity(), @@ -246,10 +249,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } private fun initTabStrip() { - if (!resources.getBoolean(R.bool.tablet)) { - return - } - binding.tabStripView.isVisible = true binding.tabStripView.apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 5f61e7cd7..5d9270121 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -579,7 +579,9 @@ class HomeFragment : Fragment() { ) toolbarView?.build() - initTabStrip() + if (requireContext().settings().isTabletAndTabStripEnabled) { + initTabStrip() + } PrivateBrowsingButtonView(binding.privateBrowsingButton, browsingModeManager) { newMode -> sessionControlInteractor.onPrivateModeButtonClicked(newMode) @@ -658,10 +660,6 @@ class HomeFragment : Fragment() { } private fun initTabStrip() { - if (!resources.getBoolean(R.bool.tablet)) { - return - } - binding.tabStripView.isVisible = true binding.tabStripView.apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) diff --git a/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt b/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt index b36403040..3c556f7b4 100644 --- a/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt @@ -66,7 +66,7 @@ class ToolbarView( gravity = Gravity.TOP } - val isTabletAndTabStripEnabled = context.resources.getBoolean(R.bool.tablet) + val isTabletAndTabStripEnabled = context.settings().isTabletAndTabStripEnabled ConstraintSet().apply { clone(binding.toolbarLayout) clear(binding.bottomBar.id, ConstraintSet.BOTTOM) diff --git a/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt index fb1d26a6d..9f5d6b6d0 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt @@ -10,7 +10,9 @@ import android.os.Build.VERSION.SDK_INT import android.os.Bundle import androidx.appcompat.app.AppCompatDelegate import androidx.preference.Preference +import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreference import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.AppTheme @@ -51,8 +53,19 @@ class CustomizationFragment : PreferenceFragmentCompat() { bindLightTheme() bindAutoBatteryTheme() setupRadioGroups() - setupToolbarCategory() - setupGesturesCategory() + val tabletAndTabStripEnabled = requireContext().settings().isTabletAndTabStripEnabled + if (tabletAndTabStripEnabled) { + val preferenceScreen: PreferenceScreen = + requirePreference(R.string.pref_key_customization_preference_screen) + val toolbarPrefCategory: PreferenceCategory = + requirePreference(R.string.pref_key_customization_category_toolbar) + preferenceScreen.removePreference(toolbarPrefCategory) + } else { + setupToolbarCategory() + } + // if tab strip is enabled, swipe toolbar to switch tabs should not be enabled so the + // preference is not shown + setupGesturesCategory(isSwipeToolbarToSwitchTabsVisible = !tabletAndTabStripEnabled) } private fun setupRadioGroups() { @@ -140,7 +153,7 @@ class CustomizationFragment : PreferenceFragmentCompat() { addToRadioGroup(topPreference, bottomPreference) } - private fun setupGesturesCategory() { + private fun setupGesturesCategory(isSwipeToolbarToSwitchTabsVisible: Boolean) { requirePreference(R.string.pref_key_website_pull_to_refresh).apply { isVisible = FeatureFlags.pullToRefreshEnabled isChecked = context.settings().isPullToRefreshEnabledInBrowser @@ -152,6 +165,7 @@ class CustomizationFragment : PreferenceFragmentCompat() { } requirePreference(R.string.pref_key_swipe_toolbar_switch_tabs).apply { isChecked = context.settings().isSwipeToolbarToSwitchTabsEnabled + isVisible = isSwipeToolbarToSwitchTabsVisible onPreferenceChangeListener = SharedPreferenceUpdater() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 2d91285fe..7d7d4108c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -122,6 +122,8 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { } } + setupTabStripPreference() + // for performance reasons, this is only available in Nightly or Debug builds requirePreference(R.string.pref_key_custom_glean_server_url).apply { isVisible = Config.channel.isNightlyOrDebug && BuildConfig.GLEAN_CUSTOM_URL.isNullOrEmpty() @@ -138,6 +140,14 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { } } + private fun setupTabStripPreference() { + requirePreference(R.string.pref_key_enable_tab_strip).apply { + isVisible = Config.channel.isNightlyOrDebug && context.resources.getBoolean(R.bool.tablet) + isChecked = context.settings().isTabStripEnabled + onPreferenceChangeListener = SharedPreferenceUpdater() + } + } + override fun onPreferenceTreeClick(preference: Preference): Boolean { when (preference.key) { getString(R.string.pref_key_custom_sponsored_stories_parameters) -> 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 957741fab..b978ae339 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -857,6 +857,17 @@ class Settings(private val appContext: Context) : PreferencesHolder { private val isTablet: Boolean get() = appContext.resources.getBoolean(R.bool.tablet) + /** + * Indicates if the user has enabled the tab strip feature. + */ + val isTabStripEnabled by booleanPreference( + key = appContext.getPreferenceKey(R.string.pref_key_enable_tab_strip), + default = false, + ) + + val isTabletAndTabStripEnabled: Boolean + get() = isTablet && isTabStripEnabled + var lastKnownMode: BrowsingMode = BrowsingMode.Normal get() { val lastKnownModeWasPrivate = preferences.getBoolean( @@ -925,7 +936,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) val toolbarPosition: ToolbarPosition - get() = if (isTablet) { + get() = if (isTabletAndTabStripEnabled) { ToolbarPosition.TOP } else if (shouldUseBottomToolbar) { ToolbarPosition.BOTTOM diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 6c1615556..0db2c3d73 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -78,6 +78,7 @@ pref_key_suggest_strong_password_enabled pref_key_enable_debug_drawer pref_key_show_first_time_translation + pref_key_enable_tab_strip pref_key_telemetry @@ -155,12 +156,14 @@ pref_key_follow_device_theme + pref_key_customization_preference_screen pref_key_website_pull_to_refresh pref_key_dynamic_toolbar pref_key_swipe_toolbar_switch_tabs pref_key_swipe_toolbar_show_tabs pref_key_recent_tabs pref_key_recent_bookmarks + pref_key_customization_category_toolbar pref_key_https_only_settings diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 6432c5bed..649bfb5ae 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -78,6 +78,8 @@ Enable Felt Privacy Enable Debug Drawer + + Enable Tab Strip Make inactive diff --git a/app/src/main/res/xml/customization_preferences.xml b/app/src/main/res/xml/customization_preferences.xml index cfd13f3aa..f1e1ea05e 100644 --- a/app/src/main/res/xml/customization_preferences.xml +++ b/app/src/main/res/xml/customization_preferences.xml @@ -3,7 +3,8 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + xmlns:app="http://schemas.android.com/apk/res-auto" + android:key="@string/pref_key_customization_preference_screen" > +