Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -410,6 +411,9 @@ class Components(private val context: Context) {
additionalProviders = listOf(
DataChoicesSearchProvider,
AIControlsSearchProvider,
PageSummariesSettingsSearchProvider(
summarizationFeatureConfiguration = core.summarizeFeatureSettings,
),
),
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<SettingsSearchItem> {
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"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -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",
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down