1
0
Fork 0

Use auto pause with BrowserFragment observers

master
Tiger Oakes 2019-08-01 12:56:51 -04:00 committed by Emily Kager
parent cbd811dcfb
commit 1e4399ee38
1 changed files with 37 additions and 60 deletions

View File

@ -52,6 +52,7 @@ import mozilla.components.feature.sitepermissions.SitePermissionsRules
import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.PermissionsFeature
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded
import mozilla.components.support.ktx.kotlin.toUri import mozilla.components.support.ktx.kotlin.toUri
@ -96,10 +97,6 @@ class BrowserFragment : Fragment(), BackHandler {
private lateinit var browserToolbarView: BrowserToolbarView private lateinit var browserToolbarView: BrowserToolbarView
private lateinit var quickActionSheetView: QuickActionSheetView private lateinit var quickActionSheetView: QuickActionSheetView
private var tabCollectionObserver: Observer<List<TabCollection>>? = null
private var sessionObserver: Session.Observer? = null
private var sessionManagerObserver: SessionManager.Observer? = null
private val sessionFeature = ViewBoundFeatureWrapper<SessionFeature>() private val sessionFeature = ViewBoundFeatureWrapper<SessionFeature>()
private val contextMenuFeature = ViewBoundFeatureWrapper<ContextMenuFeature>() private val contextMenuFeature = ViewBoundFeatureWrapper<ContextMenuFeature>()
private val downloadsFeature = ViewBoundFeatureWrapper<DownloadsFeature>() private val downloadsFeature = ViewBoundFeatureWrapper<DownloadsFeature>()
@ -470,12 +467,16 @@ class BrowserFragment : Fragment(), BackHandler {
} }
} }
override fun onStart() {
super.onStart()
subscribeToSession()
subscribeToSessions()
subscribeToTabCollections()
}
@SuppressWarnings("ComplexMethod") @SuppressWarnings("ComplexMethod")
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
sessionObserver = subscribeToSession()
sessionManagerObserver = subscribeToSessions()
tabCollectionObserver = subscribeToTabCollections()
requireComponents.core.tabCollectionStorage.register(collectionStorageObserver, this) requireComponents.core.tabCollectionStorage.register(collectionStorageObserver, this)
getSessionById()?.let { updateBookmarkState(it) } getSessionById()?.let { updateBookmarkState(it) }
@ -551,31 +552,13 @@ class BrowserFragment : Fragment(), BackHandler {
} }
} }
override fun onStop() {
super.onStop()
tabCollectionObserver?.let {
requireComponents.core.tabCollectionStorage.getCollections().removeObserver(it)
}
sessionObserver?.let {
getSessionById()?.unregister(it)
}
sessionManagerObserver?.let {
requireComponents.core.sessionManager.unregister(it)
}
}
override fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
return when { return findInPageIntegration.onBackPressed() ||
findInPageIntegration.onBackPressed() -> true fullScreenFeature.onBackPressed() ||
fullScreenFeature.onBackPressed() -> true readerViewFeature.onBackPressed() ||
readerViewFeature.onBackPressed() -> true sessionFeature.onBackPressed() ||
sessionFeature.onBackPressed() -> true customTabsIntegration.onBackPressed() ||
customTabsIntegration.onBackPressed() -> true removeSessionIfNeeded()
else -> {
removeSessionIfNeeded()
false
}
}
} }
override fun onPause() { override fun onPause() {
@ -583,9 +566,11 @@ class BrowserFragment : Fragment(), BackHandler {
fullScreenFeature.onBackPressed() fullScreenFeature.onBackPressed()
} }
private fun removeSessionIfNeeded() { private fun removeSessionIfNeeded(): Boolean {
val session = getSessionById() ?: return getSessionById()?.let { session ->
if (session.source == Session.Source.ACTION_VIEW) requireComponents.core.sessionManager.remove(session) if (session.source == Session.Source.ACTION_VIEW) requireComponents.core.sessionManager.remove(session)
}
return false
} }
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(
@ -593,17 +578,13 @@ class BrowserFragment : Fragment(), BackHandler {
permissions: Array<String>, permissions: Array<String>,
grantResults: IntArray grantResults: IntArray
) { ) {
when (requestCode) { val feature: PermissionsFeature? = when (requestCode) {
REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.withFeature { REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.get()
it.onPermissionsResult(permissions, grantResults) REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.get()
} REQUEST_CODE_APP_PERMISSIONS -> sitePermissionsFeature.get()
REQUEST_CODE_PROMPT_PERMISSIONS -> promptsFeature.withFeature { else -> null
it.onPermissionsResult(permissions, grantResults)
}
REQUEST_CODE_APP_PERMISSIONS -> sitePermissionsFeature.withFeature {
it.onPermissionsResult(permissions, grantResults)
}
} }
feature?.onPermissionsResult(permissions, grantResults)
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
@ -656,16 +637,15 @@ class BrowserFragment : Fragment(), BackHandler {
private fun getAppropriateLayoutGravity() = if (customTabSessionId != null) Gravity.TOP else Gravity.BOTTOM private fun getAppropriateLayoutGravity() = if (customTabSessionId != null) Gravity.TOP else Gravity.BOTTOM
private fun subscribeToTabCollections() = private fun subscribeToTabCollections() {
Observer<List<TabCollection>> { requireComponents.core.tabCollectionStorage.getCollections().observe(this, Observer {
requireComponents.core.tabCollectionStorage.cachedTabCollections = it requireComponents.core.tabCollectionStorage.cachedTabCollections = it
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it)) getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it))
}.also { observer -> })
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer) }
}
private fun subscribeToSession(): Session.Observer { private fun subscribeToSession() {
return object : Session.Observer { val observer = object : Session.Observer {
override fun onLoadingStateChanged(session: Session, loading: Boolean) { override fun onLoadingStateChanged(session: Session, loading: Boolean) {
if (!loading) { if (!loading) {
updateBookmarkState(session) updateBookmarkState(session)
@ -677,16 +657,18 @@ class BrowserFragment : Fragment(), BackHandler {
updateBookmarkState(session) updateBookmarkState(session)
updateAppLinksState(session) updateAppLinksState(session)
} }
}.also { observer -> getSessionById()?.register(observer, this) } }
getSessionById()?.register(observer, this, autoPause = true)
} }
private fun subscribeToSessions(): SessionManager.Observer { private fun subscribeToSessions() {
return object : SessionManager.Observer { val observer = object : SessionManager.Observer {
override fun onSessionSelected(session: Session) { override fun onSessionSelected(session: Session) {
(activity as HomeActivity).updateThemeForSession(session) (activity as HomeActivity).updateThemeForSession(session)
updateBookmarkState(session) updateBookmarkState(session)
} }
}.also { requireComponents.core.sessionManager.register(it, this) } }
requireComponents.core.sessionManager.register(observer, this, autoPause = true)
} }
private suspend fun findBookmarkedURL(session: Session?): Boolean { private suspend fun findBookmarkedURL(session: Session?): Boolean {
@ -738,11 +720,6 @@ class BrowserFragment : Fragment(), BackHandler {
} }
} }
private fun shareUrl(url: String) {
val directions = BrowserFragmentDirections.actionBrowserFragmentToShareFragment(url = url)
nav(R.id.browserFragment, directions)
}
companion object { companion object {
private const val SHARED_TRANSITION_MS = 200L private const val SHARED_TRANSITION_MS = 200L
private const val TAB_ITEM_TRANSITION_NAME = "tab_item" private const val TAB_ITEM_TRANSITION_NAME = "tab_item"