From 805e57c7c042b0e03c390cbc14a4db00bbc0c268 Mon Sep 17 00:00:00 2001 From: sarah541 Date: Wed, 6 Jul 2022 17:23:56 -0400 Subject: [PATCH] [components] For https://github.com/mozilla-mobile/android-components/issues/12443 - Add firefox suggest header for lib suggestions --- .../compose/browser/awesomebar/AwesomeBar.kt | 19 +++++++++++++++---- .../compose/browser/awesomebar/AwesomeBarDefaults.kt | 2 +- .../browser/awesomebar/internal/SuggestionGroup.kt | 9 ++++++++- .../browser/awesomebar/internal/Suggestions.kt | 8 +++++--- .../components/concept/awesomebar/AwesomeBar.kt | 5 +++++ .../provider/BookmarksStorageSuggestionProvider.kt | 7 ++++++- .../provider/CombinedHistorySuggestionProvider.kt | 6 ++++++ .../provider/HistoryMetadataSuggestionProvider.kt | 6 ++++++ .../provider/HistoryStorageSuggestionProvider.kt | 6 ++++++ .../awesomebar/provider/SessionSuggestionProvider.kt | 7 ++++++- .../syncedtabs/SyncedTabsStorageSuggestionProvider.kt | 8 ++++++-- 11 files changed, 70 insertions(+), 13 deletions(-) diff --git a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBar.kt b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBar.kt index cad4d13fb365..b02f8ce4e362 100644 --- a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBar.kt +++ b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBar.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag @@ -41,10 +40,22 @@ fun AwesomeBar( onScroll: () -> Unit = {}, profiler: Profiler? = null ) { - val groups = remember(providers) { - listOf( + val mapTitlesToProviders = HashMap>() + for (provider in providers) { + var groupedProviders: ArrayList? = + mapTitlesToProviders[provider.groupTitle()] + if (groupedProviders == null) { + groupedProviders = ArrayList() + } + groupedProviders.add(provider) + mapTitlesToProviders[provider.groupTitle()] = groupedProviders + } + val groups: ArrayList = ArrayList() + for (item in mapTitlesToProviders) { + groups.add( AwesomeBar.SuggestionProviderGroup( - providers = providers + providers = item.value, + title = item.key ) ) } diff --git a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBarDefaults.kt b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBarDefaults.kt index db4bdc4234c7..951d3f3ec321 100644 --- a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBarDefaults.kt +++ b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/AwesomeBarDefaults.kt @@ -28,7 +28,7 @@ object AwesomeBarDefaults { alpha = ContentAlpha.medium ), autocompleteIcon: Color = MaterialTheme.colors.onSurface, - groupTitle: Color = MaterialTheme.colors.primary + groupTitle: Color = MaterialTheme.colors.onBackground, ) = AwesomeBarColors( background, title, diff --git a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/SuggestionGroup.kt b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/SuggestionGroup.kt index 103060ecf315..a5e90b8e2ed2 100644 --- a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/SuggestionGroup.kt +++ b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/SuggestionGroup.kt @@ -4,11 +4,13 @@ package mozilla.components.compose.browser.awesomebar.internal +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import mozilla.components.compose.browser.awesomebar.AwesomeBarColors /** @@ -23,6 +25,11 @@ internal fun SuggestionGroup( title, color = colors.groupTitle, modifier = Modifier - .padding(4.dp) + .padding( + vertical = 24.dp, + horizontal = 16.dp + ) + .fillMaxWidth(), + fontSize = 14.sp, ) } diff --git a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/Suggestions.kt b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/Suggestions.kt index 8e7ea9dddb02..fd25f9a594b5 100644 --- a/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/Suggestions.kt +++ b/mobile/android/android-components/components/compose/awesomebar/src/main/java/mozilla/components/compose/browser/awesomebar/internal/Suggestions.kt @@ -37,9 +37,11 @@ internal fun Suggestions( ) { suggestions.forEach { (group, suggestions) -> - group.title?.let { title -> - item(group.id) { - SuggestionGroup(title, colors) + if (suggestions.isNotEmpty()) { + group.title?.let { title -> + item(group.id) { + SuggestionGroup(title, colors) + } } } diff --git a/mobile/android/android-components/components/concept/awesomebar/src/main/java/mozilla/components/concept/awesomebar/AwesomeBar.kt b/mobile/android/android-components/components/concept/awesomebar/src/main/java/mozilla/components/concept/awesomebar/AwesomeBar.kt index 708aea14f623..fb1105ffa7ea 100644 --- a/mobile/android/android-components/components/concept/awesomebar/src/main/java/mozilla/components/concept/awesomebar/AwesomeBar.kt +++ b/mobile/android/android-components/components/concept/awesomebar/src/main/java/mozilla/components/concept/awesomebar/AwesomeBar.kt @@ -153,6 +153,11 @@ interface AwesomeBar { val id: String /** + * A header title for grouping the suggestions. + **/ + fun groupTitle(): String? = null + + /** * Fired when the user starts interacting with the awesome bar by entering text in the toolbar. * * The provider has the option to return an initial list of suggestions that will be displayed before the diff --git a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/BookmarksStorageSuggestionProvider.kt b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/BookmarksStorageSuggestionProvider.kt index 2885b2b9cb05..92097814d1e0 100644 --- a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/BookmarksStorageSuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/BookmarksStorageSuggestionProvider.kt @@ -31,6 +31,7 @@ private const val BOOKMARKS_SUGGESTION_LIMIT = 20 * @param engine optional [Engine] instance to call [Engine.speculativeConnect] for the * highest scored suggestion URL. * @param showEditSuggestion optional parameter to specify if the suggestion should show the edit button + * @param suggestionsHeader optional parameter to specify if the suggestion should have a header */ class BookmarksStorageSuggestionProvider( private val bookmarksStorage: BookmarksStorage, @@ -39,10 +40,14 @@ class BookmarksStorageSuggestionProvider( private val indicatorIcon: Drawable? = null, private val engine: Engine? = null, private val showEditSuggestion: Boolean = true, + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { - override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List { if (text.isEmpty()) { return emptyList() diff --git a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/CombinedHistorySuggestionProvider.kt b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/CombinedHistorySuggestionProvider.kt index 78b210c1f936..ed565459b28a 100644 --- a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/CombinedHistorySuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/CombinedHistorySuggestionProvider.kt @@ -41,6 +41,7 @@ const val DEFAULT_COMBINED_SUGGESTION_LIMIT = 5 * @param maxNumberOfSuggestions optional parameter to specify the maximum number of returned suggestions, * defaults to [DEFAULT_COMBINED_SUGGESTION_LIMIT]. * @param showEditSuggestion optional parameter to specify if the suggestion should show the edit button + * @param suggestionsHeader optional parameter to specify if the suggestion should have a header */ @Suppress("LongParameterList") class CombinedHistorySuggestionProvider( @@ -51,9 +52,14 @@ class CombinedHistorySuggestionProvider( internal val engine: Engine? = null, @VisibleForTesting internal var maxNumberOfSuggestions: Int = DEFAULT_COMBINED_SUGGESTION_LIMIT, private val showEditSuggestion: Boolean = true, + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List = coroutineScope { if (text.isBlank()) { return@coroutineScope emptyList() diff --git a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryMetadataSuggestionProvider.kt b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryMetadataSuggestionProvider.kt index 5a18fbcb48d1..fd4b6fc7eb0c 100644 --- a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryMetadataSuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryMetadataSuggestionProvider.kt @@ -35,6 +35,7 @@ const val DEFAULT_METADATA_SUGGESTION_LIMIT = 5 * @param maxNumberOfSuggestions optional parameter to specify the maximum number of returned suggestions, * defaults to [DEFAULT_METADATA_SUGGESTION_LIMIT]. * @param showEditSuggestion optional parameter to specify if the suggestion should show the edit button + * @param suggestionsHeader optional parameter to specify if the suggestion should have a header */ class HistoryMetadataSuggestionProvider( private val historyStorage: HistoryMetadataStorage, @@ -43,9 +44,14 @@ class HistoryMetadataSuggestionProvider( internal val engine: Engine? = null, @VisibleForTesting internal val maxNumberOfSuggestions: Int = DEFAULT_METADATA_SUGGESTION_LIMIT, private val showEditSuggestion: Boolean = true, + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List { if (text.isNullOrBlank()) { return emptyList() diff --git a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryStorageSuggestionProvider.kt b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryStorageSuggestionProvider.kt index dcd083d97dc3..7bab35367eb9 100644 --- a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryStorageSuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/HistoryStorageSuggestionProvider.kt @@ -35,6 +35,7 @@ const val DEFAULT_HISTORY_SUGGESTION_LIMIT = 20 * @param maxNumberOfSuggestions optional parameter to specify the maximum number of returned suggestions, * defaults to [DEFAULT_HISTORY_SUGGESTION_LIMIT] * @param showEditSuggestion optional parameter to specify if the suggestion should show the edit button + * @param suggestionsHeader optional parameter to specify if the suggestion should have a header */ class HistoryStorageSuggestionProvider( private val historyStorage: HistoryStorage, @@ -43,10 +44,15 @@ class HistoryStorageSuggestionProvider( internal val engine: Engine? = null, @VisibleForTesting internal var maxNumberOfSuggestions: Int = DEFAULT_HISTORY_SUGGESTION_LIMIT, private val showEditSuggestion: Boolean = true, + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List { if (text.isEmpty()) { return emptyList() diff --git a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/SessionSuggestionProvider.kt b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/SessionSuggestionProvider.kt index 1d87b2221abd..777d6eb95a90 100644 --- a/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/SessionSuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/awesomebar/src/main/java/mozilla/components/feature/awesomebar/provider/SessionSuggestionProvider.kt @@ -30,10 +30,15 @@ class SessionSuggestionProvider( private val selectTabUseCase: TabsUseCases.SelectTabUseCase, private val icons: BrowserIcons? = null, private val indicatorIcon: Drawable? = null, - private val excludeSelectedSession: Boolean = false + private val excludeSelectedSession: Boolean = false, + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List { if (text.isEmpty()) { return emptyList() diff --git a/mobile/android/android-components/components/feature/syncedtabs/src/main/java/mozilla/components/feature/syncedtabs/SyncedTabsStorageSuggestionProvider.kt b/mobile/android/android-components/components/feature/syncedtabs/src/main/java/mozilla/components/feature/syncedtabs/SyncedTabsStorageSuggestionProvider.kt index f4085637762c..540f57bea302 100644 --- a/mobile/android/android-components/components/feature/syncedtabs/src/main/java/mozilla/components/feature/syncedtabs/SyncedTabsStorageSuggestionProvider.kt +++ b/mobile/android/android-components/components/feature/syncedtabs/src/main/java/mozilla/components/feature/syncedtabs/SyncedTabsStorageSuggestionProvider.kt @@ -23,11 +23,15 @@ class SyncedTabsStorageSuggestionProvider( private val syncedTabs: SyncedTabsStorage, private val loadUrlUseCase: SessionUseCases.LoadUrlUseCase, private val icons: BrowserIcons? = null, - private val deviceIndicators: DeviceIndicators = DeviceIndicators() + private val deviceIndicators: DeviceIndicators = DeviceIndicators(), + private val suggestionsHeader: String? = null, ) : AwesomeBar.SuggestionProvider { - override val id: String = UUID.randomUUID().toString() + override fun groupTitle(): String? { + return suggestionsHeader + } + override suspend fun onInputChanged(text: String): List { if (text.isEmpty()) { return emptyList() -- 2.11.4.GIT