For #12721 - Remove SessionManager usages in TabCounter
parent
3be6393ea5
commit
058f44e82d
|
@ -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,
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue