diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt index 0717a5bd0..8615dcfa1 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt @@ -32,6 +32,7 @@ interface SearchController { fun handleSearchShortcutEngineSelected(searchEngine: SearchEngine) fun handleClickSearchEngineSettings() fun handleExistingSessionSelected(session: Session) + fun handleSearchShortcutsButtonClicked() } class DefaultSearchController( @@ -98,6 +99,11 @@ class DefaultSearchController( context.metrics.track(Event.SearchShortcutSelected(searchEngine.name)) } + override fun handleSearchShortcutsButtonClicked() { + val isOpen = store.state.showSearchShortcuts + store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(!isOpen)) + } + override fun handleClickSearchEngineSettings() { val directions = SearchFragmentDirections.actionSearchFragmentToSearchEngineFragment() navController.navigate(directions) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt b/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt index 2e7e8b96e..e9ffc74ca 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt @@ -41,6 +41,10 @@ class SearchInteractor( searchController.handleSearchShortcutEngineSelected(searchEngine) } + override fun onSearchShortcutsButtonClicked() { + searchController.handleSearchShortcutsButtonClicked() + } + override fun onClickSearchEngineSettings() { searchController.handleClickSearchEngineSettings() } 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 bcb0f0630..99acc9bcc 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 @@ -11,6 +11,7 @@ import android.view.View import android.view.ViewGroup import androidx.core.graphics.drawable.toBitmap import kotlinx.android.extensions.LayoutContainer +import kotlinx.android.synthetic.main.fragment_search.* import mozilla.components.browser.awesomebar.BrowserAwesomeBar import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.session.Session @@ -64,6 +65,11 @@ interface AwesomeBarInteractor { * Called whenever an existing session is selected from the sessionSuggestionProvider */ fun onExistingSessionSelected(session: Session) + + /** + * Called whenever the Shortcuts button is clicked + */ + fun onSearchShortcutsButtonClicked() } /** @@ -164,10 +170,16 @@ class AwesomeBarView( interactor::onClickSearchEngineSettings ) } + + searchShortcutsButton.setOnClickListener { + interactor.onSearchShortcutsButtonClicked() + } } @SuppressWarnings("ComplexMethod") fun update(state: SearchFragmentState) { + updateSearchShortcutsIcon(state) + // Do not make suggestions based on user's current URL if (state.query == state.session?.url) { return @@ -178,17 +190,29 @@ class AwesomeBarView( view.onInputChanged(state.query) } + private fun updateSearchShortcutsIcon(searchState: SearchFragmentState) { + with(container.context) { + val showShortcuts = searchState.showSearchShortcuts + searchShortcutsButton?.isChecked = showShortcuts + + val color = if (showShortcuts) R.attr.contrastText else R.attr.primaryText + + searchShortcutsButton.compoundDrawables[0]?.setTint(getColorFromAttr(color)) + } + } + @Suppress("ComplexMethod") private fun updateSuggestionProvidersVisibility(state: SearchFragmentState) { val providersToAdd = mutableSetOf() val providersToRemove = mutableSetOf() if (state.showSearchShortcuts) { - providersToAdd.add(shortcutsEnginePickerProvider) - } else { - providersToRemove.add(shortcutsEnginePickerProvider) + handleDisplayShortcutsProviders() + return } + providersToRemove.add(shortcutsEnginePickerProvider) + if (state.showHistorySuggestions) { providersToAdd.add(historyStorageProvider) } else { @@ -211,12 +235,14 @@ class AwesomeBarView( } ) } else { - providersToRemove.add(when (state.searchEngineSource) { - is SearchEngineSource.Default -> defaultSearchSuggestionProvider - is SearchEngineSource.Shortcut -> createSuggestionProviderForEngine( - state.searchEngineSource.searchEngine - ) - }) + providersToRemove.add( + when (state.searchEngineSource) { + is SearchEngineSource.Default -> defaultSearchSuggestionProvider + is SearchEngineSource.Shortcut -> createSuggestionProviderForEngine( + state.searchEngineSource.searchEngine + ) + } + ) } if ((container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate == false) { @@ -240,6 +266,13 @@ class AwesomeBarView( } } + private fun handleDisplayShortcutsProviders() { + view.removeAllProviders() + providersInUse.clear() + providersInUse.add(shortcutsEnginePickerProvider) + view.addProviders(shortcutsEnginePickerProvider) + } + private fun createSuggestionProviderForEngine(engine: SearchEngine): SearchSuggestionProvider { return with(container.context) { val draw = getDrawable(R.drawable.ic_search) diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index c8962df3a..2e9f0d08d 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -156,5 +156,12 @@ android:drawableStart="@drawable/ic_qr" android:textOff="@string/search_scan_button" android:textOn="@string/search_scan_button" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9985dd3d5..e7969b993 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,8 @@ Scan + + Shortcuts Search engine settings