mirror of
https://github.com/thunderbird/thunderbird-android.git
synced 2024-09-19 19:52:14 +02:00
Add GetDrawerConfig use case and DrawerConfig entity
This commit is contained in:
parent
b8c7457208
commit
e36d37a6f2
@ -0,0 +1,10 @@
|
||||
package app.k9mail.feature.navigation.drawer
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
|
||||
interface NavigationDrawerExternalContract {
|
||||
|
||||
fun interface DrawerConfigLoader {
|
||||
fun loadDrawerConfig(): DrawerConfig
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ package app.k9mail.feature.navigation.drawer
|
||||
import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
|
||||
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDisplayAccounts
|
||||
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDisplayFoldersForAccount
|
||||
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDrawerConfig
|
||||
import app.k9mail.feature.navigation.drawer.legacy.AccountsViewModel
|
||||
import app.k9mail.feature.navigation.drawer.legacy.FoldersViewModel
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerViewModel
|
||||
@ -14,6 +15,12 @@ import org.koin.dsl.module
|
||||
|
||||
val navigationDrawerModule: Module = module {
|
||||
|
||||
single<UseCase.GetDrawerConfig> {
|
||||
GetDrawerConfig(
|
||||
configProver = get(),
|
||||
)
|
||||
}
|
||||
|
||||
single<UseCase.GetDisplayAccounts> {
|
||||
GetDisplayAccounts(
|
||||
accountManager = get(),
|
||||
@ -48,6 +55,7 @@ val navigationDrawerModule: Module = module {
|
||||
|
||||
viewModel {
|
||||
DrawerViewModel(
|
||||
getDrawerConfig = get(),
|
||||
getDisplayAccounts = get(),
|
||||
getDisplayFoldersForAccount = get(),
|
||||
)
|
||||
|
@ -1,12 +1,17 @@
|
||||
package app.k9mail.feature.navigation.drawer.domain
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import app.k9mail.legacy.ui.folder.DisplayFolder
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface DomainContract {
|
||||
|
||||
interface UseCase {
|
||||
fun interface GetDrawerConfig {
|
||||
operator fun invoke(): Flow<DrawerConfig>
|
||||
}
|
||||
|
||||
fun interface GetDisplayAccounts {
|
||||
operator fun invoke(): Flow<List<DisplayAccount>>
|
||||
}
|
||||
|
@ -0,0 +1,6 @@
|
||||
package app.k9mail.feature.navigation.drawer.domain.entity
|
||||
|
||||
data class DrawerConfig(
|
||||
val showUnifiedInbox: Boolean,
|
||||
val showStarredCount: Boolean,
|
||||
)
|
@ -0,0 +1,17 @@
|
||||
package app.k9mail.feature.navigation.drawer.domain.usecase
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract.DrawerConfigLoader
|
||||
import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flow
|
||||
|
||||
class GetDrawerConfig(
|
||||
private val configProver: DrawerConfigLoader,
|
||||
) : UseCase.GetDrawerConfig {
|
||||
override operator fun invoke(): Flow<DrawerConfig> {
|
||||
return flow {
|
||||
emit(configProver.loadDrawerConfig())
|
||||
}
|
||||
}
|
||||
}
|
@ -50,7 +50,7 @@ fun DrawerContent(
|
||||
onFolderClick = { folder ->
|
||||
onEvent(Event.OnFolderClick(folder))
|
||||
},
|
||||
showStarredCount = state.showStarredCount,
|
||||
showStarredCount = state.config.showStarredCount,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package app.k9mail.feature.navigation.drawer.ui
|
||||
import androidx.compose.runtime.Stable
|
||||
import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import app.k9mail.legacy.account.Account
|
||||
import app.k9mail.legacy.ui.folder.DisplayFolder
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
@ -14,11 +15,14 @@ interface DrawerContract {
|
||||
|
||||
@Stable
|
||||
data class State(
|
||||
val config: DrawerConfig = DrawerConfig(
|
||||
showUnifiedInbox = false,
|
||||
showStarredCount = false,
|
||||
),
|
||||
val accounts: ImmutableList<DisplayAccount> = persistentListOf(),
|
||||
val currentAccount: DisplayAccount? = null,
|
||||
val folders: ImmutableList<DisplayFolder> = persistentListOf(),
|
||||
val selectedFolder: DisplayFolder? = null,
|
||||
val showStarredCount: Boolean = false,
|
||||
val isLoading: Boolean = false,
|
||||
)
|
||||
|
||||
|
@ -4,6 +4,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
|
||||
import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
|
||||
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDrawerConfig
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Effect
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State
|
||||
@ -21,6 +22,7 @@ import kotlinx.coroutines.launch
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
class DrawerViewModel(
|
||||
private val getDrawerConfig: UseCase.GetDrawerConfig,
|
||||
private val getDisplayAccounts: UseCase.GetDisplayAccounts,
|
||||
private val getDisplayFoldersForAccount: UseCase.GetDisplayFoldersForAccount,
|
||||
initialState: State = State(),
|
||||
@ -30,6 +32,14 @@ class DrawerViewModel(
|
||||
ViewModel {
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
getDrawerConfig().collectLatest { config ->
|
||||
updateState {
|
||||
it.copy(config = config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
viewModelScope.launch {
|
||||
loadAccounts()
|
||||
}
|
||||
|
@ -0,0 +1,32 @@
|
||||
package app.k9mail.feature.navigation.drawer.domain.usecase
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import assertk.assertThat
|
||||
import assertk.assertions.isEqualTo
|
||||
import kotlin.test.Test
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.test.runTest
|
||||
|
||||
class GetDrawerConfigTest {
|
||||
|
||||
@Test
|
||||
fun `should get drawer config`() = runTest {
|
||||
val drawerConfig = DrawerConfig(
|
||||
showUnifiedInbox = true,
|
||||
showStarredCount = true,
|
||||
)
|
||||
|
||||
val testSubject = GetDrawerConfig(
|
||||
configProver = { drawerConfig },
|
||||
)
|
||||
|
||||
val result = testSubject().first()
|
||||
|
||||
assertThat(result).isEqualTo(
|
||||
DrawerConfig(
|
||||
showUnifiedInbox = true,
|
||||
showStarredCount = true,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package app.k9mail.feature.navigation.drawer.ui
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State
|
||||
import assertk.assertThat
|
||||
import assertk.assertions.isEqualTo
|
||||
@ -14,11 +15,14 @@ class DrawerStateTest {
|
||||
|
||||
assertThat(state).isEqualTo(
|
||||
State(
|
||||
config = DrawerConfig(
|
||||
showUnifiedInbox = false,
|
||||
showStarredCount = false,
|
||||
),
|
||||
accounts = persistentListOf(),
|
||||
currentAccount = null,
|
||||
folders = persistentListOf(),
|
||||
selectedFolder = null,
|
||||
showStarredCount = false,
|
||||
isLoading = false,
|
||||
),
|
||||
)
|
||||
|
@ -7,6 +7,7 @@ import app.k9mail.core.ui.compose.testing.mvi.assertThatAndEffectTurbineConsumed
|
||||
import app.k9mail.core.ui.compose.testing.mvi.eventStateTest
|
||||
import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Effect
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event
|
||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State
|
||||
@ -32,6 +33,27 @@ class DrawerViewModelTest {
|
||||
@get:Rule
|
||||
val mainDispatcherRule = MainDispatcherRule()
|
||||
|
||||
@Test
|
||||
fun `should collect drawer config`() = runTest {
|
||||
val drawerConfig = createDrawerConfig()
|
||||
val getDrawerConfigFlow = MutableStateFlow(drawerConfig)
|
||||
val testSubject = createTestSubject(
|
||||
drawerConfigFlow = getDrawerConfigFlow,
|
||||
)
|
||||
|
||||
advanceUntilIdle()
|
||||
|
||||
assertThat(testSubject.state.value.config).isEqualTo(drawerConfig)
|
||||
|
||||
val newDrawerConfig = createDrawerConfig(showUnifiedInbox = true)
|
||||
|
||||
getDrawerConfigFlow.emit(newDrawerConfig)
|
||||
|
||||
advanceUntilIdle()
|
||||
|
||||
assertThat(testSubject.state.value.config).isEqualTo(newDrawerConfig)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `should change loading state when OnRefresh event is received`() = runTest {
|
||||
val testSubject = createTestSubject()
|
||||
@ -51,7 +73,7 @@ class DrawerViewModelTest {
|
||||
|
||||
@Test
|
||||
fun `should collect display accounts when created and select first as current`() = runTest {
|
||||
val displayAccounts = createDisplayAccountList(3)
|
||||
val displayAccounts = createDisplayAccountList(2)
|
||||
val getDisplayAccountsFlow = MutableStateFlow(displayAccounts)
|
||||
val testSubject = createTestSubject(
|
||||
displayAccountsFlow = getDisplayAccountsFlow,
|
||||
@ -202,10 +224,12 @@ class DrawerViewModelTest {
|
||||
}
|
||||
|
||||
private fun createTestSubject(
|
||||
drawerConfigFlow: Flow<DrawerConfig> = flow { emit(createDrawerConfig()) },
|
||||
displayAccountsFlow: Flow<List<DisplayAccount>> = flow { emit(emptyList()) },
|
||||
displayFoldersMap: Map<String, List<DisplayFolder>> = emptyMap(),
|
||||
): DrawerViewModel {
|
||||
return DrawerViewModel(
|
||||
getDrawerConfig = { drawerConfigFlow },
|
||||
getDisplayAccounts = { displayAccountsFlow },
|
||||
getDisplayFoldersForAccount = { accountUuid ->
|
||||
flow { emit(displayFoldersMap[accountUuid] ?: emptyList()) }
|
||||
@ -213,6 +237,16 @@ class DrawerViewModelTest {
|
||||
)
|
||||
}
|
||||
|
||||
private fun createDrawerConfig(
|
||||
showUnifiedInbox: Boolean = false,
|
||||
showStarredCount: Boolean = false,
|
||||
): DrawerConfig {
|
||||
return DrawerConfig(
|
||||
showUnifiedInbox = showUnifiedInbox,
|
||||
showStarredCount = showStarredCount,
|
||||
)
|
||||
}
|
||||
|
||||
private fun createDisplayAccount(
|
||||
uuid: String = "uuid",
|
||||
name: String = "name",
|
||||
|
@ -15,6 +15,7 @@ dependencies {
|
||||
|
||||
implementation(projects.feature.account.setup)
|
||||
implementation(projects.feature.account.edit)
|
||||
implementation(projects.feature.navigation.drawer)
|
||||
implementation(projects.feature.settings.import)
|
||||
|
||||
implementation(projects.feature.widget.unread)
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.fsck.k9.feature
|
||||
|
||||
import app.k9mail.feature.launcher.FeatureLauncherExternalContract
|
||||
import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract
|
||||
import org.koin.android.ext.koin.androidContext
|
||||
import org.koin.dsl.module
|
||||
|
||||
@ -10,4 +11,8 @@ val featureModule = module {
|
||||
context = androidContext(),
|
||||
)
|
||||
}
|
||||
|
||||
single<NavigationDrawerExternalContract.DrawerConfigLoader> {
|
||||
NavigationDrawerConfigLoader()
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package com.fsck.k9.feature
|
||||
|
||||
import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract.DrawerConfigLoader
|
||||
import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig
|
||||
import com.fsck.k9.K9
|
||||
|
||||
class NavigationDrawerConfigLoader : DrawerConfigLoader {
|
||||
override fun loadDrawerConfig(): DrawerConfig {
|
||||
return DrawerConfig(
|
||||
showUnifiedInbox = K9.isShowUnifiedInbox,
|
||||
showStarredCount = K9.isShowStarredCount,
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user