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 b1617940a..5582088a2 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -155,7 +155,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs return getSessionById()?.also { session -> val browserToolbarController = DefaultBrowserToolbarController( - context, + requireActivity(), findNavController(), (activity as HomeActivity).browsingModeManager, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, 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 3b174cccd..652f5a95f 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 @@ -5,7 +5,6 @@ package org.mozilla.fenix.components.toolbar import android.app.Activity -import android.content.Context import android.content.Intent import androidx.core.widget.NestedScrollView import androidx.lifecycle.LifecycleCoroutineScope @@ -43,7 +42,7 @@ interface BrowserToolbarController { } class DefaultBrowserToolbarController( - private val context: Context, + private val activity: Activity, private val navController: NavController, private val browsingModeManager: BrowsingModeManager, private val findInPageLauncher: () -> Unit, @@ -56,30 +55,31 @@ class DefaultBrowserToolbarController( private val scope: LifecycleCoroutineScope ) : BrowserToolbarController { + private val currentSession + get() = customTabSession ?: activity.components.core.sessionManager.selectedSession + override fun handleToolbarPaste(text: String) { navController.nav( R.id.browserFragment, BrowserFragmentDirections.actionBrowserFragmentToSearchFragment( - sessionId = customTabSession?.id ?: context.components.core.sessionManager.selectedSession?.id, + sessionId = currentSession?.id, pastedText = text ) ) } override fun handleToolbarPasteAndGo(text: String) { - context.components.core.sessionManager.selectedSession?.searchTerms = "" - context.components.useCases.sessionUseCases.loadUrl(text) + activity.components.core.sessionManager.selectedSession?.searchTerms = "" + activity.components.useCases.sessionUseCases.loadUrl(text) } override fun handleToolbarClick() { - context.components.analytics.metrics.track( + activity.components.analytics.metrics.track( Event.SearchBarTapped(Event.SearchBarTapped.Source.BROWSER) ) navController.nav( R.id.browserFragment, - BrowserFragmentDirections.actionBrowserFragmentToSearchFragment( - customTabSession?.id ?: context.components.core.sessionManager.selectedSession?.id - ) + BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(currentSession?.id) ) } @@ -87,9 +87,8 @@ class DefaultBrowserToolbarController( @ObsoleteCoroutinesApi @SuppressWarnings("ComplexMethod", "LongMethod") override fun handleToolbarItemInteraction(item: ToolbarMenu.Item) { - val sessionUseCases = context.components.useCases.sessionUseCases + val sessionUseCases = activity.components.useCases.sessionUseCases trackToolbarItemInteraction(item) - val currentSession = customTabSession ?: context.components.core.sessionManager.selectedSession Do exhaustive when (item) { ToolbarMenu.Item.Back -> sessionUseCases.goBack.invoke(currentSession) @@ -110,7 +109,7 @@ class DefaultBrowserToolbarController( ) ToolbarMenu.Item.AddToHomeScreen -> { MainScope().launch { - with(context.components.useCases.webAppUseCases) { + with(activity.components.useCases.webAppUseCases) { if (isInstallable()) { addToHomescreen() } else { @@ -144,27 +143,27 @@ class DefaultBrowserToolbarController( ToolbarMenu.Item.FindInPage -> { bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED findInPageLauncher() - context.components.analytics.metrics.track(Event.FindInPageOpened) + activity.components.analytics.metrics.track(Event.FindInPageOpened) } ToolbarMenu.Item.ReportIssue -> { val currentUrl = currentSession?.url currentUrl?.apply { val reportUrl = String.format(BrowserFragment.REPORT_SITE_ISSUE_URL, this) - context.components.useCases.tabsUseCases.addTab.invoke(reportUrl) + activity.components.useCases.tabsUseCases.addTab.invoke(reportUrl) } } ToolbarMenu.Item.Help -> { - context.components.useCases.tabsUseCases.addTab.invoke(getSupportUrl()) + activity.components.useCases.tabsUseCases.addTab.invoke(getSupportUrl()) } ToolbarMenu.Item.SaveToCollection -> { - context.components.analytics.metrics + activity.components.analytics.metrics .track(Event.CollectionSaveButtonPressed(TELEMETRY_BROWSER_IDENTIFIER)) - currentSession?.toTab(context)?.let { currentSessionAsTab -> + currentSession?.toTab(activity)?.let { currentSessionAsTab -> viewModel.saveTabToCollection( tabs = listOf(currentSessionAsTab), selectedTab = currentSessionAsTab, - cachedTabCollections = context.components.core.tabCollectionStorage.cachedTabCollections + cachedTabCollections = activity.components.core.tabCollectionStorage.cachedTabCollections ) viewModel.previousFragmentId = R.id.browserFragment @@ -178,15 +177,15 @@ class DefaultBrowserToolbarController( // Strip the CustomTabConfig to turn this Session into a regular tab and then select it customTabSession!!.customTabConfig = null - context.components.core.sessionManager.select(customTabSession) + activity.components.core.sessionManager.select(customTabSession) // Switch to the actual browser which should now display our new selected session - context.startActivity(openInFenixIntent) + activity.startActivity(openInFenixIntent) // Close this activity since it is no longer displaying any session - (context as Activity).finish() + activity.finish() } - ToolbarMenu.Item.Quit -> context.deleteAndQuit(scope) + ToolbarMenu.Item.Quit -> deleteAndQuit(activity, scope) } } @@ -218,7 +217,7 @@ class DefaultBrowserToolbarController( ToolbarMenu.Item.Quit -> Event.BrowserMenuItemTapped.Item.QUIT } - context.components.analytics.metrics.track(Event.BrowserMenuItemTapped(eventItem)) + activity.components.analytics.metrics.track(Event.BrowserMenuItemTapped(eventItem)) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/utils/DeleteAndQuit.kt b/app/src/main/java/org/mozilla/fenix/utils/DeleteAndQuit.kt index 45a793021..7203a0cdc 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/DeleteAndQuit.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/DeleteAndQuit.kt @@ -4,38 +4,37 @@ package org.mozilla.fenix.utils -import android.content.Context +import android.app.Activity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.mozilla.fenix.ext.asActivity import org.mozilla.fenix.settings.DefaultDeleteBrowsingDataController /** - * Deletes selected browsing data and finishes the activity + * Deletes selected browsing data and finishes the activity. */ -fun Context.deleteAndQuit(coroutineScope: CoroutineScope) { +fun deleteAndQuit(activity: Activity, coroutineScope: CoroutineScope) { coroutineScope.launch { - launch { - val controller = - DefaultDeleteBrowsingDataController(this@deleteAndQuit, coroutineContext) - if (Settings.getInstance(this@deleteAndQuit).deleteCacheOnQuit) { - controller.deleteCachedFiles() + val controller = DefaultDeleteBrowsingDataController(activity, coroutineContext) + + if (Settings.getInstance(activity).deleteCacheOnQuit) { + controller.deleteCachedFiles() + } + if (Settings.getInstance(activity).deleteTabsOnQuit) { + controller.deleteTabs() + } + if (Settings.getInstance(activity).deletePermissionsOnQuit) { + launch(Dispatchers.IO) { + controller.deleteSitePermissions() } - if (Settings.getInstance(this@deleteAndQuit).deleteTabsOnQuit) { - controller.deleteTabs() - } - if (Settings.getInstance(this@deleteAndQuit).deletePermissionsOnQuit) { - launch(Dispatchers.IO) { - controller.deleteSitePermissions() - } - } - if (Settings.getInstance(this@deleteAndQuit).deleteCookiesOnQuit) { - controller.deleteCookies() - } - if (Settings.getInstance(this@deleteAndQuit).deleteHistoryOnQuit) { - controller.deleteHistoryAndDOMStorages() - } - }.invokeOnCompletion { this@deleteAndQuit.asActivity()?.finish() } + } + if (Settings.getInstance(activity).deleteCookiesOnQuit) { + controller.deleteCookies() + } + if (Settings.getInstance(activity).deleteHistoryOnQuit) { + controller.deleteHistoryAndDOMStorages() + } + + activity.finish() } } 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 fa1de9dda..be11380ec 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 @@ -4,7 +4,6 @@ package org.mozilla.fenix.components.toolbar -import android.content.Context import android.content.Intent import androidx.core.widget.NestedScrollView import androidx.lifecycle.LifecycleCoroutineScope @@ -55,7 +54,7 @@ class DefaultBrowserToolbarControllerTest { private val mainThreadSurrogate = newSingleThreadContext("UI thread") - private var context: HomeActivity = mockk(relaxed = true) + private var activity: HomeActivity = mockk(relaxed = true) private var analytics: Analytics = mockk(relaxed = true) private val browsingModeManager: BrowsingModeManager = mockk(relaxed = true) private var navController: NavController = mockk(relaxed = true) @@ -79,7 +78,7 @@ class DefaultBrowserToolbarControllerTest { Dispatchers.setMain(mainThreadSurrogate) controller = DefaultBrowserToolbarController( - context = context, + activity = activity, navController = navController, browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, @@ -100,12 +99,12 @@ class DefaultBrowserToolbarControllerTest { mockkStatic( "org.mozilla.fenix.utils.DeleteAndQuitKt" ) - every { any().deleteAndQuit(any()) } just Runs + every { deleteAndQuit(any(), any()) } just Runs - every { context.components.analytics } returns analytics + every { activity.components.analytics } returns analytics every { analytics.metrics } returns metrics - every { context.components.useCases.sessionUseCases } returns sessionUseCases - every { context.components.core.sessionManager.selectedSession } returns currentSession + every { activity.components.useCases.sessionUseCases } returns sessionUseCases + every { activity.components.core.sessionManager.selectedSession } returns currentSession } @Test @@ -184,7 +183,7 @@ class DefaultBrowserToolbarControllerTest { fun handleToolbarReloadPress() { val item = ToolbarMenu.Item.Reload - every { context.components.useCases.sessionUseCases } returns sessionUseCases + every { activity.components.useCases.sessionUseCases } returns sessionUseCases controller.handleToolbarItemInteraction(item) @@ -329,7 +328,7 @@ class DefaultBrowserToolbarControllerTest { every { currentSession.id } returns "1" every { currentSession.url } returns "https://mozilla.org" - every { context.components.useCases.tabsUseCases } returns tabsUseCases + every { activity.components.useCases.tabsUseCases } returns tabsUseCases every { tabsUseCases.addTab } returns addTabUseCase controller.handleToolbarItemInteraction(item) @@ -353,7 +352,7 @@ class DefaultBrowserToolbarControllerTest { val item = ToolbarMenu.Item.Help - every { context.components.useCases.tabsUseCases } returns tabsUseCases + every { activity.components.useCases.tabsUseCases } returns tabsUseCases every { tabsUseCases.addTab } returns addTabUseCase controller.handleToolbarItemInteraction(item) @@ -385,8 +384,8 @@ class DefaultBrowserToolbarControllerTest { fun handleToolbarSaveToCollectionPress() { val item = ToolbarMenu.Item.SaveToCollection val cachedTabCollections: List = mockk(relaxed = true) - every { context.components.useCases.sessionUseCases } returns sessionUseCases - every { context.components.core.tabCollectionStorage.cachedTabCollections } returns cachedTabCollections + every { activity.components.useCases.sessionUseCases } returns sessionUseCases + every { activity.components.core.tabCollectionStorage.cachedTabCollections } returns cachedTabCollections controller.handleToolbarItemInteraction(item) @@ -410,7 +409,7 @@ class DefaultBrowserToolbarControllerTest { @Test fun handleToolbarOpenInFenixPress() { controller = DefaultBrowserToolbarController( - context = context, + activity = activity, navController = navController, browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, @@ -426,17 +425,17 @@ class DefaultBrowserToolbarControllerTest { val sessionManager: SessionManager = mockk(relaxed = true) val item = ToolbarMenu.Item.OpenInFenix - every { context.components.core.sessionManager } returns sessionManager + every { activity.components.core.sessionManager } returns sessionManager every { currentSession.customTabConfig } returns mockk() - every { context.startActivity(any()) } just Runs + every { activity.startActivity(any()) } just Runs controller.handleToolbarItemInteraction(item) verify { engineView.release() } verify { currentSession.customTabConfig = null } verify { sessionManager.select(currentSession) } - verify { context.startActivity(openInFenixIntent) } - verify { context.finish() } + verify { activity.startActivity(openInFenixIntent) } + verify { activity.finish() } } @Test @@ -445,6 +444,6 @@ class DefaultBrowserToolbarControllerTest { controller.handleToolbarItemInteraction(item) - verify { context.deleteAndQuit(scope) } + verify { deleteAndQuit(activity, scope) } } } diff --git a/app/src/test/java/org/mozilla/fenix/utils/DeleteAndQuitTest.kt b/app/src/test/java/org/mozilla/fenix/utils/DeleteAndQuitTest.kt index 77f979432..4c238817e 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/DeleteAndQuitTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/DeleteAndQuitTest.kt @@ -28,7 +28,6 @@ import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.TestApplication import org.mozilla.fenix.components.PermissionStorage -import org.mozilla.fenix.ext.asActivity import org.mozilla.fenix.ext.clearAndCommit import org.mozilla.fenix.ext.components import org.robolectric.annotation.Config @@ -41,7 +40,7 @@ class DeleteAndQuitTest { private val mainThreadSurrogate = newSingleThreadContext("UI thread") - private var context: HomeActivity = mockk(relaxed = true) + private var activity: HomeActivity = mockk(relaxed = true) lateinit var settings: Settings private val tabUseCases: TabsUseCases = mockk(relaxed = true) private val historyStorage: PlacesHistoryStorage = mockk(relaxed = true) @@ -57,11 +56,11 @@ class DeleteAndQuitTest { Dispatchers.setMain(mainThreadSurrogate) - every { context.components.core.historyStorage } returns historyStorage - every { context.components.core.permissionStorage } returns permissionStorage - every { context.components.useCases.tabsUseCases } returns tabUseCases + every { activity.components.core.historyStorage } returns historyStorage + every { activity.components.core.permissionStorage } returns permissionStorage + every { activity.components.useCases.tabsUseCases } returns tabUseCases every { tabUseCases.removeAllTabs } returns removeAllTabsUseCases - every { context.components.core.engine } returns engine + every { activity.components.core.engine } returns engine } @After @@ -79,11 +78,11 @@ class DeleteAndQuitTest { // When settings.deleteTabsOnQuit = true - context.deleteAndQuit(this) + deleteAndQuit(activity, this) verify { removeAllTabsUseCases.invoke() - context.asActivity()?.finish() + activity.finish() } verify(exactly = 0) { @@ -110,7 +109,7 @@ class DeleteAndQuitTest { settings.deleteCookiesOnQuit = true settings.deleteCacheOnQuit = true - context.deleteAndQuit(this) + deleteAndQuit(activity, this) verify(exactly = 1) { engine.clearData(Engine.BrowsingData.allCaches()) @@ -134,7 +133,7 @@ class DeleteAndQuitTest { historyStorage - context.asActivity()?.finish() + activity.finish() } } }