1
0
Fork 0

Use ViewBoundFeatureWrapper and BackHandler from the base component.

master
Sebastian Kaspari 2019-02-08 13:50:22 +01:00 committed by Jeff Boek
parent 97a3b3c1b3
commit cf260e4b8d
5 changed files with 86 additions and 99 deletions

View File

@ -1,12 +0,0 @@
package org.mozilla.fenix
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/.
*/
/**
* Interface for fragments that want to handle 'back' button presses.
*/
interface BackHandler {
fun onBackPressed(): Boolean
}

View File

@ -12,6 +12,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.feature.intent.IntentProcessor import mozilla.components.feature.intent.IntentProcessor
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.utils.SafeIntent import mozilla.components.support.utils.SafeIntent
import org.mozilla.fenix.browser.BrowserFragment import org.mozilla.fenix.browser.BrowserFragment
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components

View File

@ -28,9 +28,9 @@ import mozilla.components.feature.downloads.DownloadsFeature
import mozilla.components.feature.prompts.PromptFeature import mozilla.components.feature.prompts.PromptFeature
import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SessionFeature
import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SessionUseCases
import mozilla.components.support.ktx.android.arch.lifecycle.addObservers
import org.mozilla.fenix.BackHandler
import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.DefaultThemeManager
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.FindInPageIntegration import org.mozilla.fenix.components.FindInPageIntegration
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
@ -38,20 +38,22 @@ import org.mozilla.fenix.ext.share
import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getSafeManagedObservable import org.mozilla.fenix.mvi.getSafeManagedObservable
import org.mozilla.fenix.search.toolbar.SearchAction import org.mozilla.fenix.search.toolbar.SearchAction
import org.mozilla.fenix.search.toolbar.ToolbarComponent
import org.mozilla.fenix.search.toolbar.SearchState import org.mozilla.fenix.search.toolbar.SearchState
import org.mozilla.fenix.search.toolbar.ToolbarUIView import org.mozilla.fenix.search.toolbar.ToolbarComponent
import org.mozilla.fenix.search.toolbar.ToolbarIntegration
import org.mozilla.fenix.search.toolbar.ToolbarMenu import org.mozilla.fenix.search.toolbar.ToolbarMenu
import org.mozilla.fenix.search.toolbar.ToolbarUIView
class BrowserFragment : Fragment(), BackHandler { class BrowserFragment : Fragment(), BackHandler {
private lateinit var contextMenuFeature: ContextMenuFeature
private lateinit var downloadsFeature: DownloadsFeature
private lateinit var findInPageIntegration: FindInPageIntegration
private lateinit var promptsFeature: PromptFeature
private lateinit var sessionFeature: SessionFeature
private lateinit var toolbarComponent: ToolbarComponent private lateinit var toolbarComponent: ToolbarComponent
private lateinit var customTabsToolbarFeature: CustomTabsToolbarFeature
private val sessionFeature = ViewBoundFeatureWrapper<SessionFeature>()
private val contextMenuFeature = ViewBoundFeatureWrapper<ContextMenuFeature>()
private val downloadsFeature = ViewBoundFeatureWrapper<DownloadsFeature>()
private val promptsFeature = ViewBoundFeatureWrapper<PromptFeature>()
private val findInPageIntegration = ViewBoundFeatureWrapper<FindInPageIntegration>()
private val customTabsToolbarFeature = ViewBoundFeatureWrapper<CustomTabsToolbarFeature>()
private val toolbarIntegration = ViewBoundFeatureWrapper<ToolbarIntegration>()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -108,63 +110,67 @@ class BrowserFragment : Fragment(), BackHandler {
val sessionManager = requireComponents.core.sessionManager val sessionManager = requireComponents.core.sessionManager
contextMenuFeature = ContextMenuFeature( contextMenuFeature.set(
requireFragmentManager(), feature = ContextMenuFeature(
sessionManager, requireFragmentManager(),
ContextMenuCandidate.defaultCandidates( sessionManager,
ContextMenuCandidate.defaultCandidates(
requireContext(),
requireComponents.useCases.tabsUseCases,
view),
view.engineView),
owner = this,
view = view)
downloadsFeature.set(
feature = DownloadsFeature(
requireContext(), requireContext(),
requireComponents.useCases.tabsUseCases, sessionManager = sessionManager,
view), fragmentManager = childFragmentManager,
view.engineView) onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS)
}),
owner = this,
view = view)
downloadsFeature = DownloadsFeature( promptsFeature.set(
requireContext(), feature = PromptFeature(
sessionManager = sessionManager, fragment = this,
fragmentManager = childFragmentManager, sessionManager = sessionManager,
onNeedToRequestPermissions = { permissions -> fragmentManager = requireFragmentManager(),
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS) onNeedToRequestPermissions = { permissions ->
} requestPermissions(permissions, REQUEST_CODE_PROMPT_PERMISSIONS)
) }),
owner = this,
view = view)
promptsFeature = PromptFeature( sessionFeature.set(
fragment = this, feature = SessionFeature(
sessionManager = sessionManager, sessionManager,
fragmentManager = requireFragmentManager(), SessionUseCases(sessionManager),
onNeedToRequestPermissions = { permissions -> view.engineView,
requestPermissions(permissions, REQUEST_CODE_PROMPT_PERMISSIONS) sessionId),
} owner = this,
) view = view)
sessionFeature = SessionFeature( findInPageIntegration.set(
sessionManager, feature = FindInPageIntegration(requireComponents.core.sessionManager, view.findInPageView),
SessionUseCases(sessionManager), owner = this,
view.engineView, view = view)
sessionId
)
findInPageIntegration = FindInPageIntegration(requireComponents.core.sessionManager, view.findInPageView) customTabsToolbarFeature.set(
feature = CustomTabsToolbarFeature(
sessionManager,
toolbar,
sessionId,
closeListener = { requireActivity().finish() }),
owner = this,
view = view)
customTabsToolbarFeature = CustomTabsToolbarFeature( toolbarIntegration.set(
sessionManager, feature = (toolbarComponent.uiView as ToolbarUIView).toolbarIntegration,
toolbar, owner = this,
sessionId view = view)
) { requireActivity().finish() }
lifecycle.addObservers(
contextMenuFeature,
downloadsFeature,
findInPageIntegration,
promptsFeature,
sessionFeature,
(toolbarComponent.uiView as ToolbarUIView).toolbarIntegration,
customTabsToolbarFeature
)
}
override fun onDestroyView() {
super.onDestroyView()
lifecycle.removeObserver(sessionFeature)
} }
@SuppressWarnings("ReturnCount") @SuppressWarnings("ReturnCount")
@ -180,13 +186,17 @@ class BrowserFragment : Fragment(), BackHandler {
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) { when (requestCode) {
REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.onPermissionsResult(permissions, grantResults) REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.withFeature {
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.onPermissionsResult(permissions, grantResults) it.onPermissionsResult(permissions, grantResults)
}
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.withFeature {
it.onPermissionsResult(permissions, grantResults)
}
} }
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
promptsFeature.onActivityResult(requestCode, resultCode, data) promptsFeature.withFeature { it.onActivityResult(requestCode, resultCode, data) }
} }
// This method triggers the complexity warning. However it's actually not that hard to understand. // This method triggers the complexity warning. However it's actually not that hard to understand.

View File

@ -6,9 +6,6 @@ package org.mozilla.fenix.components
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import android.view.View import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
@ -16,28 +13,28 @@ import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.feature.findinpage.FindInPageFeature import mozilla.components.feature.findinpage.FindInPageFeature
import mozilla.components.feature.findinpage.view.FindInPageBar import mozilla.components.feature.findinpage.view.FindInPageBar
import mozilla.components.feature.findinpage.view.FindInPageView import mozilla.components.feature.findinpage.view.FindInPageView
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.LifecycleAwareFeature
class FindInPageIntegration( class FindInPageIntegration(
private val sessionManager: SessionManager, private val sessionManager: SessionManager,
private val view: FindInPageView private val view: FindInPageView
) : LifecycleObserver { ) : LifecycleAwareFeature, BackHandler {
private val feature = FindInPageFeature(sessionManager, view, ::onClose) private val feature = FindInPageFeature(sessionManager, view, ::onClose)
@OnLifecycleEvent(Lifecycle.Event.ON_START) override fun start() {
fun onStart() {
feature.start() feature.start()
FindInPageIntegration.launch = this::launch FindInPageIntegration.launch = this::launch
} }
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) override fun stop() {
fun onStop() {
feature.stop() feature.stop()
FindInPageIntegration.launch = null FindInPageIntegration.launch = null
} }
fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
return feature.onBackPressed() return feature.onBackPressed()
} }

View File

@ -5,9 +5,6 @@
package org.mozilla.fenix.search.toolbar package org.mozilla.fenix.search.toolbar
import android.content.Context import android.content.Context
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.navigation.Navigation import androidx.navigation.Navigation
import mozilla.components.browser.domains.autocomplete.DomainAutocompleteProvider import mozilla.components.browser.domains.autocomplete.DomainAutocompleteProvider
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
@ -17,6 +14,7 @@ import mozilla.components.concept.storage.HistoryStorage
import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature import mozilla.components.feature.toolbar.ToolbarAutocompleteFeature
import mozilla.components.feature.toolbar.ToolbarFeature import mozilla.components.feature.toolbar.ToolbarFeature
import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.DefaultThemeManager
import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.application
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
@ -29,7 +27,7 @@ class ToolbarIntegration(
historyStorage: HistoryStorage, historyStorage: HistoryStorage,
sessionManager: SessionManager, sessionManager: SessionManager,
sessionId: String? = null sessionId: String? = null
) : LifecycleObserver { ) : LifecycleAwareFeature {
init { init {
toolbar.setMenuBuilder(toolbarMenu.menuBuilder) toolbar.setMenuBuilder(toolbarMenu.menuBuilder)
@ -59,18 +57,11 @@ class ToolbarIntegration(
sessionId sessionId
) )
@OnLifecycleEvent(Lifecycle.Event.ON_START) override fun start() {
fun start() {
toolbarFeature.start() toolbarFeature.start()
} }
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) override fun stop() {
fun stop() {
toolbarFeature.stop() toolbarFeature.stop()
} }
companion object {
const val browserActionMarginDp = 8
const val urlBoxMargin = 8
}
} }