mirror of
https://github.com/thunderbird/thunderbird-android.git
synced 2024-09-19 19:52:14 +02:00
Add SettingList and SettingListItem
This commit is contained in:
parent
a7389ebda6
commit
2a6193721e
@ -0,0 +1,18 @@
|
|||||||
|
package app.k9mail.feature.navigation.drawer.ui.setting
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemes
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
fun SettingListItemPreview() {
|
||||||
|
PreviewWithThemes {
|
||||||
|
SettingListItem(
|
||||||
|
label = "Settings",
|
||||||
|
onClick = {},
|
||||||
|
imageVector = Icons.Outlined.Settings,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package app.k9mail.feature.navigation.drawer.ui.setting
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
fun SettingListPreview() {
|
||||||
|
PreviewWithTheme {
|
||||||
|
SettingList(
|
||||||
|
onAccountSelectorClick = {},
|
||||||
|
onManageFoldersClick = {},
|
||||||
|
showAccountSelector = false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
fun SettingListShowAccountSelectorPreview() {
|
||||||
|
PreviewWithTheme {
|
||||||
|
SettingList(
|
||||||
|
onAccountSelectorClick = {},
|
||||||
|
onManageFoldersClick = {},
|
||||||
|
showAccountSelector = true,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -17,6 +17,8 @@ class FolderDrawer(
|
|||||||
override val parent: AppCompatActivity,
|
override val parent: AppCompatActivity,
|
||||||
private val openAccount: (account: Account) -> Unit,
|
private val openAccount: (account: Account) -> Unit,
|
||||||
private val openFolder: (folderId: Long) -> Unit,
|
private val openFolder: (folderId: Long) -> Unit,
|
||||||
|
private val openManageFolders: () -> Unit,
|
||||||
|
private val openSettings: () -> Unit,
|
||||||
createDrawerListener: () -> DrawerLayout.DrawerListener,
|
createDrawerListener: () -> DrawerLayout.DrawerListener,
|
||||||
) : NavigationDrawer, KoinComponent {
|
) : NavigationDrawer, KoinComponent {
|
||||||
|
|
||||||
@ -38,6 +40,8 @@ class FolderDrawer(
|
|||||||
DrawerView(
|
DrawerView(
|
||||||
openAccount = openAccount,
|
openAccount = openAccount,
|
||||||
openFolder = openFolder,
|
openFolder = openFolder,
|
||||||
|
openManageFolders = openManageFolders,
|
||||||
|
openSettings = openSettings,
|
||||||
closeDrawer = { close() },
|
closeDrawer = { close() },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ private const val EN_SPACE = "\u2000"
|
|||||||
@Suppress("MagicNumber", "TooManyFunctions", "LongParameterList")
|
@Suppress("MagicNumber", "TooManyFunctions", "LongParameterList")
|
||||||
class LegacyDrawer(
|
class LegacyDrawer(
|
||||||
override val parent: AppCompatActivity,
|
override val parent: AppCompatActivity,
|
||||||
private val openFolders: () -> Unit,
|
private val openManageFolders: () -> Unit,
|
||||||
private val openUnifiedInbox: () -> Unit,
|
private val openUnifiedInbox: () -> Unit,
|
||||||
private val openFolder: (folderId: Long) -> Unit,
|
private val openFolder: (folderId: Long) -> Unit,
|
||||||
private val openAccount: (account: Account) -> Boolean,
|
private val openAccount: (account: Account) -> Boolean,
|
||||||
@ -352,7 +352,7 @@ class LegacyDrawer(
|
|||||||
private fun handleItemClickListener(drawerItem: IDrawerItem<*>) {
|
private fun handleItemClickListener(drawerItem: IDrawerItem<*>) {
|
||||||
when (drawerItem.identifier) {
|
when (drawerItem.identifier) {
|
||||||
DRAWER_ID_PREFERENCES -> openSettings()
|
DRAWER_ID_PREFERENCES -> openSettings()
|
||||||
DRAWER_ID_FOLDERS -> openFolders()
|
DRAWER_ID_FOLDERS -> openManageFolders()
|
||||||
DRAWER_ID_UNIFIED_INBOX -> openUnifiedInbox()
|
DRAWER_ID_UNIFIED_INBOX -> openUnifiedInbox()
|
||||||
else -> {
|
else -> {
|
||||||
val folder = drawerItem.tag as Folder
|
val folder = drawerItem.tag as Folder
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package app.k9mail.feature.navigation.drawer.ui
|
package app.k9mail.feature.navigation.drawer.ui
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal
|
import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal
|
||||||
import app.k9mail.core.ui.compose.designsystem.atom.Surface
|
import app.k9mail.core.ui.compose.designsystem.atom.Surface
|
||||||
import app.k9mail.core.ui.compose.theme2.MainTheme
|
|
||||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event
|
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event
|
||||||
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State
|
import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State
|
||||||
import app.k9mail.feature.navigation.drawer.ui.account.AccountView
|
import app.k9mail.feature.navigation.drawer.ui.account.AccountView
|
||||||
import app.k9mail.feature.navigation.drawer.ui.folder.FolderList
|
import app.k9mail.feature.navigation.drawer.ui.folder.FolderList
|
||||||
|
import app.k9mail.feature.navigation.drawer.ui.setting.SettingList
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun DrawerContent(
|
fun DrawerContent(
|
||||||
@ -28,11 +26,7 @@ fun DrawerContent(
|
|||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize(),
|
||||||
.padding(
|
|
||||||
vertical = MainTheme.spacings.oneHalf,
|
|
||||||
),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
|
|
||||||
) {
|
) {
|
||||||
state.selectedAccount?.let {
|
state.selectedAccount?.let {
|
||||||
AccountView(
|
AccountView(
|
||||||
@ -51,7 +45,16 @@ fun DrawerContent(
|
|||||||
onEvent(Event.OnFolderClick(folder))
|
onEvent(Event.OnFolderClick(folder))
|
||||||
},
|
},
|
||||||
showStarredCount = state.config.showStarredCount,
|
showStarredCount = state.config.showStarredCount,
|
||||||
|
modifier = Modifier.weight(1f),
|
||||||
)
|
)
|
||||||
|
Column {
|
||||||
|
DividerHorizontal()
|
||||||
|
SettingList(
|
||||||
|
onAccountSelectorClick = { onEvent(Event.OnAccountSelectorClick) },
|
||||||
|
onManageFoldersClick = { onEvent(Event.OnManageFoldersClick) },
|
||||||
|
showAccountSelector = state.showAccountSelector,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ interface DrawerContract {
|
|||||||
val selectedAccount: DisplayAccount? = null,
|
val selectedAccount: DisplayAccount? = null,
|
||||||
val folders: ImmutableList<DisplayAccountFolder> = persistentListOf(),
|
val folders: ImmutableList<DisplayAccountFolder> = persistentListOf(),
|
||||||
val selectedFolder: DisplayAccountFolder? = null,
|
val selectedFolder: DisplayAccountFolder? = null,
|
||||||
|
val showAccountSelector: Boolean = false,
|
||||||
val isLoading: Boolean = false,
|
val isLoading: Boolean = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,12 +31,17 @@ interface DrawerContract {
|
|||||||
data class OnAccountClick(val account: DisplayAccount) : Event
|
data class OnAccountClick(val account: DisplayAccount) : Event
|
||||||
data class OnAccountViewClick(val account: DisplayAccount) : Event
|
data class OnAccountViewClick(val account: DisplayAccount) : Event
|
||||||
data class OnFolderClick(val folder: DisplayAccountFolder) : Event
|
data class OnFolderClick(val folder: DisplayAccountFolder) : Event
|
||||||
|
data object OnAccountSelectorClick : Event
|
||||||
|
data object OnManageFoldersClick : Event
|
||||||
|
data object OnSettingsClick : Event
|
||||||
data object OnRefresh : Event
|
data object OnRefresh : Event
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed interface Effect {
|
sealed interface Effect {
|
||||||
data class OpenAccount(val account: Account) : Effect
|
data class OpenAccount(val account: Account) : Effect
|
||||||
data class OpenFolder(val folderId: Long) : Effect
|
data class OpenFolder(val folderId: Long) : Effect
|
||||||
|
data object OpenManageFolders : Effect
|
||||||
|
data object OpenSettings : Effect
|
||||||
data object CloseDrawer : Effect
|
data object CloseDrawer : Effect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ import org.koin.androidx.compose.koinViewModel
|
|||||||
fun DrawerView(
|
fun DrawerView(
|
||||||
openAccount: (account: Account) -> Unit,
|
openAccount: (account: Account) -> Unit,
|
||||||
openFolder: (folderId: Long) -> Unit,
|
openFolder: (folderId: Long) -> Unit,
|
||||||
|
openManageFolders: () -> Unit,
|
||||||
|
openSettings: () -> Unit,
|
||||||
closeDrawer: () -> Unit,
|
closeDrawer: () -> Unit,
|
||||||
viewModel: ViewModel = koinViewModel<DrawerViewModel>(),
|
viewModel: ViewModel = koinViewModel<DrawerViewModel>(),
|
||||||
) {
|
) {
|
||||||
@ -20,6 +22,8 @@ fun DrawerView(
|
|||||||
when (effect) {
|
when (effect) {
|
||||||
is Effect.OpenAccount -> openAccount(effect.account)
|
is Effect.OpenAccount -> openAccount(effect.account)
|
||||||
is Effect.OpenFolder -> openFolder(effect.folderId)
|
is Effect.OpenFolder -> openFolder(effect.folderId)
|
||||||
|
is Effect.OpenManageFolders -> openManageFolders()
|
||||||
|
is Effect.OpenSettings -> openSettings()
|
||||||
Effect.CloseDrawer -> closeDrawer()
|
Effect.CloseDrawer -> closeDrawer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,10 @@ class DrawerViewModel(
|
|||||||
state.value.accounts.nextOrFirst(event.account)!!,
|
state.value.accounts.nextOrFirst(event.account)!!,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Event.OnAccountSelectorClick -> updateState { it.copy(showAccountSelector = it.showAccountSelector.not()) }
|
||||||
|
Event.OnManageFoldersClick -> emitEffect(Effect.OpenManageFolders)
|
||||||
|
Event.OnSettingsClick -> emitEffect(Effect.OpenSettings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,10 +30,10 @@ fun AccountView(
|
|||||||
.height(intrinsicSize = IntrinsicSize.Max)
|
.height(intrinsicSize = IntrinsicSize.Max)
|
||||||
.clickable(onClick = onClick)
|
.clickable(onClick = onClick)
|
||||||
.padding(
|
.padding(
|
||||||
top = MainTheme.spacings.default,
|
top = MainTheme.spacings.double,
|
||||||
start = MainTheme.spacings.double,
|
start = MainTheme.spacings.double,
|
||||||
end = MainTheme.spacings.triple,
|
end = MainTheme.spacings.triple,
|
||||||
bottom = MainTheme.spacings.oneHalf,
|
bottom = MainTheme.spacings.double,
|
||||||
),
|
),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
@ -42,7 +42,7 @@ fun AccountView(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxHeight()
|
.fillMaxHeight()
|
||||||
.padding(
|
.padding(
|
||||||
end = MainTheme.spacings.default,
|
end = MainTheme.spacings.oneHalf,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
Column(
|
Column(
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package app.k9mail.feature.navigation.drawer.ui.folder
|
package app.k9mail.feature.navigation.drawer.ui.folder
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import app.k9mail.core.ui.compose.theme2.MainTheme
|
||||||
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder
|
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
@ -18,7 +20,8 @@ fun FolderList(
|
|||||||
) {
|
) {
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
.fillMaxSize(),
|
.fillMaxWidth(),
|
||||||
|
contentPadding = PaddingValues(vertical = MainTheme.spacings.default),
|
||||||
) {
|
) {
|
||||||
items(folders) { folder ->
|
items(folders) { folder ->
|
||||||
FolderListItem(
|
FolderListItem(
|
||||||
|
@ -13,15 +13,15 @@ import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder
|
|||||||
fun FolderListItem(
|
fun FolderListItem(
|
||||||
displayFolder: DisplayAccountFolder,
|
displayFolder: DisplayAccountFolder,
|
||||||
selected: Boolean,
|
selected: Boolean,
|
||||||
showStarredCount: Boolean,
|
|
||||||
onClick: (DisplayAccountFolder) -> Unit,
|
onClick: (DisplayAccountFolder) -> Unit,
|
||||||
|
showStarredCount: Boolean,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
NavigationDrawerItem(
|
NavigationDrawerItem(
|
||||||
label = displayFolder.folder.name,
|
label = displayFolder.folder.name,
|
||||||
selected = selected,
|
selected = selected,
|
||||||
modifier = modifier,
|
|
||||||
onClick = { onClick(displayFolder) },
|
onClick = { onClick(displayFolder) },
|
||||||
|
modifier = modifier,
|
||||||
icon = {
|
icon = {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = mapFolderIcon(displayFolder.folder.type),
|
imageVector = mapFolderIcon(displayFolder.folder.type),
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
package app.k9mail.feature.navigation.drawer.ui.setting
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
|
||||||
|
import app.k9mail.core.ui.compose.theme2.MainTheme
|
||||||
|
import app.k9mail.feature.navigation.drawer.R
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SettingList(
|
||||||
|
onAccountSelectorClick: () -> Unit,
|
||||||
|
onManageFoldersClick: () -> Unit,
|
||||||
|
showAccountSelector: Boolean,
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = modifier
|
||||||
|
.padding(vertical = MainTheme.spacings.default)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
SettingListItem(
|
||||||
|
label = stringResource(R.string.navigation_drawer_action_manage_folders),
|
||||||
|
onClick = onManageFoldersClick,
|
||||||
|
imageVector = Icons.Outlined.FolderManaged,
|
||||||
|
)
|
||||||
|
SettingListItem(
|
||||||
|
label = if (showAccountSelector) {
|
||||||
|
stringResource(R.string.navigation_drawer_action_hide_accounts)
|
||||||
|
} else {
|
||||||
|
stringResource(R.string.navigation_drawer_action_show_accounts)
|
||||||
|
},
|
||||||
|
onClick = onAccountSelectorClick,
|
||||||
|
imageVector = if (showAccountSelector) {
|
||||||
|
Icons.Outlined.ChevronLeft
|
||||||
|
} else {
|
||||||
|
Icons.Outlined.ChevronRight
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package app.k9mail.feature.navigation.drawer.ui.setting
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icon
|
||||||
|
import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItem
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SettingListItem(
|
||||||
|
label: String,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
imageVector: ImageVector,
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
) {
|
||||||
|
NavigationDrawerItem(
|
||||||
|
label = label,
|
||||||
|
onClick = onClick,
|
||||||
|
modifier = modifier,
|
||||||
|
selected = false,
|
||||||
|
icon = {
|
||||||
|
Icon(
|
||||||
|
imageVector = imageVector,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
@ -2,6 +2,8 @@
|
|||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
<string name="navigation_drawer_action_settings">Settings</string>
|
<string name="navigation_drawer_action_settings">Settings</string>
|
||||||
<string name="navigation_drawer_action_folders">Manage folders</string>
|
<string name="navigation_drawer_action_folders">Manage folders</string>
|
||||||
|
<string name="navigation_drawer_action_show_accounts">Show accounts</string>
|
||||||
|
<string name="navigation_drawer_action_hide_accounts">Hide accounts</string>
|
||||||
<string name="navigation_drawer_unified_inbox_title">Unified Inbox</string>
|
<string name="navigation_drawer_unified_inbox_title">Unified Inbox</string>
|
||||||
<string name="navigation_drawer_folder_item_badge_count_greater_than_99">99+</string>
|
<string name="navigation_drawer_folder_item_badge_count_greater_than_99">99+</string>
|
||||||
<string name="navigation_drawer_folder_item_badge_count_greater_than_1_000">1k+</string>
|
<string name="navigation_drawer_folder_item_badge_count_greater_than_1_000">1k+</string>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package app.k9mail.feature.navigation.drawer.domain.usecase
|
package app.k9mail.feature.navigation.drawer.domain.usecase
|
||||||
|
|
||||||
|
import app.k9mail.feature.navigation.drawer.ui.FakeData
|
||||||
import app.k9mail.legacy.account.Account
|
import app.k9mail.legacy.account.Account
|
||||||
import app.k9mail.legacy.message.controller.MessagingControllerMailChecker
|
import app.k9mail.legacy.message.controller.MessagingControllerMailChecker
|
||||||
import app.k9mail.legacy.message.controller.MessagingListener
|
import app.k9mail.legacy.message.controller.MessagingListener
|
||||||
@ -27,6 +28,22 @@ class SyncMailTest {
|
|||||||
assertThat(result.isSuccess).isEqualTo(true)
|
assertThat(result.isSuccess).isEqualTo(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should sync mail with account`() = runTest {
|
||||||
|
val listenerExecutor: (MessagingListener?) -> Unit = { listener ->
|
||||||
|
listener?.checkMailFinished(null, null)
|
||||||
|
}
|
||||||
|
val testSubject = SyncMail(
|
||||||
|
messagingController = FakeMessagingControllerMailChecker(
|
||||||
|
listenerExecutor = listenerExecutor,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = testSubject(FakeData.ACCOUNT).first()
|
||||||
|
|
||||||
|
assertThat(result.isSuccess).isEqualTo(true)
|
||||||
|
}
|
||||||
|
|
||||||
private class FakeMessagingControllerMailChecker(
|
private class FakeMessagingControllerMailChecker(
|
||||||
private val listenerExecutor: (MessagingListener?) -> Unit = {},
|
private val listenerExecutor: (MessagingListener?) -> Unit = {},
|
||||||
) : MessagingControllerMailChecker {
|
) : MessagingControllerMailChecker {
|
||||||
|
@ -23,6 +23,7 @@ class DrawerStateTest {
|
|||||||
selectedAccount = null,
|
selectedAccount = null,
|
||||||
folders = persistentListOf(),
|
folders = persistentListOf(),
|
||||||
selectedFolder = null,
|
selectedFolder = null,
|
||||||
|
showAccountSelector = false,
|
||||||
isLoading = false,
|
isLoading = false,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -20,12 +20,16 @@ class DrawerViewKtTest : ComposeTest() {
|
|||||||
val viewModel = FakeDrawerViewModel(initialState)
|
val viewModel = FakeDrawerViewModel(initialState)
|
||||||
var openAccountCounter = 0
|
var openAccountCounter = 0
|
||||||
var openFolderCounter = 0
|
var openFolderCounter = 0
|
||||||
|
var openManageFoldersCounter = 0
|
||||||
|
var openSettingsCounter = 0
|
||||||
var closeDrawerCounter = 0
|
var closeDrawerCounter = 0
|
||||||
|
|
||||||
setContentWithTheme {
|
setContentWithTheme {
|
||||||
DrawerView(
|
DrawerView(
|
||||||
openAccount = { openAccountCounter++ },
|
openAccount = { openAccountCounter++ },
|
||||||
openFolder = { openFolderCounter++ },
|
openFolder = { openFolderCounter++ },
|
||||||
|
openManageFolders = { openManageFoldersCounter++ },
|
||||||
|
openSettings = { openSettingsCounter++ },
|
||||||
closeDrawer = { closeDrawerCounter++ },
|
closeDrawer = { closeDrawerCounter++ },
|
||||||
viewModel = viewModel,
|
viewModel = viewModel,
|
||||||
)
|
)
|
||||||
@ -33,22 +37,48 @@ class DrawerViewKtTest : ComposeTest() {
|
|||||||
|
|
||||||
assertThat(openAccountCounter).isEqualTo(0)
|
assertThat(openAccountCounter).isEqualTo(0)
|
||||||
assertThat(openFolderCounter).isEqualTo(0)
|
assertThat(openFolderCounter).isEqualTo(0)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(0)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(0)
|
||||||
assertThat(closeDrawerCounter).isEqualTo(0)
|
assertThat(closeDrawerCounter).isEqualTo(0)
|
||||||
|
|
||||||
viewModel.effect(Effect.OpenAccount(FakeData.ACCOUNT))
|
viewModel.effect(Effect.OpenAccount(FakeData.ACCOUNT))
|
||||||
|
|
||||||
assertThat(openAccountCounter).isEqualTo(1)
|
assertThat(openAccountCounter).isEqualTo(1)
|
||||||
|
assertThat(openFolderCounter).isEqualTo(0)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(0)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(0)
|
||||||
|
assertThat(closeDrawerCounter).isEqualTo(0)
|
||||||
|
|
||||||
viewModel.effect(Effect.OpenFolder(1))
|
viewModel.effect(Effect.OpenFolder(1))
|
||||||
|
|
||||||
assertThat(openAccountCounter).isEqualTo(1)
|
assertThat(openAccountCounter).isEqualTo(1)
|
||||||
assertThat(openFolderCounter).isEqualTo(1)
|
assertThat(openFolderCounter).isEqualTo(1)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(0)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(0)
|
||||||
|
assertThat(closeDrawerCounter).isEqualTo(0)
|
||||||
|
|
||||||
|
viewModel.effect(Effect.OpenManageFolders)
|
||||||
|
|
||||||
|
assertThat(openAccountCounter).isEqualTo(1)
|
||||||
|
assertThat(openFolderCounter).isEqualTo(1)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(1)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(0)
|
||||||
|
assertThat(closeDrawerCounter).isEqualTo(0)
|
||||||
|
|
||||||
|
viewModel.effect(Effect.OpenSettings)
|
||||||
|
|
||||||
|
assertThat(openAccountCounter).isEqualTo(1)
|
||||||
|
assertThat(openFolderCounter).isEqualTo(1)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(1)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(1)
|
||||||
assertThat(closeDrawerCounter).isEqualTo(0)
|
assertThat(closeDrawerCounter).isEqualTo(0)
|
||||||
|
|
||||||
viewModel.effect(Effect.CloseDrawer)
|
viewModel.effect(Effect.CloseDrawer)
|
||||||
|
|
||||||
assertThat(openAccountCounter).isEqualTo(1)
|
assertThat(openAccountCounter).isEqualTo(1)
|
||||||
assertThat(openFolderCounter).isEqualTo(1)
|
assertThat(openFolderCounter).isEqualTo(1)
|
||||||
|
assertThat(openManageFoldersCounter).isEqualTo(1)
|
||||||
|
assertThat(openSettingsCounter).isEqualTo(1)
|
||||||
assertThat(closeDrawerCounter).isEqualTo(1)
|
assertThat(closeDrawerCounter).isEqualTo(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +93,8 @@ class DrawerViewKtTest : ComposeTest() {
|
|||||||
DrawerView(
|
DrawerView(
|
||||||
openAccount = {},
|
openAccount = {},
|
||||||
openFolder = {},
|
openFolder = {},
|
||||||
|
openManageFolders = {},
|
||||||
|
openSettings = {},
|
||||||
closeDrawer = {},
|
closeDrawer = {},
|
||||||
viewModel = viewModel,
|
viewModel = viewModel,
|
||||||
)
|
)
|
||||||
|
@ -4,6 +4,7 @@ import app.k9mail.core.mail.folder.api.Folder
|
|||||||
import app.k9mail.core.mail.folder.api.FolderType
|
import app.k9mail.core.mail.folder.api.FolderType
|
||||||
import app.k9mail.core.ui.compose.testing.MainDispatcherRule
|
import app.k9mail.core.ui.compose.testing.MainDispatcherRule
|
||||||
import app.k9mail.core.ui.compose.testing.mvi.assertThatAndEffectTurbineConsumed
|
import app.k9mail.core.ui.compose.testing.mvi.assertThatAndEffectTurbineConsumed
|
||||||
|
import app.k9mail.core.ui.compose.testing.mvi.assertThatAndStateTurbineConsumed
|
||||||
import app.k9mail.core.ui.compose.testing.mvi.eventStateTest
|
import app.k9mail.core.ui.compose.testing.mvi.eventStateTest
|
||||||
import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck
|
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.DisplayAccount
|
||||||
@ -229,6 +230,46 @@ class DrawerViewModelTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should change state when OnAccountSelectorClick event is received`() = runTest {
|
||||||
|
val testSubject = createTestSubject()
|
||||||
|
val turbines = turbinesWithInitialStateCheck(testSubject, State())
|
||||||
|
|
||||||
|
testSubject.event(Event.OnAccountSelectorClick)
|
||||||
|
|
||||||
|
assertThat(turbines.awaitStateItem()).isEqualTo(State(showAccountSelector = true))
|
||||||
|
|
||||||
|
testSubject.event(Event.OnAccountSelectorClick)
|
||||||
|
|
||||||
|
turbines.assertThatAndStateTurbineConsumed {
|
||||||
|
isEqualTo(State(showAccountSelector = false))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should emit OpenManageFolders effect when OnManageFoldersClick event is received`() = runTest {
|
||||||
|
val testSubject = createTestSubject()
|
||||||
|
val turbines = turbinesWithInitialStateCheck(testSubject, State())
|
||||||
|
|
||||||
|
testSubject.event(Event.OnManageFoldersClick)
|
||||||
|
|
||||||
|
turbines.assertThatAndEffectTurbineConsumed {
|
||||||
|
isEqualTo(Effect.OpenManageFolders)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should emit OpenSettings effect when OnSettingsClick event is received`() = runTest {
|
||||||
|
val testSubject = createTestSubject()
|
||||||
|
val turbines = turbinesWithInitialStateCheck(testSubject, State())
|
||||||
|
|
||||||
|
testSubject.event(Event.OnSettingsClick)
|
||||||
|
|
||||||
|
turbines.assertThatAndEffectTurbineConsumed {
|
||||||
|
isEqualTo(Effect.OpenSettings)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun createTestSubject(
|
private fun createTestSubject(
|
||||||
drawerConfigFlow: Flow<DrawerConfig> = flow { emit(createDrawerConfig()) },
|
drawerConfigFlow: Flow<DrawerConfig> = flow { emit(createDrawerConfig()) },
|
||||||
displayAccountsFlow: Flow<List<DisplayAccount>> = flow { emit(emptyList()) },
|
displayAccountsFlow: Flow<List<DisplayAccount>> = flow { emit(emptyList()) },
|
||||||
|
@ -596,7 +596,7 @@ open class MessageList :
|
|||||||
navigationDrawer = LegacyDrawer(
|
navigationDrawer = LegacyDrawer(
|
||||||
parent = this,
|
parent = this,
|
||||||
savedInstanceState = savedInstanceState,
|
savedInstanceState = savedInstanceState,
|
||||||
openFolders = { launchManageFoldersScreen() },
|
openManageFolders = { launchManageFoldersScreen() },
|
||||||
openUnifiedInbox = { openUnifiedInbox() },
|
openUnifiedInbox = { openUnifiedInbox() },
|
||||||
openFolder = { folderId -> openFolder(folderId) },
|
openFolder = { folderId -> openFolder(folderId) },
|
||||||
openAccount = { account -> openRealAccount(account) },
|
openAccount = { account -> openRealAccount(account) },
|
||||||
@ -610,6 +610,8 @@ open class MessageList :
|
|||||||
parent = this,
|
parent = this,
|
||||||
openAccount = { account -> openRealAccount(account) },
|
openAccount = { account -> openRealAccount(account) },
|
||||||
openFolder = { folderId -> openFolder(folderId) },
|
openFolder = { folderId -> openFolder(folderId) },
|
||||||
|
openManageFolders = { launchManageFoldersScreen() },
|
||||||
|
openSettings = { SettingsActivity.launch(this) },
|
||||||
createDrawerListener = { createDrawerListener() },
|
createDrawerListener = { createDrawerListener() },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user