diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt index 99acc9bcc..af0ffc0b4 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt @@ -91,6 +91,7 @@ class AwesomeBarView( private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider private val bookmarksStorageSuggestionProvider: BookmarksStorageSuggestionProvider private val defaultSearchSuggestionProvider: SearchSuggestionProvider + private val searchSuggestionProviderMap: MutableMap private var providersInUse = mutableSetOf() private val loadUrlUseCase = object : SessionUseCases.LoadUrlUseCase { @@ -171,12 +172,12 @@ class AwesomeBarView( ) } + searchSuggestionProviderMap = HashMap() searchShortcutsButton.setOnClickListener { interactor.onSearchShortcutsButtonClicked() } } - @SuppressWarnings("ComplexMethod") fun update(state: SearchFragmentState) { updateSearchShortcutsIcon(state) @@ -201,69 +202,99 @@ class AwesomeBarView( } } - @Suppress("ComplexMethod") private fun updateSuggestionProvidersVisibility(state: SearchFragmentState) { - val providersToAdd = mutableSetOf() - val providersToRemove = mutableSetOf() - if (state.showSearchShortcuts) { handleDisplayShortcutsProviders() return } - providersToRemove.add(shortcutsEnginePickerProvider) + val providersToAdd = getProvidersToAdd(state) + val providersToRemove = getProvidersToRemove(state) + + performProviderListChanges(providersToAdd, providersToRemove) + } + + private fun performProviderListChanges( + providersToAdd: MutableSet, + providersToRemove: MutableSet + ) { + for (provider in providersToAdd) { + if (providersInUse.find { it.id == provider.id } == null) { + providersInUse.add(provider) + view.addProviders(provider) + } + } + + for (provider in providersToRemove) { + if (providersInUse.find { it.id == provider.id } != null) { + providersInUse.remove(provider) + view.removeProviders(provider) + } + } + } + + private fun getProvidersToAdd(state: SearchFragmentState): MutableSet { + val providersToAdd = mutableSetOf() if (state.showHistorySuggestions) { providersToAdd.add(historyStorageProvider) - } else { - providersToRemove.add(historyStorageProvider) } if (state.showBookmarkSuggestions) { providersToAdd.add(bookmarksStorageSuggestionProvider) - } else { - providersToRemove.add(bookmarksStorageSuggestionProvider) } if (state.showSearchSuggestions) { - providersToAdd.add( - when (state.searchEngineSource) { - is SearchEngineSource.Default -> defaultSearchSuggestionProvider - is SearchEngineSource.Shortcut -> createSuggestionProviderForEngine( - state.searchEngineSource.searchEngine - ) - } - ) - } else { - providersToRemove.add( - when (state.searchEngineSource) { - is SearchEngineSource.Default -> defaultSearchSuggestionProvider - is SearchEngineSource.Shortcut -> createSuggestionProviderForEngine( - state.searchEngineSource.searchEngine - ) - } - ) + getSelectedSearchSuggestionProvider(state)?.let { + providersToAdd.add(it) + } } - if ((container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate == false) { + if (!isBrowsingModePrivate()) { providersToAdd.add(sessionProvider) - } else { - providersToRemove.add(sessionProvider) } - for (provider in providersToAdd) { - if (providersInUse.find { it.id == provider.id } == null) { - providersInUse.add(provider) - view.addProviders(provider) - } + return providersToAdd + } + + private fun getProvidersToRemove(state: SearchFragmentState): MutableSet { + val providersToRemove = mutableSetOf() + + providersToRemove.add(shortcutsEnginePickerProvider) + + if (!state.showHistorySuggestions) { + providersToRemove.add(historyStorageProvider) } - for (provider in providersToRemove) { - if (providersInUse.find { it.id == provider.id } != null) { - providersInUse.remove(provider) - view.removeProviders(provider) + if (!state.showBookmarkSuggestions) { + providersToRemove.add(bookmarksStorageSuggestionProvider) + } + + if (!state.showSearchSuggestions) { + getSelectedSearchSuggestionProvider(state)?.let { + providersToRemove.add(it) } } + + if (isBrowsingModePrivate()) { + providersToRemove.add(sessionProvider) + } + + return providersToRemove + } + + private fun isBrowsingModePrivate(): Boolean { + return (container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate + ?: false + } + + private fun getSelectedSearchSuggestionProvider(state: SearchFragmentState): SearchSuggestionProvider? { + return when (state.searchEngineSource) { + is SearchEngineSource.Default -> defaultSearchSuggestionProvider + is SearchEngineSource.Shortcut -> getSuggestionProviderForEngine( + state.searchEngineSource.searchEngine + ) + } } private fun handleDisplayShortcutsProviders() { @@ -273,19 +304,28 @@ class AwesomeBarView( view.addProviders(shortcutsEnginePickerProvider) } - private fun createSuggestionProviderForEngine(engine: SearchEngine): SearchSuggestionProvider { - return with(container.context) { - val draw = getDrawable(R.drawable.ic_search) - draw?.colorFilter = PorterDuffColorFilter(getColorFromAttr(R.attr.primaryText), SRC_IN) - - SearchSuggestionProvider( - components.search.searchEngineManager.getDefaultSearchEngine(this, engine.name), - shortcutSearchUseCase, - components.core.client, - limit = 3, - mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, - icon = draw?.toBitmap() - ) + private fun getSuggestionProviderForEngine(engine: SearchEngine): SearchSuggestionProvider? { + if (!searchSuggestionProviderMap.containsKey(engine)) { + with(container.context) { + val draw = getDrawable(R.drawable.ic_search) + draw?.colorFilter = + PorterDuffColorFilter(getColorFromAttr(R.attr.primaryText), SRC_IN) + + searchSuggestionProviderMap.put( + engine, SearchSuggestionProvider( + components.search.searchEngineManager.getDefaultSearchEngine( + this, + engine.name + ), + shortcutSearchUseCase, + components.core.client, + limit = 3, + mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, + icon = draw?.toBitmap() + ) + ) + } } + return searchSuggestionProviderMap[engine] } }