From a6a50d78e039c4a26fa13b2fefe3b884fdfc44c1 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Thu, 10 Sep 2020 15:44:18 +0300 Subject: [PATCH] For #14903 - Prevent BrowserFragment's view leak --- .../mozilla/fenix/browser/BrowserFragment.kt | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 56964573b..11310a2fe 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -54,6 +54,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() private var readerModeAvailable = false + private var openInAppOnboardingObserver: OpenInAppOnboardingObserver? = null override fun onCreateView( inflater: LayoutInflater, @@ -159,15 +160,16 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } session?.register(toolbarSessionObserver, viewLifecycleOwner, autoPause = true) - if (settings.shouldShowOpenInAppBanner) { - session?.register( - OpenInAppOnboardingObserver( - context = context, - navController = findNavController(), - settings = settings, - appLinksUseCases = context.components.useCases.appLinksUseCases, - container = browserToolbarView.view.parent as ViewGroup - ), + if (settings.shouldShowOpenInAppBanner && session != null) { + openInAppOnboardingObserver = OpenInAppOnboardingObserver( + context = context, + navController = findNavController(), + settings = settings, + appLinksUseCases = context.components.useCases.appLinksUseCases, + container = browserToolbarView.view.parent as ViewGroup + ) + session.register( + openInAppOnboardingObserver!!, owner = this, autoPause = true ) @@ -188,6 +190,16 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { subscribeToTabCollections() } + override fun onStop() { + super.onStop() + // This observer initialized in onStart has a reference to fragment's view. + // Prevent it leaking the view after the latter onDestroyView. + if (openInAppOnboardingObserver != null) { + getSessionById()?.unregister(openInAppOnboardingObserver!!) + openInAppOnboardingObserver = null + } + } + private fun subscribeToTabCollections() { Observer> { requireComponents.core.tabCollectionStorage.cachedTabCollections = it