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 565224752..54e342daf 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 @@ -17,6 +17,7 @@ import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager +import mozilla.components.concept.engine.EngineSession.LoadUrlFlags import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.session.SessionFeature @@ -177,7 +178,15 @@ class DefaultBrowserToolbarController( sessionUseCases.goForward.invoke(currentSession) } } - ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke(currentSession) + is ToolbarMenu.Item.Reload -> { + val flags = if (item.bypassCache) { + LoadUrlFlags.select(LoadUrlFlags.BYPASS_CACHE) + } else { + LoadUrlFlags.none() + } + + sessionUseCases.reload.invoke(currentSession, flags = flags) + } ToolbarMenu.Item.Stop -> sessionUseCases.stopLoading.invoke(currentSession) ToolbarMenu.Item.Settings -> browserAnimator.captureEngineViewAndDrawStatically { val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment() @@ -340,7 +349,7 @@ class DefaultBrowserToolbarController( val eventItem = when (item) { ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK is ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD - ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD + is ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP ToolbarMenu.Item.Settings -> Event.BrowserMenuItemTapped.Item.SETTINGS is ToolbarMenu.Item.RequestDesktop -> diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt index 419cd5e9d..e1a9df5fe 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.components.toolbar +import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -156,6 +157,7 @@ class BrowserToolbarView( customTabSession?.id, shouldReverseItems = toolbarPosition == ToolbarPosition.TOP, onItemTapped = { + it.performHapticIfNeeded(view) interactor.onBrowserToolbarMenuItemTapped(it) } ) @@ -164,7 +166,10 @@ class BrowserToolbarView( context = this, hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(), shouldReverseItems = toolbarPosition == ToolbarPosition.TOP, - onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) }, + onItemTapped = { + it.performHapticIfNeeded(view) + interactor.onBrowserToolbarMenuItemTapped(it) + }, lifecycleOwner = lifecycleOwner, sessionManager = sessionManager, store = components.core.store, @@ -244,4 +249,12 @@ class BrowserToolbarView( companion object { private const val TOOLBAR_ELEVATION = 16 } + + private fun ToolbarMenu.Item.performHapticIfNeeded(view: View) { + (this as? ToolbarMenu.Item.Reload)?.also { reload -> + if (reload.bypassCache) { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + } + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 49251ba2e..db8ebb164 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -98,12 +98,13 @@ class DefaultToolbarMenu( secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop, secondaryContentDescription = context.getString(R.string.browser_menu_stop), secondaryImageTintResource = primaryTextColor(), - disableInSecondaryState = false + disableInSecondaryState = false, + longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = true)) } ) { if (session?.loading == true) { onItemTapped.invoke(ToolbarMenu.Item.Stop) } else { - onItemTapped.invoke(ToolbarMenu.Item.Reload) + onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = false)) } } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt index aeb33dd15..46c422bb9 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt @@ -15,7 +15,7 @@ interface ToolbarMenu { object Share : Item() object Back : Item() data class Forward(val viewHistory: Boolean) : Item() - object Reload : Item() + data class Reload(val bypassCache: Boolean) : Item() object Stop : Item() object OpenInFenix : Item() object SaveToCollection : Item() diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt index a5f0a9017..4c69f7877 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabToolbarMenu.kt @@ -91,12 +91,13 @@ class CustomTabToolbarMenu( secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop, secondaryContentDescription = context.getString(R.string.browser_menu_stop), secondaryImageTintResource = primaryTextColor(), - disableInSecondaryState = false + disableInSecondaryState = false, + longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = true)) } ) { if (session?.loading == true) { onItemTapped.invoke(ToolbarMenu.Item.Stop) } else { - onItemTapped.invoke(ToolbarMenu.Item.Reload) + onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = false)) } } 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 c203fb976..5c69b4bf0 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 @@ -30,6 +30,7 @@ import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.ReaderState import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.search.SearchUseCases @@ -235,7 +236,7 @@ class DefaultBrowserToolbarControllerTest { @Test fun handleToolbarReloadPress() = runBlockingTest { - val item = ToolbarMenu.Item.Reload + val item = ToolbarMenu.Item.Reload(false) every { activity.components.useCases.sessionUseCases } returns sessionUseCases @@ -246,6 +247,24 @@ class DefaultBrowserToolbarControllerTest { verify { sessionUseCases.reload(currentSession) } } + @Test + fun handleToolbarReloadLongPress() = runBlockingTest { + val item = ToolbarMenu.Item.Reload(true) + + every { activity.components.useCases.sessionUseCases } returns sessionUseCases + + val controller = createController(scope = this) + controller.handleToolbarItemInteraction(item) + + verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.RELOAD)) } + verify { + sessionUseCases.reload( + currentSession, + EngineSession.LoadUrlFlags.select(EngineSession.LoadUrlFlags.BYPASS_CACHE) + ) + } + } + @Test fun handleToolbarStopPress() = runBlockingTest { val item = ToolbarMenu.Item.Stop