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 kotlinx.android.synthetic.main.component_tabstray2.*
import kotlinx.android.synthetic.main.component_tabstray2.view.*
import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.*
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.ui.tabcounter.TabCounter
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.home.HomeScreenViewModel
@ -52,6 +50,7 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
private lateinit var behavior: BottomSheetBehavior<ConstraintLayout>
private val tabLayoutMediator = ViewBoundFeatureWrapper<TabLayoutMediator>()
private val tabCounterBinding = ViewBoundFeatureWrapper<TabCounterBinding>()
private val selectTabUseCase by lazy {
SelectTabUseCaseWrapper(
@ -140,11 +139,14 @@ class TabsTrayFragment : AppCompatDialogFragment(), TabsTrayInteractor {
view = view
)
consumeFrom(requireComponents.core.store) {
view.findViewById<TabCounter>(R.id.tab_counter)?.apply {
setCount(requireComponents.core.store.state.normalTabs.size)
}
}
tabCounterBinding.set(
feature = TabCounterBinding(
store = requireComponents.core.store,
counter = tab_counter
),
owner = this,
view = view
)
}
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