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 mozilla.components.concept.engine.EngineView
import mozilla.components.feature.intent.IntentProcessor
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.utils.SafeIntent
import org.mozilla.fenix.browser.BrowserFragment
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.session.SessionFeature
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 mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FindInPageIntegration
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.getSafeManagedObservable
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.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.ToolbarUIView
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 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(
inflater: LayoutInflater,
@ -108,63 +110,67 @@ class BrowserFragment : Fragment(), BackHandler {
val sessionManager = requireComponents.core.sessionManager
contextMenuFeature = ContextMenuFeature(
requireFragmentManager(),
sessionManager,
ContextMenuCandidate.defaultCandidates(
contextMenuFeature.set(
feature = ContextMenuFeature(
requireFragmentManager(),
sessionManager,
ContextMenuCandidate.defaultCandidates(
requireContext(),
requireComponents.useCases.tabsUseCases,
view),
view.engineView),
owner = this,
view = view)
downloadsFeature.set(
feature = DownloadsFeature(
requireContext(),
requireComponents.useCases.tabsUseCases,
view),
view.engineView)
sessionManager = sessionManager,
fragmentManager = childFragmentManager,
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS)
}),
owner = this,
view = view)
downloadsFeature = DownloadsFeature(
requireContext(),
sessionManager = sessionManager,
fragmentManager = childFragmentManager,
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS)
}
)
promptsFeature.set(
feature = PromptFeature(
fragment = this,
sessionManager = sessionManager,
fragmentManager = requireFragmentManager(),
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_PROMPT_PERMISSIONS)
}),
owner = this,
view = view)
promptsFeature = PromptFeature(
fragment = this,
sessionManager = sessionManager,
fragmentManager = requireFragmentManager(),
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_PROMPT_PERMISSIONS)
}
)
sessionFeature.set(
feature = SessionFeature(
sessionManager,
SessionUseCases(sessionManager),
view.engineView,
sessionId),
owner = this,
view = view)
sessionFeature = SessionFeature(
sessionManager,
SessionUseCases(sessionManager),
view.engineView,
sessionId
)
findInPageIntegration.set(
feature = FindInPageIntegration(requireComponents.core.sessionManager, view.findInPageView),
owner = this,
view = view)
findInPageIntegration = FindInPageIntegration(requireComponents.core.sessionManager, view.findInPageView)
customTabsToolbarFeature.set(
feature = CustomTabsToolbarFeature(
sessionManager,
toolbar,
sessionId,
closeListener = { requireActivity().finish() }),
owner = this,
view = view)
customTabsToolbarFeature = CustomTabsToolbarFeature(
sessionManager,
toolbar,
sessionId
) { requireActivity().finish() }
lifecycle.addObservers(
contextMenuFeature,
downloadsFeature,
findInPageIntegration,
promptsFeature,
sessionFeature,
(toolbarComponent.uiView as ToolbarUIView).toolbarIntegration,
customTabsToolbarFeature
)
}
override fun onDestroyView() {
super.onDestroyView()
lifecycle.removeObserver(sessionFeature)
toolbarIntegration.set(
feature = (toolbarComponent.uiView as ToolbarUIView).toolbarIntegration,
owner = this,
view = view)
}
@SuppressWarnings("ReturnCount")
@ -180,13 +186,17 @@ class BrowserFragment : Fragment(), BackHandler {
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.onPermissionsResult(permissions, grantResults)
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.onPermissionsResult(permissions, grantResults)
REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.withFeature {
it.onPermissionsResult(permissions, grantResults)
}
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.withFeature {
it.onPermissionsResult(permissions, grantResults)
}
}
}
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.

View File

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

View File

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