From 2a6193721e9f296df6551792a42615c3fb5edc82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolf-Martell=20Montw=C3=A9?= Date: Mon, 16 Sep 2024 17:40:34 +0200 Subject: [PATCH] Add SettingList and SettingListItem --- .../ui/setting/SettingListItemPreview.kt | 18 ++++++++ .../drawer/ui/setting/SettingListPreview.kt | 29 ++++++++++++ .../feature/navigation/drawer/FolderDrawer.kt | 4 ++ .../feature/navigation/drawer/LegacyDrawer.kt | 4 +- .../navigation/drawer/ui/DrawerContent.kt | 19 ++++---- .../navigation/drawer/ui/DrawerContract.kt | 6 +++ .../navigation/drawer/ui/DrawerView.kt | 4 ++ .../navigation/drawer/ui/DrawerViewModel.kt | 4 ++ .../drawer/ui/account/AccountView.kt | 6 +-- .../navigation/drawer/ui/folder/FolderList.kt | 7 ++- .../drawer/ui/folder/FolderListItem.kt | 4 +- .../drawer/ui/setting/SettingList.kt | 44 +++++++++++++++++++ .../drawer/ui/setting/SettingListItem.kt | 27 ++++++++++++ .../drawer/src/main/res/values/strings.xml | 2 + .../drawer/domain/usecase/SyncMailTest.kt | 17 +++++++ .../navigation/drawer/ui/DrawerStateTest.kt | 1 + .../navigation/drawer/ui/DrawerViewKtTest.kt | 32 ++++++++++++++ .../drawer/ui/DrawerViewModelTest.kt | 41 +++++++++++++++++ .../java/com/fsck/k9/activity/MessageList.kt | 4 +- 19 files changed, 255 insertions(+), 18 deletions(-) create mode 100644 feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItemPreview.kt create mode 100644 feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListPreview.kt create mode 100644 feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingList.kt create mode 100644 feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItem.kt diff --git a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItemPreview.kt b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItemPreview.kt new file mode 100644 index 0000000000..0ea943319f --- /dev/null +++ b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItemPreview.kt @@ -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, + ) + } +} diff --git a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListPreview.kt b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListPreview.kt new file mode 100644 index 0000000000..34a2659c59 --- /dev/null +++ b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListPreview.kt @@ -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, + ) + } +} diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt index d7aac983e6..abde0ffd0d 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt @@ -17,6 +17,8 @@ class FolderDrawer( override val parent: AppCompatActivity, private val openAccount: (account: Account) -> Unit, private val openFolder: (folderId: Long) -> Unit, + private val openManageFolders: () -> Unit, + private val openSettings: () -> Unit, createDrawerListener: () -> DrawerLayout.DrawerListener, ) : NavigationDrawer, KoinComponent { @@ -38,6 +40,8 @@ class FolderDrawer( DrawerView( openAccount = openAccount, openFolder = openFolder, + openManageFolders = openManageFolders, + openSettings = openSettings, closeDrawer = { close() }, ) } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt index e49678dc76..bf82131689 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt @@ -66,7 +66,7 @@ private const val EN_SPACE = "\u2000" @Suppress("MagicNumber", "TooManyFunctions", "LongParameterList") class LegacyDrawer( override val parent: AppCompatActivity, - private val openFolders: () -> Unit, + private val openManageFolders: () -> Unit, private val openUnifiedInbox: () -> Unit, private val openFolder: (folderId: Long) -> Unit, private val openAccount: (account: Account) -> Boolean, @@ -352,7 +352,7 @@ class LegacyDrawer( private fun handleItemClickListener(drawerItem: IDrawerItem<*>) { when (drawerItem.identifier) { DRAWER_ID_PREFERENCES -> openSettings() - DRAWER_ID_FOLDERS -> openFolders() + DRAWER_ID_FOLDERS -> openManageFolders() DRAWER_ID_UNIFIED_INBOX -> openUnifiedInbox() else -> { val folder = drawerItem.tag as Folder diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt index 44f46c729c..5fc026ecc7 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt @@ -1,19 +1,17 @@ package app.k9mail.feature.navigation.drawer.ui -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal 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.State 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.setting.SettingList @Composable fun DrawerContent( @@ -28,11 +26,7 @@ fun DrawerContent( ) { Column( modifier = Modifier - .fillMaxSize() - .padding( - vertical = MainTheme.spacings.oneHalf, - ), - verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default), + .fillMaxSize(), ) { state.selectedAccount?.let { AccountView( @@ -51,7 +45,16 @@ fun DrawerContent( onEvent(Event.OnFolderClick(folder)) }, showStarredCount = state.config.showStarredCount, + modifier = Modifier.weight(1f), ) + Column { + DividerHorizontal() + SettingList( + onAccountSelectorClick = { onEvent(Event.OnAccountSelectorClick) }, + onManageFoldersClick = { onEvent(Event.OnManageFoldersClick) }, + showAccountSelector = state.showAccountSelector, + ) + } } } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt index f7fd2c8bd6..2ed1086827 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt @@ -23,6 +23,7 @@ interface DrawerContract { val selectedAccount: DisplayAccount? = null, val folders: ImmutableList = persistentListOf(), val selectedFolder: DisplayAccountFolder? = null, + val showAccountSelector: Boolean = false, val isLoading: Boolean = false, ) @@ -30,12 +31,17 @@ interface DrawerContract { data class OnAccountClick(val account: DisplayAccount) : Event data class OnAccountViewClick(val account: DisplayAccount) : Event data class OnFolderClick(val folder: DisplayAccountFolder) : Event + data object OnAccountSelectorClick : Event + data object OnManageFoldersClick : Event + data object OnSettingsClick : Event data object OnRefresh : Event } sealed interface Effect { data class OpenAccount(val account: Account) : Effect data class OpenFolder(val folderId: Long) : Effect + data object OpenManageFolders : Effect + data object OpenSettings : Effect data object CloseDrawer : Effect } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt index 3d86bdc93e..9865a500cd 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt @@ -13,6 +13,8 @@ import org.koin.androidx.compose.koinViewModel fun DrawerView( openAccount: (account: Account) -> Unit, openFolder: (folderId: Long) -> Unit, + openManageFolders: () -> Unit, + openSettings: () -> Unit, closeDrawer: () -> Unit, viewModel: ViewModel = koinViewModel(), ) { @@ -20,6 +22,8 @@ fun DrawerView( when (effect) { is Effect.OpenAccount -> openAccount(effect.account) is Effect.OpenFolder -> openFolder(effect.folderId) + is Effect.OpenManageFolders -> openManageFolders() + is Effect.OpenSettings -> openSettings() Effect.CloseDrawer -> closeDrawer() } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt index abc9ff3f67..413223c490 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt @@ -101,6 +101,10 @@ class DrawerViewModel( 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) } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountView.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountView.kt index 4cdbeda911..bd99a2718c 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountView.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountView.kt @@ -30,10 +30,10 @@ fun AccountView( .height(intrinsicSize = IntrinsicSize.Max) .clickable(onClick = onClick) .padding( - top = MainTheme.spacings.default, + top = MainTheme.spacings.double, start = MainTheme.spacings.double, end = MainTheme.spacings.triple, - bottom = MainTheme.spacings.oneHalf, + bottom = MainTheme.spacings.double, ), verticalAlignment = Alignment.CenterVertically, ) { @@ -42,7 +42,7 @@ fun AccountView( modifier = Modifier .fillMaxHeight() .padding( - end = MainTheme.spacings.default, + end = MainTheme.spacings.oneHalf, ), ) Column( diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt index 7e26419f7b..332d03a361 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt @@ -1,10 +1,12 @@ 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.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import kotlinx.collections.immutable.ImmutableList @@ -18,7 +20,8 @@ fun FolderList( ) { LazyColumn( modifier = modifier - .fillMaxSize(), + .fillMaxWidth(), + contentPadding = PaddingValues(vertical = MainTheme.spacings.default), ) { items(folders) { folder -> FolderListItem( diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItem.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItem.kt index 7090599fa6..978db3ba5d 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItem.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItem.kt @@ -13,15 +13,15 @@ import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder fun FolderListItem( displayFolder: DisplayAccountFolder, selected: Boolean, - showStarredCount: Boolean, onClick: (DisplayAccountFolder) -> Unit, + showStarredCount: Boolean, modifier: Modifier = Modifier, ) { NavigationDrawerItem( label = displayFolder.folder.name, selected = selected, - modifier = modifier, onClick = { onClick(displayFolder) }, + modifier = modifier, icon = { Icon( imageVector = mapFolderIcon(displayFolder.folder.type), diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingList.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingList.kt new file mode 100644 index 0000000000..5abc55a177 --- /dev/null +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingList.kt @@ -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 + }, + ) + } +} diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItem.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItem.kt new file mode 100644 index 0000000000..293587b01f --- /dev/null +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/setting/SettingListItem.kt @@ -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, + ) + }, + ) +} diff --git a/feature/navigation/drawer/src/main/res/values/strings.xml b/feature/navigation/drawer/src/main/res/values/strings.xml index 05163e5640..c5ac4f07a0 100644 --- a/feature/navigation/drawer/src/main/res/values/strings.xml +++ b/feature/navigation/drawer/src/main/res/values/strings.xml @@ -2,6 +2,8 @@ Settings Manage folders + Show accounts + Hide accounts Unified Inbox 99+ 1k+ diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/SyncMailTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/SyncMailTest.kt index 66295504ed..71acfcdbe4 100644 --- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/SyncMailTest.kt +++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/SyncMailTest.kt @@ -1,5 +1,6 @@ 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.message.controller.MessagingControllerMailChecker import app.k9mail.legacy.message.controller.MessagingListener @@ -27,6 +28,22 @@ class SyncMailTest { 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 val listenerExecutor: (MessagingListener?) -> Unit = {}, ) : MessagingControllerMailChecker { diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt index 93f88e09d9..60dfcfa2ee 100644 --- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt +++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt @@ -23,6 +23,7 @@ class DrawerStateTest { selectedAccount = null, folders = persistentListOf(), selectedFolder = null, + showAccountSelector = false, isLoading = false, ), ) diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewKtTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewKtTest.kt index 41c82b3215..70169ffa27 100644 --- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewKtTest.kt +++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewKtTest.kt @@ -20,12 +20,16 @@ class DrawerViewKtTest : ComposeTest() { val viewModel = FakeDrawerViewModel(initialState) var openAccountCounter = 0 var openFolderCounter = 0 + var openManageFoldersCounter = 0 + var openSettingsCounter = 0 var closeDrawerCounter = 0 setContentWithTheme { DrawerView( openAccount = { openAccountCounter++ }, openFolder = { openFolderCounter++ }, + openManageFolders = { openManageFoldersCounter++ }, + openSettings = { openSettingsCounter++ }, closeDrawer = { closeDrawerCounter++ }, viewModel = viewModel, ) @@ -33,22 +37,48 @@ class DrawerViewKtTest : ComposeTest() { assertThat(openAccountCounter).isEqualTo(0) assertThat(openFolderCounter).isEqualTo(0) + assertThat(openManageFoldersCounter).isEqualTo(0) + assertThat(openSettingsCounter).isEqualTo(0) assertThat(closeDrawerCounter).isEqualTo(0) viewModel.effect(Effect.OpenAccount(FakeData.ACCOUNT)) 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)) assertThat(openAccountCounter).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) viewModel.effect(Effect.CloseDrawer) assertThat(openAccountCounter).isEqualTo(1) assertThat(openFolderCounter).isEqualTo(1) + assertThat(openManageFoldersCounter).isEqualTo(1) + assertThat(openSettingsCounter).isEqualTo(1) assertThat(closeDrawerCounter).isEqualTo(1) } @@ -63,6 +93,8 @@ class DrawerViewKtTest : ComposeTest() { DrawerView( openAccount = {}, openFolder = {}, + openManageFolders = {}, + openSettings = {}, closeDrawer = {}, viewModel = viewModel, ) diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt index 30bbd1a4d1..08d3b1b380 100644 --- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt +++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt @@ -4,6 +4,7 @@ import app.k9mail.core.mail.folder.api.Folder import app.k9mail.core.mail.folder.api.FolderType 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.assertThatAndStateTurbineConsumed 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 @@ -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( drawerConfigFlow: Flow = flow { emit(createDrawerConfig()) }, displayAccountsFlow: Flow> = flow { emit(emptyList()) }, diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index 986179682c..a92682556a 100644 --- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -596,7 +596,7 @@ open class MessageList : navigationDrawer = LegacyDrawer( parent = this, savedInstanceState = savedInstanceState, - openFolders = { launchManageFoldersScreen() }, + openManageFolders = { launchManageFoldersScreen() }, openUnifiedInbox = { openUnifiedInbox() }, openFolder = { folderId -> openFolder(folderId) }, openAccount = { account -> openRealAccount(account) }, @@ -610,6 +610,8 @@ open class MessageList : parent = this, openAccount = { account -> openRealAccount(account) }, openFolder = { folderId -> openFolder(folderId) }, + openManageFolders = { launchManageFoldersScreen() }, + openSettings = { SettingsActivity.launch(this) }, createDrawerListener = { createDrawerListener() }, ) }