From c4e83367f6b7f96c46d2f6fbf5e9d0639e33ff61 Mon Sep 17 00:00:00 2001 From: ekager Date: Tue, 21 Apr 2020 20:41:20 -0700 Subject: [PATCH] For #6832 - Fix various fragment not attached to a context crashes --- .../fenix/addons/AddonDetailsFragment.kt | 2 +- .../fenix/addons/AddonsManagementFragment.kt | 16 +++++++++++----- .../fenix/browser/BaseBrowserFragment.kt | 17 ++++------------- .../CollectionCreationController.kt | 10 ++++------ .../collections/CollectionCreationFragment.kt | 1 - .../toolbar/BrowserToolbarController.kt | 4 ---- .../org/mozilla/fenix/home/HomeFragment.kt | 6 +++--- .../sessioncontrol/SessionControlController.kt | 6 +++--- .../library/bookmarks/BookmarkFragment.kt | 2 +- .../addfolder/AddBookmarkFolderFragment.kt | 4 ++-- .../bookmarks/edit/EditBookmarkFragment.kt | 6 +++--- .../SelectBookmarkFolderFragment.kt | 4 ++-- .../fenix/library/history/HistoryFragment.kt | 6 +++--- .../mozilla/fenix/search/SearchController.kt | 4 ++-- .../org/mozilla/fenix/search/SearchFragment.kt | 2 +- .../mozilla/fenix/settings/LoginsFragment.kt | 2 +- .../mozilla/fenix/settings/SettingsFragment.kt | 18 ++++++++++++------ .../account/AccountSettingsFragment.kt | 14 +++++++------- .../fenix/settings/account/SignOutFragment.kt | 2 +- .../logins/SavedLoginSiteInfoFragment.kt | 2 +- .../settings/logins/SavedLoginsFragment.kt | 2 +- .../QuickSettingsSheetDialogFragment.kt | 2 +- ...SitePermissionsDetailsExceptionsFragment.kt | 4 ++-- .../SitePermissionsExceptionsFragment.kt | 2 +- ...ionsManageExceptionsPhoneFeatureFragment.kt | 2 +- .../org/mozilla/fenix/share/ShareController.kt | 4 ++-- .../org/mozilla/fenix/share/ShareFragment.kt | 2 +- .../DefaultCollectionCreationControllerTest.kt | 6 ++++-- .../DefaultBrowserToolbarControllerTest.kt | 18 ------------------ .../DefaultSessionControlControllerTest.kt | 2 +- .../search/DefaultSearchControllerTest.kt | 4 ++-- 31 files changed, 78 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt index bd6d077d1..b20491bfa 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt @@ -94,7 +94,7 @@ class AddonDetailsFragment : Fragment(R.layout.fragment_add_on_details) { } private fun showUpdaterDialog(addon: Addon) { - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { val updateAttempt = updateAttemptStorage.findUpdateAttemptBy(addon.id) updateAttempt?.let { withContext(Main) { diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index 0732722aa..a12c546e3 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -98,10 +98,10 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management), private fun bindRecyclerView(view: View) { val recyclerView = view.add_ons_list recyclerView.layoutManager = LinearLayoutManager(requireContext()) - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { try { val addons = requireContext().components.addonManager.getAddons() - lifecycleScope.launch(Dispatchers.Main) { + viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) { runIfFragmentIsAttached { val adapter = AddonsManagerAdapter( requireContext().components.addonCollectionProvider, @@ -117,9 +117,12 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management), } } } catch (e: AddonManagerException) { - lifecycleScope.launch(Dispatchers.Main) { + viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) { runIfFragmentIsAttached { - showSnackBar(view, getString(R.string.mozac_feature_addons_failed_to_query_add_ons)) + showSnackBar( + view, + getString(R.string.mozac_feature_addons_failed_to_query_add_ons) + ) isInstallationInProgress = false view.add_ons_progress_bar.isVisible = false view.add_ons_empty_message.isVisible = true @@ -220,7 +223,10 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management), val rootView = activity?.getRootView() ?: view showSnackBar( rootView, - getString(R.string.mozac_feature_addons_failed_to_install, addon.translatedName) + getString( + R.string.mozac_feature_addons_failed_to_install, + addon.translatedName + ) ) addonProgressOverlay?.visibility = View.GONE isInstallationInProgress = false 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 eefb46d43..f03e2ba62 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -89,7 +89,6 @@ import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.SharedViewModel -import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration import java.lang.ref.WeakReference @@ -186,7 +185,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session return getSessionById()?.also { session -> val browserToolbarController = DefaultBrowserToolbarController( - store = browserFragmentStore, activity = requireActivity(), navController = findNavController(), readerModeController = DefaultReaderModeController( @@ -194,24 +192,17 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session (activity as HomeActivity).browsingModeManager.mode.isPrivate, view.readerViewControlsBar ), - browsingModeManager = (activity as HomeActivity).browsingModeManager, sessionManager = requireComponents.core.sessionManager, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, engineView = engineView, swipeRefresh = swipeRefresh, browserAnimator = browserAnimator, customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) }, - getSupportUrl = { - SupportUtils.getSumoURLForTopic( - context, - SupportUtils.SumoTopic.HELP - ) - }, openInFenixIntent = Intent(context, IntentReceiverActivity::class.java).apply { action = Intent.ACTION_VIEW }, - bookmarkTapped = { lifecycleScope.launch { bookmarkTapped(it) } }, - scope = lifecycleScope, + bookmarkTapped = { viewLifecycleOwner.lifecycleScope.launch { bookmarkTapped(it) } }, + scope = viewLifecycleOwner.lifecycleScope, tabCollectionStorage = requireComponents.core.tabCollectionStorage, topSiteStorage = requireComponents.core.topSiteStorage, sharedViewModel = sharedViewModel @@ -226,7 +217,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session shouldUseBottomToolbar = context.settings().shouldUseBottomToolbar, interactor = browserInteractor, customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) }, - lifecycleOwner = this.viewLifecycleOwner + lifecycleOwner = viewLifecycleOwner ) toolbarIntegration.set( @@ -725,7 +716,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session */ private fun showQuickSettingsDialog() { val session = getSessionById() ?: return - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { val sitePermissions: SitePermissions? = withContext(IO) { session.url.toUri().host?.let { host -> val storage = requireContext().components.core.permissionStorage diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt index d14cbf31f..bfadacd6c 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.browser.session.SessionManager import mozilla.components.feature.tab.collections.TabCollection -import mozilla.components.feature.tabs.TabsUseCases import org.mozilla.fenix.components.Analytics import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.metrics.Event @@ -64,9 +63,8 @@ class DefaultCollectionCreationController( private val dismiss: () -> Unit, private val analytics: Analytics, private val tabCollectionStorage: TabCollectionStorage, - private val tabsUseCases: TabsUseCases, private val sessionManager: SessionManager, - private val lifecycleScope: CoroutineScope + private val viewLifecycleScope: CoroutineScope ) : CollectionCreationController { companion object { @@ -78,7 +76,7 @@ class DefaultCollectionCreationController( dismiss() val sessionBundle = tabs.toList().toSessionBundle(sessionManager) - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { tabCollectionStorage.createCollection(name, sessionBundle) } @@ -89,7 +87,7 @@ class DefaultCollectionCreationController( override fun renameCollection(collection: TabCollection, name: String) { dismiss() - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { tabCollectionStorage.renameCollection(collection, name) analytics.metrics.track(Event.CollectionRenamed) } @@ -114,7 +112,7 @@ class DefaultCollectionCreationController( override fun selectCollection(collection: TabCollection, tabs: List) { dismiss() val sessionBundle = tabs.toList().toSessionBundle(sessionManager) - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { tabCollectionStorage .addTabsToCollection(collection, sessionBundle) } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt index 6a0228571..20fc17d67 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt @@ -77,7 +77,6 @@ class CollectionCreationFragment : DialogFragment() { ::dismiss, requireComponents.analytics, requireComponents.core.tabCollectionStorage, - requireComponents.useCases.tabsUseCases, requireComponents.core.sessionManager, viewLifecycleOwner.lifecycleScope ) 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 a19fa5e93..0c322ab51 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 @@ -29,7 +29,6 @@ import org.mozilla.fenix.browser.BrowserAnimator import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions import org.mozilla.fenix.browser.BrowserFragment import org.mozilla.fenix.browser.BrowserFragmentDirections -import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.browser.readermode.ReaderModeController import org.mozilla.fenix.collections.SaveCollectionStep import org.mozilla.fenix.components.FenixSnackbar @@ -59,18 +58,15 @@ interface BrowserToolbarController { @Suppress("LargeClass") class DefaultBrowserToolbarController( - private val store: BrowserFragmentStore, private val activity: Activity, private val navController: NavController, private val readerModeController: ReaderModeController, - private val browsingModeManager: BrowsingModeManager, private val sessionManager: SessionManager, private val findInPageLauncher: () -> Unit, private val engineView: EngineView, private val browserAnimator: BrowserAnimator, private val swipeRefresh: SwipeRefreshLayout, private val customTabSession: Session?, - private val getSupportUrl: () -> String, private val openInFenixIntent: Intent, private val bookmarkTapped: (Session) -> Unit, private val scope: CoroutineScope, diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index db85ba7f8..50aaa89ac 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -214,7 +214,7 @@ class HomeFragment : Fragment() { fragmentStore = homeFragmentStore, navController = findNavController(), browsingModeManager = browsingModeManager, - lifecycleScope = viewLifecycleOwner.lifecycleScope, + viewLifecycleScope = viewLifecycleOwner.lifecycleScope, closeTab = ::closeTab, closeAllTabs = ::closeAllTabs, getListOfTabs = ::getListOfTabs, @@ -688,7 +688,7 @@ class HomeFragment : Fragment() { HomeMenu.Item.Quit -> activity?.let { activity -> deleteAndQuit( activity, - lifecycleScope, + viewLifecycleOwner.lifecycleScope, view?.let { view -> FenixSnackbar.make( view = view, isDisplayedWithBrowserToolbar = false @@ -827,7 +827,7 @@ class HomeFragment : Fragment() { } private fun scrollToTheTop() { - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { delay(ANIM_SCROLL_DELAY) sessionControlView!!.view.smoothScrollToPosition(0) } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 549059508..0511f54e2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -175,7 +175,7 @@ class DefaultSessionControlController( private val fragmentStore: HomeFragmentStore, private val navController: NavController, private val browsingModeManager: BrowsingModeManager, - private val lifecycleScope: CoroutineScope, + private val viewLifecycleScope: CoroutineScope, private val closeTab: (sessionId: String) -> Unit, private val closeAllTabs: (isPrivateMode: Boolean) -> Unit, private val getListOfTabs: () -> List, @@ -255,7 +255,7 @@ class DefaultSessionControlController( override fun handleCollectionRemoveTab(collection: TabCollection, tab: ComponentTab) { metrics.track(Event.CollectionTabRemoved) - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { tabCollectionStorage.removeTabFromCollection(collection, tab) } } @@ -304,7 +304,7 @@ class DefaultSessionControlController( metrics.track(Event.PocketTopSiteRemoved) } - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { topSiteStorage.removeTopSite(topSite) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 1402c43c1..573a9ac95 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -291,7 +291,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan else -> throw IllegalStateException("Illegal event type in onDeleteSome") } - lifecycleScope.allowUndo( + viewLifecycleOwner.lifecycleScope.allowUndo( view!!, message, getString(R.string.bookmark_undo_deletion), { pendingBookmarksToDelete.removeAll(selected) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt index 617437122..aa7475c90 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt @@ -57,7 +57,7 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { super.onResume() showToolbar(getString(R.string.bookmark_add_folder_fragment_label)) - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { sharedViewModel.selectedFolder = withContext(IO) { sharedViewModel.selectedFolder ?: requireComponents.core.bookmarksStorage.getTree(BookmarkRoot.Mobile.id) @@ -95,7 +95,7 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { return true } this.view?.hideKeyboard() - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { val newGuid = requireComponents.core.bookmarksStorage.addFolder( sharedViewModel.selectedFolder!!.guid, bookmarkNameEdit.text.toString(), null ) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index 2e688d458..6df216315 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -65,7 +65,7 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { super.onViewCreated(view, savedInstanceState) initToolbar() - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { val context = requireContext() withContext(IO) { @@ -155,7 +155,7 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { dialog.cancel() } setPositiveButton(R.string.tab_collection_dialog_positive) { dialog: DialogInterface, _ -> - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { requireComponents.core.bookmarksStorage.deleteNode(args.guidToEdit) requireComponents.analytics.metrics.track(Event.RemoveBookmark) @@ -194,7 +194,7 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { } private fun updateBookmarkNode(title: String?, url: String?) { - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { try { requireComponents.let { components -> if (title != bookmarkNode?.title || url != bookmarkNode?.url) { diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt index ca2969f74..7015c393b 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt @@ -50,7 +50,7 @@ class SelectBookmarkFolderFragment : Fragment() { super.onResume() showToolbar(getString(R.string.bookmark_select_folder_fragment_label)) - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { bookmarkNode = withContext(IO) { val context = requireContext() context.components.core.bookmarksStorage @@ -74,7 +74,7 @@ class SelectBookmarkFolderFragment : Fragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.add_folder_button -> { - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { nav( R.id.bookmarkSelectFolderFragment, SelectBookmarkFolderFragmentDirections diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index 460435f5c..83c806818 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -106,7 +106,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } private fun deleteHistoryItems(items: Set) { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { context?.components?.run { for (item in items) { analytics.metrics.track(Event.HistoryItemRemoved) @@ -155,7 +155,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl true } R.id.delete_history_multi_select -> { - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { deleteSelectedHistory(historyStore.state.mode.selectedItems, requireComponents) viewModel.invalidate() historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode) @@ -216,7 +216,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandl } setPositiveButton(R.string.delete_browsing_data_prompt_allow) { dialog: DialogInterface, _ -> historyStore.dispatch(HistoryFragmentAction.EnterDeletionMode) - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { requireComponents.analytics.metrics.track(Event.HistoryAllItemsRemoved) requireComponents.core.historyStorage.deleteEverything() launch(Main) { diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt index a1f0a5e51..541bab2f8 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt @@ -47,7 +47,7 @@ class DefaultSearchController( private val context: Context, private val store: SearchFragmentStore, private val navController: NavController, - private val lifecycleScope: CoroutineScope, + private val viewLifecycleScope: CoroutineScope, private val clearToolbarFocus: () -> Unit ) : SearchController { @@ -82,7 +82,7 @@ class DefaultSearchController( } override fun handleEditingCancelled() { - lifecycleScope.launch { + viewLifecycleScope.launch { clearToolbarFocus() // Delay a short amount so the keyboard begins animating away. This makes exit animation // much smoother instead of having two separate parts (keyboard hides THEN animation) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt index dcb0feea3..118e0adcf 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -109,7 +109,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { context = activity as HomeActivity, store = searchStore, navController = findNavController(), - lifecycleScope = viewLifecycleOwner.lifecycleScope, + viewLifecycleScope = viewLifecycleOwner.lifecycleScope, clearToolbarFocus = ::clearToolbarFocus ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt index 4d9f8c467..80e1e58c8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt @@ -69,7 +69,7 @@ class LoginsFragment : PreferenceFragmentCompat(), AccountObserver { override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { Log.d(LOG_TAG, "onAuthenticationSucceeded") - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { // Workaround for likely biometric library bug // https://github.com/mozilla-mobile/fenix/issues/8438 delay(SHORT_DELAY_MS) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index e4d504c12..f60431fb1 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -51,7 +51,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private val accountObserver = object : AccountObserver { private fun updateAccountUi(profile: Profile? = null) { val context = context ?: return - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { updateAccountUIState( context = context, profile = profile @@ -125,7 +125,8 @@ class SettingsFragment : PreferenceFragmentCompat() { // update it here if we're not going through the `onCreate->onStart->onResume` lifecycle chain. update(shouldUpdateAccountUIState = !creatingFragment) - view!!.findViewById(R.id.recycler_view)?.hideInitialScrollBar(lifecycleScope) + view!!.findViewById(R.id.recycler_view) + ?.hideInitialScrollBar(viewLifecycleOwner.lifecycleScope) // Consider finish of `onResume` to be the point at which we consider this fragment as 'created'. creatingFragment = false @@ -376,10 +377,14 @@ class SettingsFragment : PreferenceFragmentCompat() { preferenceSignIn?.isVisible = false profile?.avatar?.url?.let { avatarUrl -> - lifecycleScope.launch(Main) { - val roundedDrawable = avatarUrl.toRoundedDrawable(context, requireComponents.core.client) + viewLifecycleOwner.lifecycleScope.launch(Main) { + val roundedDrawable = + avatarUrl.toRoundedDrawable(context, requireComponents.core.client) preferenceFirefoxAccount?.icon = - roundedDrawable ?: AppCompatResources.getDrawable(context, R.drawable.ic_account) + roundedDrawable ?: AppCompatResources.getDrawable( + context, + R.drawable.ic_account + ) } } preferenceSignIn?.onPreferenceClickListener = null @@ -420,7 +425,8 @@ class SettingsFragment : PreferenceFragmentCompat() { settings.overrideSyncTokenServer.isNotEmpty() || settings.showSecretDebugMenuThisSession // Only enable changes to these prefs when the user isn't connected to an account. - val enabled = requireComponents.backgroundServices.accountManager.authenticatedAccount() == null + val enabled = + requireComponents.backgroundServices.accountManager.authenticatedAccount() == null preferenceFxAOverride?.apply { isVisible = show isEnabled = enabled diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt index b1fdacfd4..389e0a2da 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/AccountSettingsFragment.kt @@ -55,13 +55,13 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { // Navigate away from this fragment when we encounter auth problems or logout events. private val accountStateObserver = object : AccountObserver { override fun onAuthenticationProblems() { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { findNavController().popBackStack() } } override fun onLoggedOut() { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { findNavController().popBackStack() // Remove the device name when we log out. @@ -266,7 +266,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { } private fun syncNow() { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { requireComponents.analytics.metrics.track(Event.SyncAccountSyncNow) // Trigger a sync. requireComponents.backgroundServices.accountManager.syncNowAsync(SyncReason.User) @@ -285,7 +285,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { return false } // This may fail, and we'll have a disparity in the UI until `updateDeviceName` is called. - lifecycleScope.launch(Main) { + viewLifecycleOwner.lifecycleScope.launch(Main) { context?.let { accountManager.authenticatedAccount() ?.deviceConstellation() @@ -336,7 +336,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { private val syncStatusObserver = object : SyncStatusObserver { override fun onStarted() { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { val pref = findPreference(getPreferenceKey(R.string.pref_key_sync_now)) view?.announceForAccessibility(getString(R.string.sync_syncing_in_progress)) pref?.title = getString(R.string.sync_syncing_in_progress) @@ -347,7 +347,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { // Sync stopped successfully. override fun onIdle() { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { val pref = findPreference(getPreferenceKey(R.string.pref_key_sync_now)) pref?.let { pref.title = getString(R.string.preferences_sync_now) @@ -364,7 +364,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { // Sync stopped after encountering a problem. override fun onError(error: Exception?) { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { val pref = findPreference(getPreferenceKey(R.string.pref_key_sync_now)) pref?.let { pref.title = getString(R.string.preferences_sync_now) diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt index 0e81e9f83..f2c3ef861 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt @@ -61,7 +61,7 @@ class SignOutFragment : BottomSheetDialogFragment() { super.onViewCreated(view, savedInstanceState) view.signOutDisconnect.setOnClickListener { - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { requireComponents .backgroundServices.accountAbnormalities.userRequestedLogout() accountManager.logoutAsync().await() diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt index 696f7f6ef..fbcd31e5e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt @@ -96,7 +96,7 @@ class SavedLoginSiteInfoFragment : Fragment(R.layout.fragment_saved_login_site_i private fun deleteLogin() { var deleteLoginJob: Deferred? = null - val deleteJob = lifecycleScope.launch(IO) { + val deleteJob = viewLifecycleOwner.lifecycleScope.launch(IO) { deleteLoginJob = async { requireContext().components.core.passwordsStorage.delete(args.savedLoginItem.id) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt index aff40bafc..b121ddbb3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt @@ -136,7 +136,7 @@ class SavedLoginsFragment : Fragment() { private fun loadAndMapLogins() { var deferredLogins: Deferred>? = null - val fetchLoginsJob = lifecycleScope.launch(IO) { + val fetchLoginsJob = viewLifecycleOwner.lifecycleScope.launch(IO) { deferredLogins = async { requireContext().components.core.passwordsStorage.list() } diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt index 7e6904183..980d6fd48 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt @@ -75,7 +75,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { quickSettingsController = DefaultQuickSettingsController( context = context, quickSettingsStore = quickSettingsStore, - coroutineScope = lifecycleScope, + coroutineScope = viewLifecycleOwner.lifecycleScope, navController = findNavController(), session = context.components.core.sessionManager.findSessionById(args.sessionId), sitePermissions = args.sitePermissions, diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index 05c493279..dfdf3e000 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -44,7 +44,7 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { override fun onResume() { super.onResume() showToolbar(sitePermissions.origin) - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { val context = requireContext() sitePermissions = requireNotNull(context.components.core.permissionStorage.findSitePermissionsBy(sitePermissions.origin)) @@ -96,7 +96,7 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { } private fun clearSitePermissions() { - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { requireContext().components.core.permissionStorage.deleteSitePermissions(sitePermissions) withContext(Main) { requireView().findNavController().popBackStack() diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt index 8119a589d..f177e0cd4 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsExceptionsFragment.kt @@ -108,7 +108,7 @@ class SitePermissionsExceptionsFragment : } private fun deleteAllSitePermissions() { - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { requireContext().components.core.permissionStorage.deleteAllSitePermissions() launch(Main) { showEmptyListMessage() diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt index 6186b9739..666280235 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt @@ -163,7 +163,7 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() { PhoneFeature.AUTOPLAY_AUDIBLE -> sitePermissions.copy(autoplayAudible = status) PhoneFeature.AUTOPLAY_INAUDIBLE -> sitePermissions.copy(autoplayInaudible = status) } - lifecycleScope.launch(IO) { + viewLifecycleOwner.lifecycleScope.launch(IO) { requireComponents.core.permissionStorage.updateSitePermissions(updatedSitePermissions) } } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt index fd5df71a7..4d7f97b4d 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt @@ -68,7 +68,7 @@ class DefaultShareController( private val snackbar: FenixSnackbar, private val navController: NavController, private val recentAppsStorage: RecentAppsStorage, - private val lifecycleScope: CoroutineScope, + private val viewLifecycleScope: CoroutineScope, private val dismiss: (ShareController.Result) -> Unit ) : ShareController { @@ -83,7 +83,7 @@ class DefaultShareController( } override fun handleShareToApp(app: AppShareOption) { - lifecycleScope.launch(Dispatchers.IO) { + viewLifecycleScope.launch(Dispatchers.IO) { recentAppsStorage.updateRecentApp(app.activityName) } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt index 8694e25e9..841a6717a 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt @@ -79,7 +79,7 @@ class ShareFragment : AppCompatDialogFragment() { navController = findNavController(), sendTabUseCases = SendTabUseCases(accountManager), recentAppsStorage = RecentAppsStorage(requireContext()), - lifecycleScope = lifecycleScope + viewLifecycleScope = viewLifecycleOwner.lifecycleScope ) { result -> consumePrompt { when (result) { diff --git a/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt b/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt index f8c3f6eba..f5223e635 100644 --- a/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt @@ -42,8 +42,10 @@ class DefaultCollectionCreationControllerTest { every { state.tabCollections } returns emptyList() every { state.tabs } returns emptyList() - controller = DefaultCollectionCreationController(store, dismiss, analytics, - tabCollectionStorage, tabsUseCases, sessionManager, testCoroutineScope) + controller = DefaultCollectionCreationController( + store, dismiss, analytics, + tabCollectionStorage, sessionManager, testCoroutineScope + ) } @Test 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 daf3eaaec..6c865ff12 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 @@ -46,7 +46,6 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.BrowserAnimator import org.mozilla.fenix.browser.BrowserFragment import org.mozilla.fenix.browser.BrowserFragmentDirections -import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.browser.readermode.ReaderModeController import org.mozilla.fenix.collections.SaveCollectionStep import org.mozilla.fenix.components.Analytics @@ -71,12 +70,10 @@ class DefaultBrowserToolbarControllerTest { private var swipeRefreshLayout: SwipeRefreshLayout = 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) private var findInPageLauncher: () -> Unit = mockk(relaxed = true) private val engineView: EngineView = mockk(relaxed = true) private val currentSession: Session = mockk(relaxed = true) - private val getSupportUrl: () -> String = { "https://supportUrl.org" } private val openInFenixIntent: Intent = mockk(relaxed = true) private val currentSessionAsTab: Tab = mockk(relaxed = true) private val metrics: MetricController = mockk(relaxed = true) @@ -104,12 +101,10 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( activity = activity, navController = navController, - browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, engineView = engineView, browserAnimator = browserAnimator, customTabSession = null, - getSupportUrl = getSupportUrl, openInFenixIntent = openInFenixIntent, scope = scope, swipeRefresh = swipeRefreshLayout, @@ -118,7 +113,6 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = mockk(), readerModeController = readerModeController, sessionManager = mockk(), - store = mockk(), sharedViewModel = mockk() ) @@ -200,12 +194,10 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( activity = activity, navController = navController, - browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, engineView = engineView, browserAnimator = browserAnimator, customTabSession = null, - getSupportUrl = getSupportUrl, openInFenixIntent = openInFenixIntent, scope = this, swipeRefresh = swipeRefreshLayout, @@ -214,7 +206,6 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = mockk(), readerModeController = mockk(), sessionManager = mockk(), - store = mockk(), sharedViewModel = mockk() ) @@ -353,12 +344,10 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( activity = activity, navController = navController, - browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, engineView = engineView, browserAnimator = browserAnimator, customTabSession = null, - getSupportUrl = getSupportUrl, openInFenixIntent = openInFenixIntent, scope = this, swipeRefresh = swipeRefreshLayout, @@ -367,7 +356,6 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = mockk(), readerModeController = mockk(), sessionManager = mockk(), - store = mockk(), sharedViewModel = mockk() ) controller.ioScope = this @@ -560,12 +548,10 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( activity = activity, navController = navController, - browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, engineView = engineView, browserAnimator = browserAnimator, customTabSession = currentSession, - getSupportUrl = getSupportUrl, openInFenixIntent = openInFenixIntent, scope = scope, swipeRefresh = swipeRefreshLayout, @@ -574,7 +560,6 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = mockk(), readerModeController = mockk(), sessionManager = mockk(), - store = mockk(), sharedViewModel = mockk() ) @@ -602,12 +587,10 @@ class DefaultBrowserToolbarControllerTest { controller = DefaultBrowserToolbarController( activity = activity, navController = navController, - browsingModeManager = browsingModeManager, findInPageLauncher = findInPageLauncher, engineView = engineView, browserAnimator = browserAnimator, customTabSession = null, - getSupportUrl = getSupportUrl, openInFenixIntent = openInFenixIntent, scope = testScope, swipeRefresh = swipeRefreshLayout, @@ -616,7 +599,6 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = mockk(), readerModeController = mockk(), sessionManager = mockk(), - store = mockk(), sharedViewModel = mockk() ) diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 1ba0c840d..049e29ff5 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -88,7 +88,7 @@ class DefaultSessionControlControllerTest { fragmentStore = fragmentStore, navController = navController, browsingModeManager = browsingModeManager, - lifecycleScope = MainScope(), + viewLifecycleScope = MainScope(), closeTab = closeTab, closeAllTabs = closeAllTabs, getListOfTabs = getListOfTabs, diff --git a/app/src/test/java/org/mozilla/fenix/search/DefaultSearchControllerTest.kt b/app/src/test/java/org/mozilla/fenix/search/DefaultSearchControllerTest.kt index 6a36bcd9d..7d2308688 100644 --- a/app/src/test/java/org/mozilla/fenix/search/DefaultSearchControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/DefaultSearchControllerTest.kt @@ -66,7 +66,7 @@ class DefaultSearchControllerTest { context = context, store = store, navController = navController, - lifecycleScope = lifecycleScope, + viewLifecycleScope = lifecycleScope, clearToolbarFocus = clearToolbarFocus ) @@ -96,7 +96,7 @@ class DefaultSearchControllerTest { context = context, store = store, navController = navController, - lifecycleScope = this, + viewLifecycleScope = this, clearToolbarFocus = clearToolbarFocus )