1
0
Fork 0

For #12721 - Remove SessionManager usages in TabCounter

master
ekager 2020-07-23 21:20:06 -04:00 committed by Emily Kager
parent 3be6393ea5
commit 058f44e82d
3 changed files with 29 additions and 38 deletions

View File

@ -57,6 +57,7 @@ interface BrowserToolbarViewInteractor {
fun onScrolled(offset: Int) fun onScrolled(offset: Int)
fun onReaderModePressed(enabled: Boolean) fun onReaderModePressed(enabled: Boolean)
} }
@SuppressWarnings("LargeClass") @SuppressWarnings("LargeClass")
class BrowserToolbarView( class BrowserToolbarView(
private val container: ViewGroup, private val container: ViewGroup,
@ -243,7 +244,7 @@ class BrowserToolbarView(
menuToolbar, menuToolbar,
ShippedDomainsProvider().also { it.initialize(this) }, ShippedDomainsProvider().also { it.initialize(this) },
components.core.historyStorage, components.core.historyStorage,
components.core.sessionManager, lifecycleOwner,
sessionId = null, sessionId = null,
isPrivate = sessionManager.selectedSession?.private ?: false, isPrivate = sessionManager.selectedSession?.private ?: false,
interactor = interactor, interactor = interactor,

View File

@ -8,17 +8,21 @@ import android.content.Context
import android.util.TypedValue import android.util.TypedValue
import android.view.View import android.view.View
import android.view.ViewGroup 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.BrowserMenu
import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.BrowserMenuDivider import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.session.Session import mozilla.components.browser.state.selector.getNormalOrPrivateTabs
import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.toolbar.Toolbar 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.R
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.theme.ThemeManager
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -26,8 +30,9 @@ import java.lang.ref.WeakReference
/** /**
* A [Toolbar.Action] implementation that shows a [TabCounter]. * A [Toolbar.Action] implementation that shows a [TabCounter].
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class TabCounterToolbarButton( class TabCounterToolbarButton(
private val sessionManager: SessionManager, private val lifecycleOwner: LifecycleOwner,
private val isPrivate: Boolean, private val isPrivate: Boolean,
private val onItemTapped: (TabCounterMenuItem) -> Unit = {}, private val onItemTapped: (TabCounterMenuItem) -> Unit = {},
private val showTabs: () -> Unit private val showTabs: () -> Unit
@ -35,7 +40,11 @@ class TabCounterToolbarButton(
private var reference: WeakReference<TabCounter> = WeakReference<TabCounter>(null) private var reference: WeakReference<TabCounter> = WeakReference<TabCounter>(null)
override fun createView(parent: ViewGroup): View { 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 { val view = TabCounter(parent.context).apply {
reference = WeakReference(this) reference = WeakReference(this)
@ -50,10 +59,11 @@ class TabCounterToolbarButton(
addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View?) { 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 override fun bind(view: View) = Unit
private fun updateCount() { private fun updateCount(count: Int) {
val count = sessionManager.sessionsOfType(private = isPrivate).count() reference.get()?.setCountWithAnimation(count)
reference.get()?.let {
it.setCountWithAnimation(count)
}
} }
private fun getTabContextMenu(context: Context): BrowserMenu { private fun getTabContextMenu(context: Context): BrowserMenu {
@ -119,22 +125,4 @@ class TabCounterToolbarButton(
} }
).build(context) ).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()
}
}
} }

View File

@ -6,10 +6,10 @@ package org.mozilla.fenix.components.toolbar
import android.content.Context import android.content.Context
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.lifecycle.LifecycleOwner
import com.airbnb.lottie.LottieCompositionFactory import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.LottieDrawable import com.airbnb.lottie.LottieDrawable
import mozilla.components.browser.domains.autocomplete.DomainAutocompleteProvider import mozilla.components.browser.domains.autocomplete.DomainAutocompleteProvider
import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.display.DisplayToolbar import mozilla.components.browser.toolbar.display.DisplayToolbar
import mozilla.components.concept.engine.Engine import mozilla.components.concept.engine.Engine
@ -68,13 +68,14 @@ abstract class ToolbarIntegration(
} }
} }
@Suppress("LongParameterList")
class DefaultToolbarIntegration( class DefaultToolbarIntegration(
context: Context, context: Context,
toolbar: BrowserToolbar, toolbar: BrowserToolbar,
toolbarMenu: ToolbarMenu, toolbarMenu: ToolbarMenu,
domainAutocompleteProvider: DomainAutocompleteProvider, domainAutocompleteProvider: DomainAutocompleteProvider,
historyStorage: HistoryStorage, historyStorage: HistoryStorage,
sessionManager: SessionManager, lifecycleOwner: LifecycleOwner,
sessionId: String? = null, sessionId: String? = null,
isPrivate: Boolean, isPrivate: Boolean,
interactor: BrowserToolbarViewInteractor, interactor: BrowserToolbarViewInteractor,
@ -135,10 +136,11 @@ class DefaultToolbarIntegration(
val onTabCounterMenuItemTapped = { item: TabCounterMenuItem -> val onTabCounterMenuItemTapped = { item: TabCounterMenuItem ->
interactor.onTabCounterMenuItemTapped(item) interactor.onTabCounterMenuItemTapped(item)
} }
val tabsAction = TabCounterToolbarButton(sessionManager, isPrivate, onTabCounterMenuItemTapped) { val tabsAction =
toolbar.hideKeyboard() TabCounterToolbarButton(lifecycleOwner, isPrivate, onTabCounterMenuItemTapped) {
interactor.onTabCounterClicked() toolbar.hideKeyboard()
} interactor.onTabCounterClicked()
}
toolbar.addBrowserAction(tabsAction) toolbar.addBrowserAction(tabsAction)
val engineForSpeculativeConnects = if (!isPrivate) engine else null val engineForSpeculativeConnects = if (!isPrivate) engine else null