From a09314f3a64e7d72033b01f35f44705a83e4cb6d Mon Sep 17 00:00:00 2001 From: Segun Famisa Date: Mon, 27 Apr 2026 16:27:10 +0200 Subject: [PATCH] Bug 2034227 - Add "Page summaries" to settings search --- .../mozilla/fenix/components/Components.kt | 4 + .../PageSummariesSettingsSearchProvider.kt | 74 +++++++++++++++++++ .../PreferenceFileInformation.kt | 11 +++ .../FenixSummarizationFeatureConfiguration.kt | 5 +- ...marizationFeatureDiscoveryConfiguration.kt | 6 ++ ...PageSummariesSettingsSearchProviderTest.kt | 64 ++++++++++++++++ .../FakeSummarizationFeatureConfiguration.kt | 1 + 7 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProvider.kt create mode 100644 mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProviderTest.kt diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt index d214469c116e5..1c1e68e848359 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -91,6 +91,7 @@ import org.mozilla.fenix.reviewprompt.ReviewPromptMiddleware import org.mozilla.fenix.search.VoiceSearchAIControlFeature import org.mozilla.fenix.settings.ai.AIControlsSearchProvider import org.mozilla.fenix.settings.datachoices.DataChoicesSearchProvider +import org.mozilla.fenix.settings.pagesummaries.PageSummariesSettingsSearchProvider import org.mozilla.fenix.settings.settingssearch.DefaultFenixSettingsIndexer import org.mozilla.fenix.termsofuse.TermsOfUseManager import org.mozilla.fenix.termsofuse.store.DefaultTermsOfUsePromptRepository @@ -410,6 +411,9 @@ class Components(private val context: Context) { additionalProviders = listOf( DataChoicesSearchProvider, AIControlsSearchProvider, + PageSummariesSettingsSearchProvider( + summarizationFeatureConfiguration = core.summarizeFeatureSettings, + ), ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProvider.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProvider.kt new file mode 100644 index 0000000000000..16ee3074e3504 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProvider.kt @@ -0,0 +1,74 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +package org.mozilla.fenix.settings.pagesummaries + +import android.content.Context +import org.mozilla.fenix.settings.settingssearch.PreferenceFileInformation +import org.mozilla.fenix.settings.settingssearch.SettingsSearchItem +import org.mozilla.fenix.settings.settingssearch.SettingsSearchProvider +import org.mozilla.fenix.summarization.onboarding.SummarizationFeatureDiscoveryConfiguration +import mozilla.components.feature.summarize.R as summariesR + +/** + * [SettingsSearchProvider] for making "Page summaries" discoverable in settings search + * + * Returns an empty list when the feature is not available, so the feature is not indexed. + */ +class PageSummariesSettingsSearchProvider( + val summarizationFeatureConfiguration: SummarizationFeatureDiscoveryConfiguration, +) : SettingsSearchProvider { + + private val preferenceFileInformation = PreferenceFileInformation.PageSummariesPreferences + + override fun getSearchItems(context: Context): List { + if (!summarizationFeatureConfiguration.isFeatureAvailable) return emptyList() + + return buildList { + add( + SettingsSearchItem( + title = context.getString(summariesR.string.mozac_summarize_settings_summarize_pages), + summary = context.getString(summariesR.string.mozac_summarize_settings_summarize_pages_cloud), + preferenceKey = Section.Feature.key, + categoryHeader = context.getString(preferenceFileInformation.categoryHeaderResourceId), + preferenceFileInformation = preferenceFileInformation, + ), + ) + add( + SettingsSearchItem( + title = context.getString(summariesR.string.mozac_summarize_settings_shake_to_summarize), + summary = context.getString( + summariesR.string.mozac_summarize_settings_shake_to_summarize_description, + ), + preferenceKey = Section.Gestures.key, + categoryHeader = context.getString(preferenceFileInformation.categoryHeaderResourceId), + preferenceFileInformation = preferenceFileInformation, + ), + ) + } + } + + /** + * Preference sections for the "Page summaries" settings + */ + private sealed interface Section { + val key: String + + /** + * The page summaries feature section + */ + data object Feature : Section { + override val key: String + get() = "PAGE_SUMMARIES_FEATURE" + } + + /** + * The page summaries gestures section + */ + data object Gestures : Section { + override val key: String + get() = "PAGE_SUMMARIES_GESTURES" + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/settingssearch/PreferenceFileInformation.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/settingssearch/PreferenceFileInformation.kt index e31d6c56601b7..6d680eb20749a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/settingssearch/PreferenceFileInformation.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/settingssearch/PreferenceFileInformation.kt @@ -194,4 +194,15 @@ sealed class PreferenceFileInformation( categoryHeaderResourceId = R.string.preferences_category_general, fragmentId = R.id.aiControlsFragment, ) + + /** + * Represents the "Page summaries" settings screen. + * This screen is compose-based and has no backing XML preference file. + */ + object PageSummariesPreferences : PreferenceFileInformation( + xmlResourceId = R.id.pageSummariesSettingsFragment, + topBreadcrumbResourceId = R.string.preferences_page_summaries, + categoryHeaderResourceId = R.string.preferences_category_general, + fragmentId = R.id.pageSummariesSettingsFragment, + ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/FenixSummarizationFeatureConfiguration.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/FenixSummarizationFeatureConfiguration.kt index e6ccca7e9574c..dea43d2f1fc42 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/FenixSummarizationFeatureConfiguration.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/FenixSummarizationFeatureConfiguration.kt @@ -20,8 +20,11 @@ class FenixSummarizationFeatureConfiguration( private val summarizationSettingsBinding: SummarizationSettingsBinding, ) : SummarizationFeatureDiscoveryConfiguration { + override val isFeatureAvailable: Boolean + get() = settings.shakeToSummarizeFeatureFlagEnabled + override val canShowFeature: Boolean - get() = settings.shakeToSummarizeFeatureFlagEnabled && summarizationSettingsBinding.isFeatureEnabled.value + get() = isFeatureAvailable && summarizationSettingsBinding.isFeatureEnabled.value override val showMenuItem: Boolean get() = canShowFeature diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/SummarizationFeatureDiscoveryConfiguration.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/SummarizationFeatureDiscoveryConfiguration.kt index 1c5005df1dc90..fd4f17909f4b0 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/SummarizationFeatureDiscoveryConfiguration.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/summarization/onboarding/SummarizationFeatureDiscoveryConfiguration.kt @@ -14,6 +14,12 @@ import kotlinx.coroutines.flow.StateFlow * and clearing it upon interaction. */ interface SummarizationFeatureDiscoveryConfiguration { + + /** + * Determines if the feature is available + */ + val isFeatureAvailable: Boolean + /** * Determines if the feature can be shown */ diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProviderTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProviderTest.kt new file mode 100644 index 0000000000000..bc97226634699 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/pagesummaries/PageSummariesSettingsSearchProviderTest.kt @@ -0,0 +1,64 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +package org.mozilla.fenix.settings.pagesummaries + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.support.test.robolectric.testContext +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.settings.summarize.FakeSummarizationFeatureConfiguration +import kotlin.test.assertEquals + +@RunWith(AndroidJUnit4::class) +class PageSummariesSettingsSearchProviderTest { + + private val fakeSummarizationFeatureConfiguration = FakeSummarizationFeatureConfiguration() + + private lateinit var provider: PageSummariesSettingsSearchProvider + + @Before + fun setUp() { + provider = PageSummariesSettingsSearchProvider( + summarizationFeatureConfiguration = fakeSummarizationFeatureConfiguration, + ) + } + + @Test + fun `GIVEN the feature is not available, no search items are returned`() { + // Given the feature is not available + fakeSummarizationFeatureConfiguration.isFeatureAvailable = false + + // When we get search items + val items = provider.getSearchItems(testContext) + + // Then assert the list is empty + assertEquals( + expected = emptyList(), + actual = items, + message = "Expected the search items to be empty", + ) + } + + @Test + fun `GIVEN the feature is available, search items are returned`() { + // Given the feature is available + fakeSummarizationFeatureConfiguration.isFeatureAvailable = true + + // When we get search items + val items = provider.getSearchItems(testContext) + val keys = items.map { it.preferenceKey } + + // Then assert the keys represent the items returned + assertEquals( + expected = listOf( + "PAGE_SUMMARIES_FEATURE", + "PAGE_SUMMARIES_GESTURES", + ), + actual = keys, + message = "Expected the search items to match the page summaries settings", + ) + } +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/summarize/FakeSummarizationFeatureConfiguration.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/summarize/FakeSummarizationFeatureConfiguration.kt index 50cd87a26653a..536c8633e3350 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/summarize/FakeSummarizationFeatureConfiguration.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/summarize/FakeSummarizationFeatureConfiguration.kt @@ -15,6 +15,7 @@ import org.mozilla.fenix.summarization.onboarding.SummarizeDiscoveryEvent class FakeSummarizationFeatureConfiguration( var expectedToolbarMenuButtonHighlight: Boolean = false, override var shouldToolbarShowCfr: Boolean = false, + override var isFeatureAvailable: Boolean = true, ) : SummarizationFeatureDiscoveryConfiguration { var menuItemExposureCount: Int = 0