1
0
Fork 0

For #10989 - Fixes memory leak caused by retaining the TabTrayView and TabsFeature

master
Jeff Boek 2020-06-02 23:03:20 -07:00 committed by Emily Kager
parent 06d9133cb9
commit bc53b94feb
2 changed files with 34 additions and 19 deletions

View File

@ -24,7 +24,9 @@ import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.concept.tabstray.Tab
import mozilla.components.feature.tabs.tabstray.TabsFeature
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
@ -36,7 +38,10 @@ import org.mozilla.fenix.utils.allowUndo
@SuppressWarnings("TooManyFunctions")
class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
private lateinit var tabTrayView: TabTrayView
private val tabsFeature = ViewBoundFeatureWrapper<TabsFeature>()
private var _tabTrayView: TabTrayView? = null
private val tabTrayView: TabTrayView
get() = _tabTrayView!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -59,11 +64,26 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tabTrayView = TabTrayView(
val isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate
_tabTrayView = TabTrayView(
view.tabLayout,
this,
(activity as HomeActivity).browsingModeManager.mode.isPrivate,
isPrivate,
requireContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
) { tabsFeature.get()?.filterTabs(it) }
tabsFeature.set(
TabsFeature(
tabTrayView.view.tabsTray,
view.context.components.core.store,
view.context.components.useCases.tabsUseCases,
view.context.components.useCases.thumbnailUseCases,
{ it.content.private == isPrivate },
{ }
),
viewLifecycleOwner,
view
)
tabLayout.setOnClickListener {
@ -90,6 +110,11 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), TabTrayInteractor {
}
}
override fun onDestroyView() {
super.onDestroyView()
_tabTrayView = null
}
override fun onTabClosed(tab: Tab) {
val sessionManager = view?.context?.components?.core?.sessionManager
val snapshot = sessionManager

View File

@ -26,7 +26,6 @@ import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.tabstray.BrowserTabsTray
import mozilla.components.concept.tabstray.Tab
import mozilla.components.concept.tabstray.TabsTray
import mozilla.components.feature.tabs.tabstray.TabsFeature
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
@ -45,8 +44,9 @@ interface TabTrayInteractor {
class TabTrayView(
private val container: ViewGroup,
private val interactor: TabTrayInteractor,
private val isPrivate: Boolean,
private val startingInLandscape: Boolean
isPrivate: Boolean,
startingInLandscape: Boolean,
private val filterTabs: ((TabSessionState) -> Boolean) -> Unit
) : LayoutContainer, TabsTray.Observer, TabLayout.OnTabSelectedListener {
val fabView = LayoutInflater.from(container.context)
.inflate(R.layout.component_tabstray_fab, container, true)
@ -57,7 +57,7 @@ class TabTrayView(
val isPrivateModeSelected: Boolean get() = view.tab_layout.selectedTabPosition == PRIVATE_TAB_ID
private val behavior = BottomSheetBehavior.from(view.tab_wrapper)
private var tabsFeature: TabsFeature
private var tabTrayItemMenu: TabTrayItemMenu
private var hasLoaded = false
@ -96,15 +96,6 @@ class TabTrayView(
view.tab_layout.addOnTabSelectedListener(this)
tabsFeature = TabsFeature(
view.tabsTray,
view.context.components.core.store,
view.context.components.useCases.tabsUseCases,
view.context.components.useCases.thumbnailUseCases,
{ it.content.private == isPrivate },
{ }
)
val tabs = if (isPrivate) {
view.context.components.core.store.state.privateTabs
} else {
@ -160,8 +151,7 @@ class TabTrayView(
interactor.onNewTabTapped(isPrivateModeSelected)
}
tabsTray.register(this)
tabsFeature.start()
tabsTray.register(this, view)
}
fun expand() {
@ -180,7 +170,7 @@ class TabTrayView(
}
toggleFabText(isPrivateModeSelected)
tabsFeature.filterTabs(filter)
filterTabs.invoke(filter)
updateState(view.context.components.core.store.state)
}