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 1823cf1e66..4394bc40cf 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -53,5 +53,11 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { isChecked = context.settings().nimbusUsePreview onPreferenceChangeListener = SharedPreferenceUpdater() } + + requirePreference(R.string.pref_key_enable_task_continuity).apply { + isVisible = true + isChecked = context.settings().enableTaskContinuityEnhancements + onPreferenceChangeListener = SharedPreferenceUpdater() + } } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt index feff5c5d7e..e1fc53c349 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt @@ -6,14 +6,15 @@ package org.mozilla.fenix.tabstray.ext import mozilla.components.browser.storage.sync.SyncedDeviceTabs import mozilla.components.browser.toolbar.MAX_URI_LENGTH -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListItem /** * Converts a list of [SyncedDeviceTabs] into a list of [SyncedTabsListItem]. */ -fun List.toComposeList(): List = asSequence().flatMap { (device, tabs) -> - if (FeatureFlags.taskContinuityFeature) { +fun List.toComposeList( + taskContinuityEnabled: Boolean, +): List = asSequence().flatMap { (device, tabs) -> + if (taskContinuityEnabled) { val deviceTabs = if (tabs.isEmpty()) { emptyList() } else { diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt index 943ac064b0..d1bd538245 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt @@ -48,7 +48,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import mozilla.components.browser.storage.sync.TabEntry import mozilla.components.feature.syncedtabs.view.SyncedTabsView -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.compose.PrimaryText import org.mozilla.fenix.compose.SecondaryText @@ -63,14 +62,18 @@ import mozilla.components.browser.storage.sync.Tab as SyncTab */ @OptIn(ExperimentalFoundationApi::class) @Composable -fun SyncedTabsList(syncedTabs: List, onTabClick: (SyncTab) -> Unit) { +fun SyncedTabsList( + syncedTabs: List, + taskContinuityEnabled: Boolean, + onTabClick: (SyncTab) -> Unit, +) { val listState = rememberLazyListState() LazyColumn( modifier = Modifier.fillMaxSize(), state = listState, ) { - if (FeatureFlags.taskContinuityFeature) { + if (taskContinuityEnabled) { syncedTabs.forEach { syncedTabItem -> when (syncedTabItem) { is SyncedTabsListItem.DeviceSection -> { @@ -341,7 +344,8 @@ private fun SyncedTabsListPreview() { FirefoxTheme { Box(Modifier.background(FirefoxTheme.colors.layer1)) { SyncedTabsList( - getFakeSyncedTabList(), + syncedTabs = getFakeSyncedTabList(), + taskContinuityEnabled = true, ) { println("Tab clicked") } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt index 0ee3b7daf4..b1acd09f38 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt @@ -17,6 +17,7 @@ import mozilla.components.support.base.observer.Observable import mozilla.components.support.base.observer.ObserverRegistry import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.tabstray.FloatingActionButtonBinding import org.mozilla.fenix.tabstray.TabsTrayAction import org.mozilla.fenix.tabstray.TabsTrayStore @@ -90,7 +91,13 @@ class SyncedTabsIntegration( } override fun displaySyncedTabs(syncedTabs: List) { - store.dispatch(TabsTrayAction.UpdateSyncedTabs(syncedTabs.toComposeList())) + store.dispatch( + TabsTrayAction.UpdateSyncedTabs( + syncedTabs.toComposeList( + context.settings().enableTaskContinuityEnhancements + ) + ) + ) } /** diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt index 6a47956906..c29d1e5eac 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt @@ -8,6 +8,7 @@ import android.view.View import androidx.compose.ui.platform.ComposeView import androidx.recyclerview.widget.RecyclerView import mozilla.components.lib.state.ext.observeAsComposableState +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.tabstray.NavigationInteractor import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayState @@ -33,7 +34,8 @@ class SyncedTabsPageViewHolder( FirefoxTheme { SyncedTabsList( syncedTabs = tabs ?: emptyList(), - onTabClick = navigationInteractor::onSyncedTabClicked + taskContinuityEnabled = composeView.context.settings().enableTaskContinuityEnhancements, + onTabClick = navigationInteractor::onSyncedTabClicked, ) } } 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 20f830f76f..22180753ba 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1299,4 +1299,13 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = false, featureFlag = FeatureFlags.contileFeature, ) + + /** + * Indicates if the Task Continuity enhancements are enabled. + */ + var enableTaskContinuityEnhancements by featureFlagPreference( + key = appContext.getPreferenceKey(R.string.pref_key_enable_task_continuity), + default = false, + featureFlag = FeatureFlags.taskContinuityFeature, + ) } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index f62d014aa0..5eca23ac85 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -204,6 +204,8 @@ pref_key_top_frecent_sites pref_key_enable_contile + + pref_key_enable_task_continuity pref_key_user_knows_about_pwa diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 0296822828..77f76c6975 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -43,6 +43,8 @@ Nimbus Experiments Use Nimbus Preview Collection (requires restart) + + Enable Task Continuity Make inactive diff --git a/app/src/main/res/xml/secret_settings_preferences.xml b/app/src/main/res/xml/secret_settings_preferences.xml index 5f828e8dfe..af9cbcb612 100644 --- a/app/src/main/res/xml/secret_settings_preferences.xml +++ b/app/src/main/res/xml/secret_settings_preferences.xml @@ -25,4 +25,9 @@ android:key="@string/pref_key_nimbus_use_preview" android:title="@string/preferences_nimbus_use_preview_collection" app:iconSpaceReserved="false" /> + diff --git a/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt b/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt index bac8eae37e..ea5ad0d834 100644 --- a/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt @@ -82,7 +82,7 @@ class SyncedDeviceTabsTest { @Test fun `GIVEN two synced devices WHEN the compose list is generated THEN two device section is returned`() { val syncedDeviceList = listOf(oneTabDevice, twoTabDevice) - val listData = syncedDeviceList.toComposeList() + val listData = syncedDeviceList.toComposeList(taskContinuityEnabled = true) assertEquals(2, listData.count()) assertTrue(listData[0] is SyncedTabsListItem.DeviceSection) @@ -94,7 +94,7 @@ class SyncedDeviceTabsTest { @Test fun `GIVEN one synced device with no tabs WHEN the compose list is generated THEN one device with an empty tabs list is returned`() { val syncedDeviceList = listOf(noTabDevice) - val listData = syncedDeviceList.toComposeList() + val listData = syncedDeviceList.toComposeList(taskContinuityEnabled = true) assertEquals(1, listData.count()) assertTrue(listData[0] is SyncedTabsListItem.DeviceSection)