From 704fc6f9833ab41790f3f83a76e6b53dfb333fbc Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Fri, 12 Jun 2020 15:00:37 -0700 Subject: [PATCH] Use updated webapphidetoolbarfeature --- .../fenix/browser/BaseBrowserFragment.kt | 68 +++++++++---------- .../mozilla/fenix/browser/BrowserFragment.kt | 1 - .../customtabs/ExternalAppBrowserFragment.kt | 26 ++----- 3 files changed, 41 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 2aebee3eb..56d42fda5 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -15,6 +15,7 @@ import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.net.toUri +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope @@ -24,15 +25,19 @@ import kotlinx.android.synthetic.main.fragment_browser.* import kotlinx.android.synthetic.main.fragment_browser.view.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager -import mozilla.components.browser.session.runWithSessionIdOrSelected import mozilla.components.browser.state.action.ContentAction +import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab +import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.thumbnails.BrowserThumbnails @@ -59,12 +64,14 @@ import mozilla.components.feature.session.behavior.EngineViewBottomBehavior import mozilla.components.feature.sitepermissions.SitePermissions import mozilla.components.feature.sitepermissions.SitePermissionsFeature import mozilla.components.feature.sitepermissions.SitePermissionsRules +import mozilla.components.lib.state.ext.flowScoped import mozilla.components.service.sync.logins.DefaultLoginValidationDelegate import mozilla.components.support.base.feature.PermissionsFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded import mozilla.components.support.ktx.android.view.hideKeyboard +import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity @@ -105,6 +112,7 @@ import java.lang.ref.WeakReference * This class only contains shared code focused on the main browsing content. * UI code specific to the app or to custom tabs can be found in the subclasses. */ +@ExperimentalCoroutinesApi @Suppress("TooManyFunctions", "LargeClass") abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, SessionManager.Observer { protected lateinit var browserFragmentStore: BrowserFragmentStore @@ -143,7 +151,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session private var browserInitialized: Boolean = false private var initUIJob: Job? = null - private var enteredPip = false + protected var webAppToolbarShouldBeVisible = true private val sharedViewModel: SharedViewModel by activityViewModels() @@ -383,11 +391,10 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session resumeDownloadDialogState(session, store, view, context, toolbarHeight) pipFeature = PictureInPictureFeature( - requireComponents.core.sessionManager, - requireActivity(), - requireComponents.analytics.crashReporter, - customTabSessionId, - ::pipModeChanged + store = store, + activity = requireActivity(), + crashReporting = context.components.analytics.crashReporter, + tabId = customTabSessionId ) appLinksFeature.set( @@ -528,6 +535,12 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session } }, owner = viewLifecycleOwner) + store.flowScoped(viewLifecycleOwner) { flow -> + flow.mapNotNull { state -> state.findTabOrCustomTabOrSelectedTab(customTabSessionId) } + .ifChanged { tab -> tab.content.pictureInPictureEnabled } + .collect { tab -> pipModeChanged(tab) } + } + @Suppress("ConstantConditionIf") if (FeatureFlags.pullToRefreshEnabled) { val primaryTextColor = @@ -694,11 +707,11 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session @CallSuper final override fun onPause() { super.onPause() + val session = requireComponents.core.store.state.findTabOrCustomTabOrSelectedTab(customTabSessionId) // If we didn't enter PiP, exit full screen on pause - if (!enteredPip && fullScreenFeature.onBackPressed()) { + if (session?.content?.pictureInPictureEnabled == false && fullScreenFeature.onBackPressed()) { fullScreenChanged(false) } - enteredPip = false if (findNavController().currentDestination?.id != R.id.searchFragment) { view?.hideKeyboard() } @@ -894,21 +907,13 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session } } - override fun onHomePressed(): Boolean { - if (pipFeature?.onHomePressed() == true) { - enteredPip = true - return true - } - return false - } + override fun onHomePressed() = pipFeature?.onHomePressed() ?: false - private fun pipModeChanged(enabled: Boolean) { - val fullScreenMode = - requireComponents.core.sessionManager.runWithSessionIdOrSelected(customTabSessionId) { session -> - session.fullScreenMode - } - // If we're exiting PIP mode and we're in fullscreen mode, then we should exit fullscreen mode as well. - if (!enabled && fullScreenMode) { + /** + * Exit fullscreen mode when exiting PIP mode + */ + private fun pipModeChanged(session: SessionState) { + if (!session.content.pictureInPictureEnabled && session.content.fullScreen) { onBackPressed() fullScreenChanged(false) } @@ -938,7 +943,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session .setText(getString(R.string.full_screen_notification)) .show() activity?.enterToImmersiveMode() - browserToolbarView.view.visibility = View.GONE + browserToolbarView.view.isVisible = false engineView.setDynamicToolbarMaxHeight(0) browserToolbarView.expand() @@ -949,19 +954,14 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session (activity as? HomeActivity)?.let { activity -> activity.themeManager.applyStatusBarTheme(activity) } - browserToolbarView.view.visibility = View.VISIBLE - val toolbarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height) - engineView.setDynamicToolbarMaxHeight(toolbarHeight) + if (webAppToolbarShouldBeVisible) { + browserToolbarView.view.isVisible = true + val toolbarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height) + engineView.setDynamicToolbarMaxHeight(toolbarHeight) + } } } - private fun getListOfSessions( - private: Boolean = (activity as HomeActivity).browsingModeManager.mode.isPrivate - ): List { - return requireComponents.core.sessionManager.sessionsOfType(private = private) - .toList() - } - /* * Dereference these views when the fragment view is destroyed to prevent memory leaks */ 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 8a1ce8696..3a38f3b04 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -14,7 +14,6 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.fragment_browser.* import kotlinx.android.synthetic.main.fragment_browser.view.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.browser.session.Session diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt index c50819572..3a492fed4 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.customtabs import android.content.Context import android.content.Intent import android.view.View +import androidx.core.view.isVisible import androidx.navigation.fragment.navArgs import kotlinx.android.synthetic.main.component_browser_top_toolbar.* import kotlinx.android.synthetic.main.fragment_browser.* @@ -17,15 +18,12 @@ import mozilla.components.concept.engine.manifest.WebAppManifestParser import mozilla.components.concept.engine.manifest.getOrNull import mozilla.components.feature.contextmenu.ContextMenuCandidate import mozilla.components.feature.customtabs.CustomTabWindowFeature -import mozilla.components.feature.pwa.ext.getTrustedScope -import mozilla.components.feature.pwa.ext.trustedOrigins import mozilla.components.feature.pwa.feature.ManifestUpdateFeature import mozilla.components.feature.pwa.feature.WebAppActivityFeature import mozilla.components.feature.pwa.feature.WebAppHideToolbarFeature import mozilla.components.feature.pwa.feature.WebAppSiteControlsFeature import mozilla.components.feature.session.TrackingProtectionUseCases import mozilla.components.feature.sitepermissions.SitePermissions -import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.android.arch.lifecycle.addObservers @@ -60,7 +58,6 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler val manifest = args.webAppManifest?.let { json -> WebAppManifestParser().parse(json).getOrNull() } - val trustedScopes = listOfNotNull(manifest?.getTrustedScope()) customTabSessionId?.let { customTabSessionId -> customTabsIntegration.set( @@ -99,11 +96,13 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler hideToolbarFeature.set( feature = WebAppHideToolbarFeature( - requireComponents.core.sessionManager, - toolbar, - customTabSessionId, - trustedScopes + store = requireComponents.core.store, + customTabsStore = requireComponents.core.customTabsStore, + tabId = customTabSessionId, + manifest = manifest ) { toolbarVisible -> + browserToolbarView.view.isVisible = toolbarVisible + webAppToolbarShouldBeVisible = toolbarVisible if (!toolbarVisible) { engineView.setDynamicToolbarMaxHeight(0) } }, owner = this, @@ -151,17 +150,6 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler ) } } - - consumeFrom(components.core.customTabsStore) { state -> - getSessionById() - ?.let { session -> session.customTabConfig?.sessionToken } - ?.let { token -> state.tabs[token] } - ?.let { tabState -> - hideToolbarFeature.withFeature { - it.onTrustedScopesChange(tabState.trustedOrigins) - } - } - } } }