diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt index 726a733c2..028bd59cc 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.search +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -11,12 +12,15 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_search.view.* +import mozilla.components.feature.search.SearchUseCases +import mozilla.components.feature.session.SessionUseCases import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.toolbar.SearchAction import org.mozilla.fenix.components.toolbar.SearchState import org.mozilla.fenix.components.toolbar.ToolbarComponent import org.mozilla.fenix.components.toolbar.ToolbarUIView +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable @@ -24,19 +28,20 @@ import org.mozilla.fenix.mvi.getManagedEmitter import org.mozilla.fenix.search.awesomebar.AwesomeBarAction import org.mozilla.fenix.search.awesomebar.AwesomeBarChange import org.mozilla.fenix.search.awesomebar.AwesomeBarComponent -import org.mozilla.fenix.search.awesomebar.AwesomeBarState class SearchFragment : Fragment() { private lateinit var toolbarComponent: ToolbarComponent private lateinit var awesomeBarComponent: AwesomeBarComponent + private var sessionId: String? = null + private var isPrivate = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val sessionId = SearchFragmentArgs.fromBundle(arguments!!).sessionId - val isPrivate = (activity as HomeActivity).browsingModeManager.isPrivate + sessionId = SearchFragmentArgs.fromBundle(arguments!!).sessionId + isPrivate = (activity as HomeActivity).browsingModeManager.isPrivate val view = inflater.inflate(R.layout.fragment_search, container, false) val url = sessionId?.let { requireComponents.core.sessionManager.findSessionById(it)?.let { @@ -51,10 +56,7 @@ class SearchFragment : Fragment() { isPrivate, SearchState(url, isEditing = true) ) - awesomeBarComponent = AwesomeBarComponent( - view.search_layout, ActionBusFactory.get(this), - AwesomeBarState("", sessionId == null, isPrivate) - ) + awesomeBarComponent = AwesomeBarComponent(view.search_layout, ActionBusFactory.get(this)) ActionBusFactory.get(this).logMergedObservables() return view } @@ -93,12 +95,43 @@ class SearchFragment : Fragment() { getAutoDisposeObservable() .subscribe { when (it) { - is AwesomeBarAction.ItemSelected -> { - requireComponents.core.sessionManager.selectedSession?.let { session -> - (activity as HomeActivity).openToBrowser(session.id) - } + is AwesomeBarAction.URLTapped -> { + getSessionUseCase(requireContext(), sessionId == null).invoke(it.url) + navigateToBrowser() + } + is AwesomeBarAction.SearchTermsTapped -> { + getSearchUseCase(requireContext(), sessionId == null).invoke(it.searchTerms) + navigateToBrowser() } } } } + + private fun navigateToBrowser() { + requireComponents.core.sessionManager.selectedSession?.apply { + (activity as HomeActivity).openToBrowser(sessionId) + } + } + + private fun getSearchUseCase(context: Context, useNewTab: Boolean): SearchUseCases.SearchUseCase { + if (!useNewTab) { + return context.components.useCases.searchUseCases.defaultSearch + } + + return when (isPrivate) { + true -> context.components.useCases.searchUseCases.newPrivateTabSearch + false -> context.components.useCases.searchUseCases.newTabSearch + } + } + + private fun getSessionUseCase(context: Context, useNewTab: Boolean): SessionUseCases.LoadUrlUseCase { + if (!useNewTab) { + return context.components.useCases.sessionUseCases.loadUrl + } + + return when (isPrivate) { + true -> context.components.useCases.tabsUseCases.addPrivateTab + false -> context.components.useCases.tabsUseCases.addTab + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComponent.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComponent.kt index d24092ea7..80c4574b7 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarComponent.kt @@ -11,10 +11,11 @@ import org.mozilla.fenix.mvi.Reducer import org.mozilla.fenix.mvi.UIComponent import org.mozilla.fenix.mvi.ViewState -data class AwesomeBarState(val query: String, val useNewTab: Boolean = false, val isPrivate: Boolean) : ViewState +data class AwesomeBarState(val query: String) : ViewState sealed class AwesomeBarAction : Action { - object ItemSelected : AwesomeBarAction() + data class URLTapped(val url: String) : AwesomeBarAction() + data class SearchTermsTapped(val searchTerms: String) : AwesomeBarAction() } sealed class AwesomeBarChange : Change { @@ -24,7 +25,7 @@ sealed class AwesomeBarChange : Change { class AwesomeBarComponent( private val container: ViewGroup, bus: ActionBusFactory, - override var initialState: AwesomeBarState = AwesomeBarState("", isPrivate = false) + override var initialState: AwesomeBarState = AwesomeBarState("") ) : UIComponent( bus.getManagedEmitter(AwesomeBarAction::class.java), bus.getSafeManagedObservable(AwesomeBarChange::class.java) @@ -35,12 +36,7 @@ class AwesomeBarComponent( } } - override fun initView() = AwesomeBarUIView( - initialState.useNewTab, - initialState.isPrivate, - container, - actionEmitter, - changesObservable) + override fun initView() = AwesomeBarUIView(container, actionEmitter, changesObservable) init { render(reducer) diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt index a111969e2..18e2bfd00 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt @@ -3,7 +3,6 @@ package org.mozilla.fenix.search.awesomebar 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/. */ -import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import io.reactivex.Observable @@ -16,15 +15,12 @@ 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.toolbar.SearchUseCase import mozilla.components.support.ktx.android.graphics.drawable.toBitmap import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.mvi.UIView class AwesomeBarUIView( - useNewTab: Boolean, - isPrivate: Boolean, container: ViewGroup, actionEmitter: Observer, changesObservable: Observable @@ -35,10 +31,22 @@ class AwesomeBarUIView( .findViewById(R.id.awesomeBar) init { + val loadUrlUseCase = object : SessionUseCases.LoadUrlUseCase { + override fun invoke(url: String) { + actionEmitter.onNext(AwesomeBarAction.URLTapped(url)) + } + } + + val searchUseCase = object : SearchUseCases.SearchUseCase { + override fun invoke(searchTerms: String) { + actionEmitter.onNext(AwesomeBarAction.SearchTermsTapped(searchTerms)) + } + } + with(container.context) { view.addProviders(ClipboardSuggestionProvider( this, - getSessionUseCase(this, isPrivate, useNewTab), + loadUrlUseCase, getDrawable(R.drawable.ic_link).toBitmap(), getString(R.string.awesomebar_clipboard_title) ) @@ -51,45 +59,18 @@ class AwesomeBarUIView( ), HistoryStorageSuggestionProvider( components.core.historyStorage, - getSessionUseCase(this, isPrivate, useNewTab)), + loadUrlUseCase + ), SearchSuggestionProvider( components.search.searchEngineManager.getDefaultSearchEngine(this), - getSearchUseCase(this, isPrivate, useNewTab), + searchUseCase, components.core.client, SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS ) ) } - - view.setOnStopListener { actionEmitter.onNext(AwesomeBarAction.ItemSelected) } } - private fun getSearchUseCase( - context: Context, - isPrivate: Boolean, - useNewTab: Boolean - ): SearchUseCases.SearchUseCase { - if (!useNewTab) { - return context.components.useCases.searchUseCases.defaultSearch - } - - return when (isPrivate) { - true -> context.components.useCases.searchUseCases.newPrivateTabSearch - false -> context.components.useCases.searchUseCases.newTabSearch - } - } - - private fun getSessionUseCase(context: Context, isPrivate: Boolean, useNewTab: Boolean): - SessionUseCases.LoadUrlUseCase { - if (!useNewTab) { - return context.components.useCases.sessionUseCases.loadUrl - } - - return when (isPrivate) { - true -> context.components.useCases.tabsUseCases.addPrivateTab - false -> context.components.useCases.tabsUseCases.addTab - } - } override fun updateView() = Consumer { view.onInputChanged(it.query) }