From d918cfdf3841a17545053dca2e7480c648ab4f95 Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Wed, 19 Feb 2020 10:36:35 -0800 Subject: [PATCH] For #1901: Screenshot engineView to remove GV flash Co-authored-by: ekager --- .../fenix/browser/BaseBrowserFragment.kt | 20 +++++++---- .../toolbar/BrowserToolbarController.kt | 35 ++++++++++++------- .../DefaultBrowserToolbarControllerTest.kt | 4 +-- 3 files changed, 39 insertions(+), 20 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 db1e49364..f64f6442b 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.View import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.graphics.drawable.toDrawable import androidx.core.net.toUri import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -475,9 +476,16 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session private fun adjustBackgroundAndNavigate(directions: NavDirections) { context?.let { - swipeRefresh?.background = ColorDrawable(Color.TRANSPARENT) - engineView?.asView()?.visibility = View.GONE - findNavController().nav(R.id.browserFragment, directions) + engineView.captureThumbnail { bitmap -> + lifecycleScope.launch { + // If the bitmap is null, the best we can do to reduce the flash is set transparent + swipeRefresh.background = bitmap?.toDrawable(it.resources) + ?: ColorDrawable(Color.TRANSPARENT) + + engineView.asView().visibility = View.GONE + findNavController().nav(R.id.browserFragment, directions) + } + } } } @@ -531,9 +539,9 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session @CallSuper override fun onBackPressed(): Boolean { return findInPageIntegration.onBackPressed() || - fullScreenFeature.onBackPressed() || - sessionFeature.onBackPressed() || - removeSessionIfNeeded() + fullScreenFeature.onBackPressed() || + sessionFeature.onBackPressed() || + removeSessionIfNeeded() } /** diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index a49933755..f2161395c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -11,6 +11,7 @@ import android.graphics.drawable.ColorDrawable import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting +import androidx.core.graphics.drawable.toDrawable import androidx.navigation.NavController import androidx.navigation.NavDirections import androidx.navigation.NavOptions @@ -184,14 +185,18 @@ class DefaultBrowserToolbarController( val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment( sessionId = null ) - adjustBackgroundAndNavigate.invoke(directions) + + // Do not adjustBackground here or an exception gets thrown as we switch themes + navController.nav(R.id.browserFragment, directions) browsingModeManager.mode = BrowsingMode.Normal } ToolbarMenu.Item.NewPrivateTab -> { val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment( sessionId = null ) - adjustBackgroundAndNavigate.invoke(directions) + + // Do not adjustBackground here or an exception gets thrown as we switch themes + navController.nav(R.id.browserFragment, directions) browsingModeManager.mode = BrowsingMode.Private } ToolbarMenu.Item.FindInPage -> { @@ -299,16 +304,22 @@ class DefaultBrowserToolbarController( browserLayout, "${TAB_ITEM_TRANSITION_NAME}${currentSession?.id}" ).build() - swipeRefresh.background = ColorDrawable(Color.TRANSPARENT) - engineView.asView().visibility = View.GONE - if (!navController.popBackStack(R.id.homeFragment, false)) { - navController.nav( - R.id.browserFragment, - R.id.action_browserFragment_to_homeFragment, - null, - options, - extras - ) + engineView.captureThumbnail { bitmap -> + scope.launch { + // If the bitmap is null, the best we can do to reduce the flash is set transparent + swipeRefresh.background = bitmap?.toDrawable(activity.resources) + ?: ColorDrawable(Color.TRANSPARENT) + engineView.asView().visibility = View.GONE + if (!navController.popBackStack(R.id.homeFragment, false)) { + navController.nav( + R.id.browserFragment, + R.id.action_browserFragment_to_homeFragment, + null, + options, + extras + ) + } + } } } diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index 58ba12957..8b1d338ef 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -367,7 +367,7 @@ class DefaultBrowserToolbarControllerTest { verify { val directions = BrowserFragmentDirections .actionBrowserFragmentToSearchFragment(sessionId = null) - adjustBackgroundAndNavigate.invoke(directions) + navController.nav(R.id.browserFragment, directions) } verify { browsingModeManager.mode = BrowsingMode.Private } } @@ -438,7 +438,7 @@ class DefaultBrowserToolbarControllerTest { verify { val directions = BrowserFragmentDirections .actionBrowserFragmentToSearchFragment(sessionId = null) - adjustBackgroundAndNavigate.invoke(directions) + navController.nav(R.id.browserFragment, directions) } verify { browsingModeManager.mode = BrowsingMode.Normal } }