From 461664ed87c64126b9df6e9b820d02ce1c88d494 Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Mon, 4 Feb 2019 15:41:26 -0800 Subject: [PATCH] For #364 - Refactors BrowserFragment to use the ToolbarComponent Co-authored-by: Sawyer Blatz Co-authored-by: Emily Kager --- .../mozilla/fenix/browser/BrowserFragment.kt | 75 +++++++++++++------ .../mozilla/fenix/search/SearchFragment.kt | 6 +- .../fenix/search/toolbar/ToolbarComponent.kt | 3 +- .../fenix/search/toolbar/ToolbarUIView.kt | 5 +- app/src/main/res/layout/component_search.xml | 3 +- app/src/main/res/layout/fragment_browser.xml | 14 +--- 6 files changed, 64 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 1afc20e2e..1ea7d3e93 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -9,14 +9,18 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.transition.TransitionInflater +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityManager import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.navigation.Navigation -import kotlinx.android.synthetic.main.fragment_browser.* +import kotlinx.android.synthetic.main.component_search.* +import kotlinx.android.synthetic.main.fragment_browser.view.* +import mozilla.components.browser.toolbar.behavior.BrowserToolbarBottomBehavior import mozilla.components.feature.contextmenu.ContextMenuCandidate import mozilla.components.feature.contextmenu.ContextMenuFeature import mozilla.components.feature.downloads.DownloadsFeature @@ -24,11 +28,16 @@ import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SessionUseCases import mozilla.components.support.ktx.android.arch.lifecycle.addObservers import org.mozilla.fenix.R -import org.mozilla.fenix.components.toolbar.ToolbarIntegration import org.mozilla.fenix.ext.requireComponents import mozilla.components.feature.prompts.PromptFeature import org.mozilla.fenix.BackHandler import org.mozilla.fenix.components.FindInPageIntegration +import org.mozilla.fenix.mvi.ActionBusFactory +import org.mozilla.fenix.mvi.getSafeManagedObservable +import org.mozilla.fenix.search.toolbar.SearchAction +import org.mozilla.fenix.search.toolbar.SearchState +import org.mozilla.fenix.search.toolbar.ToolbarComponent +import org.mozilla.fenix.search.toolbar.ToolbarUIView class BrowserFragment : Fragment(), BackHandler { @@ -37,13 +46,38 @@ class BrowserFragment : Fragment(), BackHandler { private lateinit var findInPageIntegration: FindInPageIntegration private lateinit var promptsFeature: PromptFeature private lateinit var sessionFeature: SessionFeature + private lateinit var toolbarComponent: ToolbarComponent override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_browser, container, false) + val view = inflater.inflate(R.layout.fragment_browser, container, false) + toolbarComponent = ToolbarComponent( + view.browserLayout, + ActionBusFactory.get(this), + SearchState("", isEditing = false) + ) + + toolbarComponent.uiView.view.apply { + setBackgroundColor(ContextCompat.getColor(view.context, R.color.offwhite)) + + (layoutParams as CoordinatorLayout.LayoutParams).apply { + // Stop toolbar from collapsing if TalkBack is enabled + val accessibilityManager = context + ?.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + + if (!accessibilityManager.isEnabled) { + behavior = BrowserToolbarBottomBehavior(view.context, null) + } + + gravity = Gravity.BOTTOM + height = (resources.displayMetrics.density * TOOLBAR_HEIGHT).toInt() + } + } + + return view } override fun onCreate(savedInstanceState: Bundle?) { @@ -87,23 +121,10 @@ class BrowserFragment : Fragment(), BackHandler { sessionFeature = SessionFeature( sessionManager, SessionUseCases(sessionManager), - engineView + view.engineView ) - findInPageIntegration = FindInPageIntegration(requireComponents.core.sessionManager, findInPageView) - val toolbarIntegration = ToolbarIntegration( - requireContext(), - toolbar, - requireComponents.toolbar.shippedDomainsProvider, - requireComponents.core.historyStorage - ) - - // Stop toolbar from collapsing if TalkBack is enabled - val accessibilityManager = context?.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager - if (accessibilityManager.isEnabled) { - val layoutParams = toolbar.layoutParams as CoordinatorLayout.LayoutParams - layoutParams.behavior = null - } + findInPageIntegration = FindInPageIntegration(requireComponents.core.sessionManager, view.findInPageView) lifecycle.addObservers( contextMenuFeature, @@ -111,13 +132,15 @@ class BrowserFragment : Fragment(), BackHandler { findInPageIntegration, promptsFeature, sessionFeature, - toolbarIntegration + (toolbarComponent.uiView as ToolbarUIView).toolbarIntegration ) - toolbar.onUrlClicked = { - Navigation.findNavController(toolbar).navigate(R.id.action_browserFragment_to_searchFragment, null, null) - false - } + getSafeManagedObservable() + .subscribe { + if (it is SearchAction.ToolbarTapped) { + navigateToSearch() + } + } } override fun onDestroyView() { @@ -146,8 +169,14 @@ class BrowserFragment : Fragment(), BackHandler { promptsFeature.onActivityResult(requestCode, resultCode, data) } + private fun navigateToSearch() { + Navigation.findNavController(toolbar) + .navigate(R.id.action_browserFragment_to_searchFragment, null, null) + } + companion object { private const val REQUEST_CODE_DOWNLOAD_PERMISSIONS = 1 private const val REQUEST_CODE_PROMPT_PERMISSIONS = 2 + private const val TOOLBAR_HEIGHT = 56f } } 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 e49841dd2..54bb898d8 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -33,7 +33,11 @@ class SearchFragment : Fragment() { savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_search, container, false) - toolbarComponent = ToolbarComponent(view.toolbar_wrapper, ActionBusFactory.get(this), SearchState("", isEditing = true)) + toolbarComponent = ToolbarComponent( + view.toolbar_wrapper, + ActionBusFactory.get(this), + SearchState("", isEditing = true) + ) awesomeBarComponent = AwesomeBarComponent(view.search_layout, ActionBusFactory.get(this)) ActionBusFactory.get(this).logMergedObservables() return view diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarComponent.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarComponent.kt index 52088426f..28e4a0dfd 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarComponent.kt @@ -5,8 +5,6 @@ package org.mozilla.fenix.search.toolbar import android.view.ViewGroup -import kotlinx.android.synthetic.main.fragment_browser.* -import mozilla.components.browser.toolbar.BrowserToolbar import org.mozilla.fenix.mvi.Action import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.Change @@ -41,6 +39,7 @@ data class SearchState(val query: String, val isEditing: Boolean) : ViewState sealed class SearchAction : Action { data class UrlCommitted(val url: String) : SearchAction() data class TextChanged(val query: String) : SearchAction() + object ToolbarTapped : SearchAction() } sealed class SearchChange : Change { diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarUIView.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarUIView.kt index 935a10c2b..9ce18435a 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarUIView.kt @@ -36,8 +36,11 @@ class ToolbarUIView( init { view.apply { - onUrlClicked = { false } setOnUrlCommitListener { actionEmitter.onNext(SearchAction.UrlCommitted(it)) } + onUrlClicked = { + actionEmitter.onNext(SearchAction.ToolbarTapped) + false + } browserActionMargin = resources.pxToDp(browserActionMarginDp) urlBoxView = urlBackground diff --git a/app/src/main/res/layout/component_search.xml b/app/src/main/res/layout/component_search.xml index a490703e0..b0ee1f9d3 100644 --- a/app/src/main/res/layout/component_search.xml +++ b/app/src/main/res/layout/component_search.xml @@ -4,7 +4,6 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="40dp" - android:layout_margin="8dp" android:clickable="true" android:focusable="true" - android:focusableInTouchMode="true"/> \ No newline at end of file + android:focusableInTouchMode="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_browser.xml b/app/src/main/res/layout/fragment_browser.xml index b7abf67da..b440edf88 100644 --- a/app/src/main/res/layout/fragment_browser.xml +++ b/app/src/main/res/layout/fragment_browser.xml @@ -6,6 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:mozac="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/browserLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="browser.BrowserFragment"> @@ -42,17 +43,4 @@ android:visibility="gone" app:layout_behavior="org.mozilla.fenix.components.FindInPageBarBehavior" /> - - \ No newline at end of file