Skip to content

Commit 98c39ef

Browse files
authored
Merge pull request #10227 from rafaeltonholo/chore/10226/reactive-build-swipe-actions
refactor(message-list): migrate swipe actions to a reactive approach
2 parents bcbe885 + 8a0bd2e commit 98c39ef

File tree

13 files changed

+514
-376
lines changed

13 files changed

+514
-376
lines changed

feature/mail/message/list/api/src/main/kotlin/net/thunderbird/feature/mail/message/list/domain/DomainContract.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package net.thunderbird.feature.mail.message.list.domain
22

33
import kotlinx.coroutines.flow.Flow
4+
import kotlinx.coroutines.flow.StateFlow
45
import net.thunderbird.core.common.action.SwipeActions
56
import net.thunderbird.core.outcome.Outcome
6-
import net.thunderbird.feature.mail.account.api.BaseAccount
7+
import net.thunderbird.feature.account.AccountId
78
import net.thunderbird.feature.mail.folder.api.FolderServerId
89
import net.thunderbird.feature.mail.folder.api.RemoteFolder
910

@@ -27,12 +28,8 @@ interface DomainContract {
2728
): Outcome<SetAccountFolderOutcome.Success, SetAccountFolderOutcome.Error>
2829
}
2930

30-
fun interface BuildSwipeActions<out TAccount : BaseAccount> {
31-
operator fun invoke(
32-
accountUuids: Set<String>,
33-
isIncomingServerPop3: (TAccount) -> Boolean,
34-
hasArchiveFolder: (TAccount) -> Boolean,
35-
): Map<String, SwipeActions>
31+
fun interface BuildSwipeActions {
32+
operator fun invoke(): StateFlow<Map<AccountId, SwipeActions>>
3633
}
3734
}
3835
}

feature/mail/message/list/internal/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies {
1111
implementation(projects.feature.mail.message.list.api)
1212

1313
implementation(projects.backend.api)
14+
implementation(projects.core.android.account)
1415
implementation(projects.core.android.common)
1516
implementation(projects.core.logging.api)
1617
implementation(projects.core.outcome)

feature/mail/message/list/internal/src/main/kotlin/net/thunderbird/feature/mail/message/list/internal/FeatureMessageListModule.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.thunderbird.feature.mail.message.list.internal
22

3-
import net.thunderbird.feature.mail.account.api.BaseAccount
43
import net.thunderbird.feature.mail.message.list.domain.DomainContract
54
import net.thunderbird.feature.mail.message.list.internal.domain.usecase.BuildSwipeActions
65
import net.thunderbird.feature.mail.message.list.internal.domain.usecase.CreateArchiveFolder
@@ -30,7 +29,7 @@ val featureMessageListModule = module {
3029
specialFolderUpdaterFactory = get(),
3130
)
3231
}
33-
factory<DomainContract.UseCase.BuildSwipeActions<BaseAccount>> { parameters ->
32+
factory<DomainContract.UseCase.BuildSwipeActions> {
3433
BuildSwipeActions(
3534
generalSettingsManager = get(),
3635
accountManager = get(),

feature/mail/message/list/internal/src/main/kotlin/net/thunderbird/feature/mail/message/list/internal/domain/usecase/BuildSwipeActions.kt

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,67 @@
11
package net.thunderbird.feature.mail.message.list.internal.domain.usecase
22

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
315
import net.thunderbird.core.common.action.SwipeAction
416
import net.thunderbird.core.common.action.SwipeActions
517
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
819
import net.thunderbird.feature.mail.message.list.domain.DomainContract
920

1021
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
4561

4662
private fun buildSwipeAction(
47-
account: BaseAccount,
63+
account: LegacyAccount,
4864
defaultSwipeAction: SwipeAction,
49-
isIncomingServerPop3: BaseAccount.() -> Boolean,
50-
hasArchiveFolder: BaseAccount.() -> Boolean,
5165
shouldShowSetupArchiveFolderDialog: Boolean,
5266
): SwipeAction = when (defaultSwipeAction) {
5367
SwipeAction.Archive if account.isIncomingServerPop3() -> SwipeAction.ArchiveDisabled

feature/mail/message/list/internal/src/main/kotlin/net/thunderbird/feature/mail/message/list/internal/domain/usecase/SetArchiveFolder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import kotlinx.coroutines.CoroutineDispatcher
44
import kotlinx.coroutines.Dispatchers
55
import kotlinx.coroutines.withContext
66
import net.thunderbird.backend.api.BackendStorageFactory
7+
import net.thunderbird.core.android.account.LegacyAccountDtoManager
78
import net.thunderbird.core.common.exception.MessagingException
89
import net.thunderbird.core.outcome.Outcome
9-
import net.thunderbird.feature.mail.account.api.AccountManager
1010
import net.thunderbird.feature.mail.account.api.BaseAccount
1111
import net.thunderbird.feature.mail.folder.api.FolderType
1212
import net.thunderbird.feature.mail.folder.api.RemoteFolder
@@ -17,7 +17,7 @@ import net.thunderbird.feature.mail.message.list.domain.SetAccountFolderOutcome
1717
import com.fsck.k9.mail.FolderType as LegacyFolderType
1818

1919
internal class SetArchiveFolder(
20-
private val accountManager: AccountManager<BaseAccount>,
20+
private val accountManager: LegacyAccountDtoManager,
2121
private val backendStorageFactory: BackendStorageFactory<BaseAccount>,
2222
private val specialFolderUpdaterFactory: SpecialFolderUpdater.Factory<BaseAccount>,
2323
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,

0 commit comments

Comments
 (0)