From 058f44e82d688ee24b15e93f5b0589421c6851ad Mon Sep 17 00:00:00 2001 From: ekager Date: Thu, 23 Jul 2020 21:20:06 -0400 Subject: [PATCH] For #12721 - Remove SessionManager usages in TabCounter --- .../components/toolbar/BrowserToolbarView.kt | 3 +- .../toolbar/TabCounterToolbarButton.kt | 50 +++++++------------ .../components/toolbar/ToolbarIntegration.kt | 14 +++--- 3 files changed, 29 insertions(+), 38 deletions(-) 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 d725a9f3d..ad282fd7b 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 @@ -57,6 +57,7 @@ interface BrowserToolbarViewInteractor { fun onScrolled(offset: Int) fun onReaderModePressed(enabled: Boolean) } + @SuppressWarnings("LargeClass") class BrowserToolbarView( private val container: ViewGroup, @@ -243,7 +244,7 @@ class BrowserToolbarView( menuToolbar, ShippedDomainsProvider().also { it.initialize(this) }, components.core.historyStorage, - components.core.sessionManager, + lifecycleOwner, sessionId = null, isPrivate = sessionManager.selectedSession?.private ?: false, interactor = interactor, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt index e282e23a2..e841d7c69 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/TabCounterToolbarButton.kt @@ -8,17 +8,21 @@ import android.content.Context import android.util.TypedValue import android.view.View import android.view.ViewGroup +import androidx.lifecycle.LifecycleOwner +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.map import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.BrowserMenuDivider import mozilla.components.browser.menu.item.BrowserMenuImageText -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.settings import org.mozilla.fenix.theme.ThemeManager import java.lang.ref.WeakReference @@ -26,8 +30,9 @@ import java.lang.ref.WeakReference /** * A [Toolbar.Action] implementation that shows a [TabCounter]. */ +@OptIn(ExperimentalCoroutinesApi::class) class TabCounterToolbarButton( - private val sessionManager: SessionManager, + private val lifecycleOwner: LifecycleOwner, private val isPrivate: Boolean, private val onItemTapped: (TabCounterMenuItem) -> Unit = {}, private val showTabs: () -> Unit @@ -35,7 +40,11 @@ class TabCounterToolbarButton( private var reference: WeakReference = WeakReference(null) override fun createView(parent: ViewGroup): View { - sessionManager.register(sessionManagerObserver, view = parent) + parent.context.components.core.store.flowScoped(lifecycleOwner) { flow -> + flow.map { state -> state.getNormalOrPrivateTabs(isPrivate).size } + .ifChanged() + .collect { tabs -> updateCount(tabs) } + } val view = TabCounter(parent.context).apply { reference = WeakReference(this) @@ -50,10 +59,11 @@ class TabCounterToolbarButton( addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View?) { - setCount(sessionManager.sessionsOfType(private = isPrivate).count()) + setCount(context.components.core.store.state.getNormalOrPrivateTabs(isPrivate).size) } - override fun onViewDetachedFromWindow(v: View?) { /* no-op */ } + override fun onViewDetachedFromWindow(v: View?) { /* no-op */ + } }) } @@ -70,12 +80,8 @@ class TabCounterToolbarButton( override fun bind(view: View) = Unit - private fun updateCount() { - val count = sessionManager.sessionsOfType(private = isPrivate).count() - - reference.get()?.let { - it.setCountWithAnimation(count) - } + private fun updateCount(count: Int) { + reference.get()?.setCountWithAnimation(count) } private fun getTabContextMenu(context: Context): BrowserMenu { @@ -119,22 +125,4 @@ class TabCounterToolbarButton( } ).build(context) } - - private val sessionManagerObserver = object : SessionManager.Observer { - override fun onSessionAdded(session: Session) { - updateCount() - } - - override fun onSessionRemoved(session: Session) { - updateCount() - } - - override fun onSessionsRestored() { - updateCount() - } - - override fun onAllSessionsRemoved() { - updateCount() - } - } } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt index fa183a89a..88dc6fc11 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt @@ -6,10 +6,10 @@ package org.mozilla.fenix.components.toolbar import android.content.Context import androidx.appcompat.content.res.AppCompatResources +import androidx.lifecycle.LifecycleOwner import com.airbnb.lottie.LottieCompositionFactory import com.airbnb.lottie.LottieDrawable import mozilla.components.browser.domains.autocomplete.DomainAutocompleteProvider -import mozilla.components.browser.session.SessionManager import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.display.DisplayToolbar import mozilla.components.concept.engine.Engine @@ -68,13 +68,14 @@ abstract class ToolbarIntegration( } } +@Suppress("LongParameterList") class DefaultToolbarIntegration( context: Context, toolbar: BrowserToolbar, toolbarMenu: ToolbarMenu, domainAutocompleteProvider: DomainAutocompleteProvider, historyStorage: HistoryStorage, - sessionManager: SessionManager, + lifecycleOwner: LifecycleOwner, sessionId: String? = null, isPrivate: Boolean, interactor: BrowserToolbarViewInteractor, @@ -135,10 +136,11 @@ class DefaultToolbarIntegration( val onTabCounterMenuItemTapped = { item: TabCounterMenuItem -> interactor.onTabCounterMenuItemTapped(item) } - val tabsAction = TabCounterToolbarButton(sessionManager, isPrivate, onTabCounterMenuItemTapped) { - toolbar.hideKeyboard() - interactor.onTabCounterClicked() - } + val tabsAction = + TabCounterToolbarButton(lifecycleOwner, isPrivate, onTabCounterMenuItemTapped) { + toolbar.hideKeyboard() + interactor.onTabCounterClicked() + } toolbar.addBrowserAction(tabsAction) val engineForSpeculativeConnects = if (!isPrivate) engine else null