diff --git a/CHANGELOG.md b/CHANGELOG.md index 45ee54085..758e885d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- #3695 - Made search suggestions for other tabs clickable + +## [1.1.0 and earlier] - 2019-07-23 +### Added - #2770 - Added ability to receive tabs from other FxA devices - #919 - Enabled bookmark synchronization - #916 - Added the ability to save and delete bookmarks 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 36ce341ad..b3d749e31 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchInteractor.kt @@ -7,11 +7,15 @@ package org.mozilla.fenix.search import android.content.Context import androidx.navigation.NavController import mozilla.components.browser.search.SearchEngine +import mozilla.components.browser.session.Session import mozilla.components.support.ktx.kotlin.isUrl import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.metrics +import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.searchEngineManager import org.mozilla.fenix.search.awesomebar.AwesomeBarInteractor import org.mozilla.fenix.search.toolbar.ToolbarInteractor @@ -25,6 +29,7 @@ class SearchInteractor( private val navController: NavController, private val store: SearchStore ) : AwesomeBarInteractor, ToolbarInteractor { + override fun onUrlCommitted(url: String) { if (url.isNotBlank()) { (context as HomeActivity).openToBrowserAndLoad( @@ -85,6 +90,12 @@ class SearchInteractor( navController.navigate(directions) } + override fun onExistingSessionSelected(session: Session) { + val directions = SearchFragmentDirections.actionSearchFragmentToBrowserFragment(null) + navController.nav(R.id.searchFragment, directions) + context.components.core.sessionManager.select(session) + } + private fun createSearchEvent(engine: SearchEngine, isSuggestion: Boolean): Event.PerformedSearch { val isShortcut = engine != context.searchEngineManager.defaultSearchEngine 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 3ff1f839c..2de2644e6 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 @@ -13,14 +13,16 @@ import androidx.core.graphics.drawable.toBitmap import kotlinx.android.extensions.LayoutContainer import mozilla.components.browser.awesomebar.BrowserAwesomeBar import mozilla.components.browser.search.SearchEngine +import mozilla.components.browser.session.Session import mozilla.components.concept.engine.EngineSession -import mozilla.components.feature.awesomebar.provider.SearchSuggestionProvider +import mozilla.components.feature.awesomebar.provider.BookmarksStorageSuggestionProvider import mozilla.components.feature.awesomebar.provider.ClipboardSuggestionProvider import mozilla.components.feature.awesomebar.provider.HistoryStorageSuggestionProvider -import mozilla.components.feature.awesomebar.provider.BookmarksStorageSuggestionProvider +import mozilla.components.feature.awesomebar.provider.SearchSuggestionProvider import mozilla.components.feature.awesomebar.provider.SessionSuggestionProvider import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.session.SessionUseCases +import mozilla.components.feature.tabs.TabsUseCases import org.mozilla.fenix.R import org.mozilla.fenix.ThemeManager import org.mozilla.fenix.ext.components @@ -55,6 +57,11 @@ interface AwesomeBarInteractor { * Called whenever the "Search Engine Settings" item is tapped */ fun onClickSearchEngineSettings() + + /** + * Called whenever an existing session is selected from the sessionSuggestionProvider + */ + fun onExistingSessionSelected(session: Session) } /** @@ -96,6 +103,12 @@ class AwesomeBarView( } } + private val selectTabUseCase = object : TabsUseCases.SelectTabUseCase { + override fun invoke(session: Session) { + interactor.onExistingSessionSelected(session) + } + } + init { with(container.context) { val primaryTextColor = ContextCompat.getColor( @@ -116,8 +129,9 @@ class AwesomeBarView( sessionProvider = SessionSuggestionProvider( components.core.sessionManager, - components.useCases.tabsUseCases.selectTab, - components.core.icons + selectTabUseCase, + components.core.icons, + excludeSelectedSession = true ) historyStorageProvider = diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt index 687988fea..0a2cc7733 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt @@ -4,7 +4,9 @@ package org.mozilla.fenix.search +import android.content.Context import androidx.navigation.NavController +import androidx.navigation.NavDestination import androidx.navigation.NavDirections import io.mockk.Runs import io.mockk.every @@ -13,9 +15,12 @@ import io.mockk.mockk import io.mockk.verify import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.search.SearchEngineManager +import mozilla.components.browser.session.Session import org.junit.Test import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.searchEngineManager @@ -153,4 +158,21 @@ class SearchInteractorTest { navController.navigate(SearchFragmentDirections.actionSearchFragmentToSearchEngineFragment()) } } + + @Test + fun onExistingSessionSelected() { + val navController: NavController = mockk(relaxed = true) + every { navController.currentDestination } returns NavDestination("").apply { id = R.id.searchFragment } + val context: Context = mockk(relaxed = true) + val applicationContext: FenixApplication = mockk(relaxed = true) + every { context.applicationContext } returns applicationContext + val interactor = SearchInteractor(context, navController, mockk()) + val session = Session("http://mozilla.org", false) + + interactor.onExistingSessionSelected(session) + + verify { + navController.navigate(SearchFragmentDirections.actionSearchFragmentToBrowserFragment(null)) + } + } }