Skip to content

Commit

Permalink
For mozilla-mobile#1901 - Get rid of black flash when leaving GV Engine
Browse files Browse the repository at this point in the history
  • Loading branch information
ekager committed Oct 9, 2019
1 parent 6ec0d46 commit f9afd97
Show file tree
Hide file tree
Showing 10 changed files with 158 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
package org.mozilla.fenix.ui

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
Expand Down Expand Up @@ -72,6 +74,7 @@ class TabbedBrowsingTest {
}.openHomeScreen { }

homeScreen {
mDevice.wait(Until.findObject(By.res("R.id.item_tab")), TestAssetHelper.waitingTime)
verifyExistingTabList()

}.openTabsListThreeDotMenu {
Expand Down Expand Up @@ -100,6 +103,7 @@ class TabbedBrowsingTest {
verifyPageContent(defaultWebPage.content)
verifyTabCounter("1")
}.openHomeScreen {
mDevice.wait(Until.findObject(By.res("R.id.item_tab")), TestAssetHelper.waitingTime)
verifyExistingTabList()
verifyShareTabsButton(true)
verifyCloseTabsButton(true)
Expand Down Expand Up @@ -127,6 +131,7 @@ class TabbedBrowsingTest {
}.openHomeScreen { }

homeScreen {
mDevice.wait(Until.findObject(By.res("R.id.item_tab")), TestAssetHelper.waitingTime)
verifyExistingTabList()
}.openTabsListThreeDotMenu {
verifyCloseAllTabsButton()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ class BrowserRobot {

tabsCounter().click()

mDevice.wait(
Until.findObject(By.res("R.id.header_text")),
TestAssetHelper.waitingTime
)

HomeScreenRobot().interact()
return HomeScreenRobot.Transition()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.UiDevice
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.hamcrest.CoreMatchers.allOf
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.click

/**
Expand Down Expand Up @@ -48,29 +51,35 @@ class LibraryRobot {
}

fun openBookmarks(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition {
mDevice.wait(Until.findObject(By.text("Bookmarks")), TestAssetHelper.waitingTime)
bookmarksButton().click()

BookmarksRobot().interact()
return BookmarksRobot.Transition()
}

fun openHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition {
mDevice.wait(Until.findObject(By.text("History")), TestAssetHelper.waitingTime)
historyButton().click()

HistoryRobot().interact()
return HistoryRobot.Transition()
}
}
}

private fun goBackButton() = onView(allOf(withContentDescription("Navigate up")))
private fun closeButton() = onView(withId(R.id.libraryClose))
private fun bookmarksButton() = onView(allOf(withText("Bookmarks")))
private fun historyButton() = onView(allOf(withText("History")))

private fun assertLibraryView() {
onView(allOf(
onView(
allOf(
withText("Library"),
ViewMatchers.withParent(withId(R.id.navigationToolbar))))
ViewMatchers.withParent(withId(R.id.navigationToolbar))
)
)
.check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
}

Expand Down
30 changes: 28 additions & 2 deletions app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ import android.view.ViewGroup
import androidx.annotation.CallSuper
import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.graphics.drawable.toDrawable
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDirections
import androidx.navigation.fragment.findNavController
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.component_search.*
Expand Down Expand Up @@ -74,6 +76,7 @@ import org.mozilla.fenix.downloads.DownloadService
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enterToImmersiveMode
import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.isInExperiment
Expand Down Expand Up @@ -166,7 +169,10 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
findNavController(),
(activity as HomeActivity).browsingModeManager,
findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } },
browserLayout = view.browserLayout,
engineView = engineView,
swipeRefresh = swipeRefresh,
adjustBackgroundAndNavigate = ::adjustBackgroundAndNavigate,
customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) },
viewModel = viewModel,
getSupportUrl = {
Expand Down Expand Up @@ -393,6 +399,18 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
}
}

private fun adjustBackgroundAndNavigate(directions: NavDirections) {
context?.let {
engineView.captureThumbnail { bitmap ->
lifecycleScope.launch {
swipeRefresh?.background = bitmap?.toDrawable(it.resources)
engineView.asView().visibility = View.GONE
findNavController().nav(R.id.browserFragment, directions)
}
}
}
}

@CallSuper
override fun onSessionSelected(session: Session) {
(activity as HomeActivity).updateThemeForSession(session)
Expand Down Expand Up @@ -509,7 +527,10 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
session: Session?
): BrowserToolbarViewInteractor

protected abstract fun navToQuickSettingsSheet(session: Session, sitePermissions: SitePermissions?)
protected abstract fun navToQuickSettingsSheet(
session: Session,
sitePermissions: SitePermissions?
)

protected abstract fun navToTrackingProtectionPanel(session: Session)

Expand All @@ -526,7 +547,12 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
protected fun updateLayoutMargins(inFullScreen: Boolean) {
view?.swipeRefresh?.apply {
val (topMargin, bottomMargin) = if (inFullScreen) 0 to 0 else getEngineMargins()
(layoutParams as CoordinatorLayout.LayoutParams).setMargins(0, topMargin, 0, bottomMargin)
(layoutParams as CoordinatorLayout.LayoutParams).setMargins(
0,
topMargin,
0,
bottomMargin
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ open class BrowserToolbarInteractor(
private val browserToolbarController: BrowserToolbarController
) : BrowserToolbarViewInteractor {

override fun onTabCounterClicked() {
browserToolbarController.handleTabCounterClick()
}

override fun onBrowserToolbarPaste(text: String) {
browserToolbarController.handleToolbarPaste(text)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,17 @@ package org.mozilla.fenix.components.toolbar

import android.app.Activity
import android.content.Intent
import android.view.View
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.core.graphics.drawable.toDrawable
import androidx.core.widget.NestedScrollView
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.navigation.NavController
import androidx.navigation.NavDirections
import androidx.navigation.NavOptions
import androidx.navigation.fragment.FragmentNavigator
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.bottomsheet.BottomSheetBehavior
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.MainScope
Expand Down Expand Up @@ -40,14 +48,19 @@ interface BrowserToolbarController {
fun handleToolbarPasteAndGo(text: String)
fun handleToolbarItemInteraction(item: ToolbarMenu.Item)
fun handleToolbarClick()
fun handleTabCounterClick()
}

@Suppress("LargeClass")
class DefaultBrowserToolbarController(
private val activity: Activity,
private val navController: NavController,
private val browsingModeManager: BrowsingModeManager,
private val findInPageLauncher: () -> Unit,
private val browserLayout: ViewGroup,
private val engineView: EngineView,
private val adjustBackgroundAndNavigate: (NavDirections) -> Unit,
private val swipeRefresh: SwipeRefreshLayout,
private val customTabSession: Session?,
private val viewModel: CreateCollectionViewModel,
private val getSupportUrl: () -> String,
Expand All @@ -60,8 +73,7 @@ class DefaultBrowserToolbarController(
get() = customTabSession ?: activity.components.core.sessionManager.selectedSession

override fun handleToolbarPaste(text: String) {
navController.nav(
R.id.browserFragment,
adjustBackgroundAndNavigate.invoke(
BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(
sessionId = currentSession?.id,
pastedText = text
Expand All @@ -84,12 +96,15 @@ class DefaultBrowserToolbarController(
activity.components.analytics.metrics.track(
Event.SearchBarTapped(Event.SearchBarTapped.Source.BROWSER)
)
navController.nav(
R.id.browserFragment,
adjustBackgroundAndNavigate.invoke(
BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(currentSession?.id)
)
}

override fun handleTabCounterClick() {
animateTabAndNavigateHome()
}

@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi
@SuppressWarnings("ComplexMethod", "LongMethod")
Expand All @@ -102,12 +117,10 @@ class DefaultBrowserToolbarController(
ToolbarMenu.Item.Forward -> sessionUseCases.goForward.invoke(currentSession)
ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke(currentSession)
ToolbarMenu.Item.Stop -> sessionUseCases.stopLoading.invoke(currentSession)
ToolbarMenu.Item.Settings -> navController.nav(
R.id.browserFragment,
ToolbarMenu.Item.Settings -> adjustBackgroundAndNavigate.invoke(
BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment()
)
ToolbarMenu.Item.Library -> navController.nav(
R.id.browserFragment,
ToolbarMenu.Item.Library -> adjustBackgroundAndNavigate.invoke(
BrowserFragmentDirections.actionBrowserFragmentToLibraryFragment()
)
is ToolbarMenu.Item.RequestDesktop -> sessionUseCases.requestDesktopSite.invoke(
Expand All @@ -120,7 +133,8 @@ class DefaultBrowserToolbarController(
if (isInstallable()) {
addToHomescreen()
} else {
val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateShortcutFragment()
val directions =
BrowserFragmentDirections.actionBrowserFragmentToCreateShortcutFragment()
navController.navigate(directions)
}
}
Expand All @@ -137,14 +151,14 @@ class DefaultBrowserToolbarController(
val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(
sessionId = null
)
navController.nav(R.id.browserFragment, directions)
adjustBackgroundAndNavigate.invoke(directions)
browsingModeManager.mode = BrowsingMode.Normal
}
ToolbarMenu.Item.NewPrivateTab -> {
val directions = BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(
sessionId = null
)
navController.nav(R.id.browserFragment, directions)
adjustBackgroundAndNavigate.invoke(directions)
browsingModeManager.mode = BrowsingMode.Private
}
ToolbarMenu.Item.FindInPage -> {
Expand Down Expand Up @@ -174,7 +188,8 @@ class DefaultBrowserToolbarController(
)
viewModel.previousFragmentId = R.id.browserFragment

val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment()
val directions =
BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment()
navController.nav(R.id.browserFragment, directions)
}
}
Expand All @@ -196,6 +211,31 @@ class DefaultBrowserToolbarController(
}
}

private fun animateTabAndNavigateHome() {
// We need to dynamically add the options here because if you do it in XML it overwrites
val options = NavOptions.Builder().setPopUpTo(R.id.nav_graph, false)
.setEnterAnim(R.anim.fade_in).build()
val extras = FragmentNavigator.Extras.Builder().addSharedElement(
browserLayout,
"${TAB_ITEM_TRANSITION_NAME}${currentSession?.id}"
).build()
engineView.captureThumbnail { bitmap ->
scope.launch {
swipeRefresh.background = bitmap?.toDrawable(activity.resources)
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
)
}
}
}
}

@SuppressWarnings("ComplexMethod")
private fun trackToolbarItemInteraction(item: ToolbarMenu.Item) {
val eventItem = when (item) {
Expand Down Expand Up @@ -228,6 +268,8 @@ class DefaultBrowserToolbarController(
}

companion object {
@VisibleForTesting
const val TAB_ITEM_TRANSITION_NAME = "tab_item"
internal const val TELEMETRY_BROWSER_IDENTIFIER = "browserMenu"
}
}
Loading

0 comments on commit f9afd97

Please sign in to comment.