[fenix] Close https://github.com/mozilla-mobile/fenix/issues/22061: Let TabSorter decide if title header should be shown in tabs tray
parent
d09f8d1a00
commit
593b08780f
@ -1,42 +0,0 @@
|
||||
/* 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.browser
|
||||
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.map
|
||||
import mozilla.components.browser.state.state.BrowserState
|
||||
import mozilla.components.browser.state.store.BrowserStore
|
||||
import mozilla.components.lib.state.helpers.AbstractBinding
|
||||
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
|
||||
import org.mozilla.fenix.tabstray.ext.getNormalTrayTabs
|
||||
import org.mozilla.fenix.tabstray.ext.getSearchTabGroups
|
||||
import org.mozilla.fenix.utils.Settings
|
||||
|
||||
/**
|
||||
* A binding class to notify an observer to show a title if there is at least one tab available.
|
||||
*/
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class TitleHeaderBinding(
|
||||
store: BrowserStore,
|
||||
private val settings: Settings,
|
||||
private val showHeader: (Boolean) -> Unit
|
||||
) : AbstractBinding<BrowserState>(store) {
|
||||
override suspend fun onState(flow: Flow<BrowserState>) {
|
||||
val groupsEnabled = settings.searchTermTabGroupsAreEnabled
|
||||
val inactiveEnabled = settings.inactiveTabsAreEnabled
|
||||
|
||||
flow.map { it.getSearchTabGroups(groupsEnabled) to it.getNormalTrayTabs(groupsEnabled, inactiveEnabled) }
|
||||
.ifChanged()
|
||||
.collect { (groups, normalTrayTabs) ->
|
||||
if (groups.isEmpty() || normalTrayTabs.isEmpty()) {
|
||||
showHeader(false)
|
||||
} else {
|
||||
showHeader(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,141 +0,0 @@
|
||||
/* 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.browser
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.test.runBlockingTest
|
||||
import mozilla.components.browser.state.action.TabListAction
|
||||
import mozilla.components.browser.state.state.BrowserState
|
||||
import mozilla.components.browser.state.state.createTab
|
||||
import mozilla.components.browser.state.store.BrowserStore
|
||||
import mozilla.components.concept.storage.HistoryMetadataKey
|
||||
import mozilla.components.support.test.ext.joinBlocking
|
||||
import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
||||
import mozilla.components.support.test.rule.MainCoroutineRule
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.mozilla.fenix.utils.Settings
|
||||
|
||||
@ExperimentalCoroutinesApi
|
||||
class TitleHeaderBindingTest {
|
||||
|
||||
@get:Rule
|
||||
val coroutinesTestRule = MainCoroutineRule()
|
||||
|
||||
@Test
|
||||
fun `WHEN normal tabs are added to the list THEN return false`() = runBlockingTest {
|
||||
var result = false
|
||||
val store = BrowserStore()
|
||||
val settings: Settings = mockk(relaxed = true)
|
||||
val binding = TitleHeaderBinding(store, settings) { result = it }
|
||||
|
||||
every { settings.inactiveTabsAreEnabled } returns true
|
||||
|
||||
binding.start()
|
||||
|
||||
store.dispatch(TabListAction.AddTabAction(createTab("https://mozilla.org"))).joinBlocking()
|
||||
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertFalse(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN grouped and normal tabs are added THEN return true`() = runBlockingTest {
|
||||
var result = false
|
||||
val store = BrowserStore(
|
||||
initialState = BrowserState(
|
||||
listOf(
|
||||
createTab(
|
||||
url = "https://mozilla.org",
|
||||
historyMetadata = HistoryMetadataKey(
|
||||
url = "https://getpocket.com",
|
||||
searchTerm = "Mozilla"
|
||||
)
|
||||
),
|
||||
createTab(
|
||||
url = "https://firefox.com",
|
||||
historyMetadata = HistoryMetadataKey(
|
||||
url = "https://getpocket.com",
|
||||
searchTerm = "Mozilla"
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
val settings: Settings = mockk(relaxed = true)
|
||||
val binding = TitleHeaderBinding(store, settings) { result = it }
|
||||
|
||||
every { settings.inactiveTabsAreEnabled } returns true
|
||||
every { settings.searchTermTabGroupsAreEnabled } returns true
|
||||
|
||||
binding.start()
|
||||
|
||||
store.dispatch(
|
||||
TabListAction.AddTabAction(
|
||||
createTab(
|
||||
url = "https://getpocket.com",
|
||||
)
|
||||
)
|
||||
).joinBlocking()
|
||||
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN grouped tab is added to the list THEN return false`() = runBlockingTest {
|
||||
var result = false
|
||||
val store = BrowserStore()
|
||||
val settings: Settings = mockk(relaxed = true)
|
||||
val binding = TitleHeaderBinding(store, settings) { result = it }
|
||||
|
||||
every { settings.inactiveTabsAreEnabled } returns true
|
||||
every { settings.searchTermTabGroupsAreEnabled } returns true
|
||||
|
||||
binding.start()
|
||||
|
||||
store.dispatch(
|
||||
TabListAction.AddTabAction(
|
||||
createTab(
|
||||
url = "https://mozilla.org",
|
||||
historyMetadata = HistoryMetadataKey(
|
||||
url = "https://getpocket.com",
|
||||
searchTerm = "Mozilla"
|
||||
)
|
||||
)
|
||||
)
|
||||
).joinBlocking()
|
||||
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertFalse(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN normal tabs are all removed THEN return false`() = runBlockingTest {
|
||||
var result = false
|
||||
val store = BrowserStore(
|
||||
initialState = BrowserState(
|
||||
tabs = listOf(createTab("https://getpocket.com", id = "123"))
|
||||
)
|
||||
)
|
||||
val settings: Settings = mockk(relaxed = true)
|
||||
val binding = TitleHeaderBinding(store, settings) { result = it }
|
||||
|
||||
binding.start()
|
||||
|
||||
store.dispatch(TabListAction.RemoveTabAction("123")).joinBlocking()
|
||||
|
||||
store.waitUntilIdle()
|
||||
|
||||
assertFalse(result)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue