No issue: Observe only normal tabs when updating counter

upstream-sync
Jonathan Almeida 3 years ago committed by Jonathan Almeida
parent 00178e04c6
commit 729acdba39

@ -0,0 +1,44 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tabstray
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.lib.state.ext.flowScoped
import mozilla.components.support.base.feature.LifecycleAwareFeature
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
import mozilla.components.ui.tabcounter.TabCounter
/**
* Updates the tab counter to the size of [BrowserState.normalTabs].
*/
class TabCounterBinding(
private val store: BrowserStore,
private val counter: TabCounter
) : LifecycleAwareFeature {
private var scope: CoroutineScope? = null
@OptIn(ExperimentalCoroutinesApi::class)
override fun start() {
scope = store.flowScoped { flow ->
flow.map { it.normalTabs }
.ifChanged()
.collect {
counter.setCount(it.size)
}
}
}
override fun stop() {
scope?.cancel()
}
}

@ -19,16 +19,14 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.component_tabstray2.* import kotlinx.android.synthetic.main.component_tabstray2.*
import kotlinx.android.synthetic.main.component_tabstray2.view.* import kotlinx.android.synthetic.main.component_tabstray2.view.*
import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.*
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.ui.tabcounter.TabCounter import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.NavGraphDirections
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.HomeActivity
import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.HomeScreenViewModel
@ -52,6 +50,7 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
private lateinit var behavior: BottomSheetBehavior<ConstraintLayout> private lateinit var behavior: BottomSheetBehavior<ConstraintLayout>
private val tabLayoutMediator = ViewBoundFeatureWrapper<TabLayoutMediator>() private val tabLayoutMediator = ViewBoundFeatureWrapper<TabLayoutMediator>()
private val tabCounterBinding = ViewBoundFeatureWrapper<TabCounterBinding>()
private val selectTabUseCase by lazy { private val selectTabUseCase by lazy {
SelectTabUseCaseWrapper( SelectTabUseCaseWrapper(
@ -140,11 +139,14 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
view = view view = view
) )
consumeFrom(requireComponents.core.store) { tabCounterBinding.set(
view.findViewById<TabCounter>(R.id.tab_counter)?.apply { feature = TabCounterBinding(
setCount(requireComponents.core.store.state.normalTabs.size) store = requireComponents.core.store,
} counter = tab_counter
} ),
owner = this,
view = view
)
} }
override fun setCurrentTrayPosition(position: Int, smoothScroll: Boolean) { override fun setCurrentTrayPosition(position: Int, smoothScroll: Boolean) {

@ -0,0 +1,53 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tabstray
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.browser.state.action.TabListAction
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.support.test.libstate.ext.waitUntilIdle
import mozilla.components.support.test.rule.MainCoroutineRule
import mozilla.components.ui.tabcounter.TabCounter
import org.junit.Rule
import org.junit.Test
class TabCounterBindingTest {
@OptIn(ExperimentalCoroutinesApi::class)
@get:Rule
val coroutinesTestRule = MainCoroutineRule(TestCoroutineDispatcher())
@Test
fun `WHEN normalTabs changes THEN update counter`() {
val store = BrowserStore()
val counter = mockk<TabCounter>(relaxed = true)
val binding = TabCounterBinding(store, counter)
binding.start()
store.dispatch(TabListAction.AddTabAction(createTab("https://mozilla.org")))
store.waitUntilIdle()
verify { counter.setCount(1) }
}
@Test
fun `WHEN feature starts THEN update counter`() {
val store = BrowserStore()
val counter = mockk<TabCounter>(relaxed = true)
val binding = TabCounterBinding(store, counter)
binding.start()
store.waitUntilIdle()
verify { counter.setCount(0) }
}
}
Loading…
Cancel
Save