|
1 | 1 | package net.thunderbird.feature.mail.message.list.internal.domain.usecase |
2 | 2 |
|
| 3 | +import kotlinx.coroutines.CoroutineDispatcher |
| 4 | +import kotlinx.coroutines.CoroutineScope |
| 5 | +import kotlinx.coroutines.Dispatchers |
| 6 | +import kotlinx.coroutines.ExperimentalCoroutinesApi |
| 7 | +import kotlinx.coroutines.SupervisorJob |
| 8 | +import kotlinx.coroutines.flow.SharingStarted |
| 9 | +import kotlinx.coroutines.flow.StateFlow |
| 10 | +import kotlinx.coroutines.flow.flatMapConcat |
| 11 | +import kotlinx.coroutines.flow.map |
| 12 | +import kotlinx.coroutines.flow.stateIn |
| 13 | +import net.thunderbird.core.android.account.LegacyAccount |
| 14 | +import net.thunderbird.core.android.account.LegacyAccountManager |
3 | 15 | import net.thunderbird.core.common.action.SwipeAction |
4 | 16 | import net.thunderbird.core.common.action.SwipeActions |
5 | 17 | import net.thunderbird.core.preference.GeneralSettingsManager |
6 | | -import net.thunderbird.feature.mail.account.api.AccountManager |
7 | | -import net.thunderbird.feature.mail.account.api.BaseAccount |
| 18 | +import net.thunderbird.feature.account.AccountId |
8 | 19 | import net.thunderbird.feature.mail.message.list.domain.DomainContract |
9 | 20 |
|
10 | 21 | internal class BuildSwipeActions( |
11 | | - private val generalSettingsManager: GeneralSettingsManager, |
12 | | - private val accountManager: AccountManager<BaseAccount>, |
13 | | -) : DomainContract.UseCase.BuildSwipeActions<BaseAccount> { |
14 | | - private val defaultSwipeActions get() = generalSettingsManager.getConfig().interaction.swipeActions |
15 | | - |
16 | | - override fun invoke( |
17 | | - accountUuids: Set<String>, |
18 | | - isIncomingServerPop3: (BaseAccount) -> Boolean, |
19 | | - hasArchiveFolder: (BaseAccount) -> Boolean, |
20 | | - ): Map<String, SwipeActions> { |
21 | | - val shouldShowSetupArchiveFolderDialog = generalSettingsManager |
22 | | - .getConfig().display.miscSettings |
23 | | - .shouldShowSetupArchiveFolderDialog |
24 | | - return accountUuids |
25 | | - .mapNotNull { uuid -> accountManager.getAccount(uuid) } |
26 | | - .associate { account -> |
27 | | - account.uuid to SwipeActions( |
28 | | - leftAction = buildSwipeAction( |
29 | | - account = account, |
30 | | - defaultSwipeAction = defaultSwipeActions.leftAction, |
31 | | - isIncomingServerPop3 = isIncomingServerPop3, |
32 | | - hasArchiveFolder = hasArchiveFolder, |
33 | | - shouldShowSetupArchiveFolderDialog = shouldShowSetupArchiveFolderDialog, |
34 | | - ), |
35 | | - rightAction = buildSwipeAction( |
36 | | - account = account, |
37 | | - defaultSwipeAction = defaultSwipeActions.rightAction, |
38 | | - isIncomingServerPop3 = isIncomingServerPop3, |
39 | | - hasArchiveFolder = hasArchiveFolder, |
40 | | - shouldShowSetupArchiveFolderDialog = shouldShowSetupArchiveFolderDialog, |
41 | | - ), |
42 | | - ) |
43 | | - } |
44 | | - } |
| 22 | + generalSettingsManager: GeneralSettingsManager, |
| 23 | + private val accountManager: LegacyAccountManager, |
| 24 | + private val mainDispatcher: CoroutineDispatcher = Dispatchers.Main, |
| 25 | + private val scope: CoroutineScope = CoroutineScope(SupervisorJob() + mainDispatcher), |
| 26 | +) : DomainContract.UseCase.BuildSwipeActions { |
| 27 | + @OptIn(ExperimentalCoroutinesApi::class) |
| 28 | + val swipeActions: StateFlow<Map<AccountId, SwipeActions>> = generalSettingsManager.getConfigFlow() |
| 29 | + .flatMapConcat { config -> |
| 30 | + val defaultSwipeActions = config.interaction.swipeActions |
| 31 | + val shouldShowSetupArchiveFolderDialog = config.display.miscSettings.shouldShowSetupArchiveFolderDialog |
| 32 | + |
| 33 | + accountManager |
| 34 | + .getAll() |
| 35 | + .map { accounts -> |
| 36 | + accounts |
| 37 | + .associate { account -> |
| 38 | + account.id to SwipeActions( |
| 39 | + leftAction = buildSwipeAction( |
| 40 | + account = account, |
| 41 | + defaultSwipeAction = defaultSwipeActions.leftAction, |
| 42 | + shouldShowSetupArchiveFolderDialog = shouldShowSetupArchiveFolderDialog, |
| 43 | + ), |
| 44 | + rightAction = buildSwipeAction( |
| 45 | + account = account, |
| 46 | + defaultSwipeAction = defaultSwipeActions.rightAction, |
| 47 | + shouldShowSetupArchiveFolderDialog = shouldShowSetupArchiveFolderDialog, |
| 48 | + ), |
| 49 | + ) |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + .stateIn( |
| 54 | + scope = scope, |
| 55 | + started = SharingStarted.Eagerly, |
| 56 | + initialValue = emptyMap(), |
| 57 | + ) |
| 58 | + |
| 59 | + @OptIn(ExperimentalCoroutinesApi::class) |
| 60 | + override fun invoke(): StateFlow<Map<AccountId, SwipeActions>> = swipeActions |
45 | 61 |
|
46 | 62 | private fun buildSwipeAction( |
47 | | - account: BaseAccount, |
| 63 | + account: LegacyAccount, |
48 | 64 | defaultSwipeAction: SwipeAction, |
49 | | - isIncomingServerPop3: BaseAccount.() -> Boolean, |
50 | | - hasArchiveFolder: BaseAccount.() -> Boolean, |
51 | 65 | shouldShowSetupArchiveFolderDialog: Boolean, |
52 | 66 | ): SwipeAction = when (defaultSwipeAction) { |
53 | 67 | SwipeAction.Archive if account.isIncomingServerPop3() -> SwipeAction.ArchiveDisabled |
|
0 commit comments