Loading legacy/core/build.gradle.kts +1 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ dependencies { implementation(libs.timber) implementation(libs.mime4j.core) implementation(libs.mime4j.dom) implementation(projects.core.featureflags) testApi(projects.core.testing) testApi(projects.core.android.testing) Loading legacy/core/src/main/java/com/fsck/k9/controller/ArchiveOperations.kt +10 −1 Original line number Diff line number Diff line package com.fsck.k9.controller import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.core.featureflag.FeatureFlagResult import app.k9mail.core.featureflag.toFeatureFlagKey import app.k9mail.legacy.account.Account import app.k9mail.legacy.message.controller.MessageReference import com.fsck.k9.controller.MessagingController.MessageActor Loading @@ -10,6 +13,7 @@ import timber.log.Timber internal class ArchiveOperations( private val messagingController: MessagingController, private val featureFlagProvider: FeatureFlagProvider, ) { fun archiveThreads(messages: List<MessageReference>) { archiveByFolder("archiveThreads", messages) { account, folderId, messagesInFolder, archiveFolderId -> Loading Loading @@ -69,12 +73,17 @@ internal class ArchiveOperations( messages: List<LocalMessage>, archiveFolderId: Long, ) { val operation = when (featureFlagProvider.provide("move_and_mark_as_read".toFeatureFlagKey())) { FeatureFlagResult.Enabled -> MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ FeatureFlagResult.Disabled -> MoveOrCopyFlavor.MOVE FeatureFlagResult.Unavailable -> MoveOrCopyFlavor.MOVE } messagingController.moveOrCopyMessageSynchronous( account, sourceFolderId, messages, archiveFolderId, MoveOrCopyFlavor.MOVE, operation, ) } Loading legacy/core/src/main/java/com/fsck/k9/controller/KoinModule.kt +2 −0 Original line number Diff line number Diff line package com.fsck.k9.controller import android.content.Context import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.legacy.mailstore.MessageStoreManager import app.k9mail.legacy.message.controller.MessageCountsProvider import app.k9mail.legacy.message.controller.MessagingControllerRegistry Loading Loading @@ -28,6 +29,7 @@ val controllerModule = module { get<SpecialLocalFoldersCreator>(), get<LocalDeleteOperationDecider>(), get(named("controllerExtensions")), get<FeatureFlagProvider>(), ) } Loading legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +20 −11 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import app.k9mail.core.featureflag.FeatureFlagProvider; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.account.Account.DeletePolicy; import app.k9mail.legacy.di.DI; Loading Loading @@ -131,6 +132,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi private final DraftOperations draftOperations; private final NotificationOperations notificationOperations; private final ArchiveOperations archiveOperations; private final FeatureFlagProvider featureFlagProvider; private volatile boolean stopped = false; Loading @@ -145,7 +147,9 @@ public class MessagingController implements MessagingControllerRegistry, Messagi NotificationStrategy notificationStrategy, LocalStoreProvider localStoreProvider, BackendManager backendManager, Preferences preferences, MessageStoreManager messageStoreManager, SaveMessageDataCreator saveMessageDataCreator, SpecialLocalFoldersCreator specialLocalFoldersCreator, LocalDeleteOperationDecider localDeleteOperationDecider, List<ControllerExtension> controllerExtensions) { LocalDeleteOperationDecider localDeleteOperationDecider, List<ControllerExtension> controllerExtensions, FeatureFlagProvider featureFlagProvider ) { this.context = context; this.notificationController = notificationController; this.notificationStrategy = notificationStrategy; Loading @@ -156,6 +160,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi this.saveMessageDataCreator = saveMessageDataCreator; this.specialLocalFoldersCreator = specialLocalFoldersCreator; this.localDeleteOperationDecider = localDeleteOperationDecider; this.featureFlagProvider = featureFlagProvider; controllerThread = new Thread(new Runnable() { @Override Loading @@ -171,7 +176,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi draftOperations = new DraftOperations(this, messageStoreManager, saveMessageDataCreator); notificationOperations = new NotificationOperations(notificationController, preferences, messageStoreManager); archiveOperations = new ArchiveOperations(this); archiveOperations = new ArchiveOperations(this, this.featureFlagProvider); } private void initializeControllerExtensions(List<ControllerExtension> controllerExtensions) { Loading Loading @@ -1754,10 +1759,6 @@ public class MessagingController implements MessagingControllerRegistry, Messagi void moveOrCopyMessageSynchronous(Account account, long srcFolderId, List<LocalMessage> inMessages, long destFolderId, MoveOrCopyFlavor operation) { if (operation == MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ) { throw new UnsupportedOperationException("MOVE_AND_MARK_AS_READ unsupported"); } try { LocalStore localStore = localStoreProvider.getInstance(account); if (operation == MoveOrCopyFlavor.MOVE && !isMoveCapable(account)) { Loading @@ -1781,10 +1782,18 @@ public class MessagingController implements MessagingControllerRegistry, Messagi uids.add(uid); } if (operation == MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ) { if (!message.isSet(Flag.SEEN)) { unreadCountAffected = true; message.setFlag(Flag.SEEN, true); } } else { if (!unreadCountAffected && !message.isSet(Flag.SEEN)) { unreadCountAffected = true; } } } List<LocalMessage> messages = localSrcFolder.getMessagesByUids(uids); if (messages.size() > 0) { Loading legacy/core/src/test/java/com/fsck/k9/controller/MessagingControllerTest.java +7 −2 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ import java.util.List; import java.util.Set; import android.content.Context; import app.k9mail.core.featureflag.FeatureFlagProvider; import app.k9mail.core.featureflag.FeatureFlagResult.Disabled; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.message.controller.SimpleMessagingListener; import com.fsck.k9.K9; Loading Loading @@ -111,6 +112,7 @@ public class MessagingControllerTest extends K9RobolectricTest { private Preferences preferences; private String accountUuid; private FeatureFlagProvider featureFlagProvider; @Before Loading @@ -120,11 +122,14 @@ public class MessagingControllerTest extends K9RobolectricTest { appContext = RuntimeEnvironment.getApplication(); preferences = Preferences.getPreferences(); featureFlagProvider = key -> Disabled.INSTANCE; controller = new MessagingController(appContext, notificationController, notificationStrategy, localStoreProvider, backendManager, preferences, messageStoreManager, saveMessageDataCreator, specialLocalFoldersCreator, new LocalDeleteOperationDecider(), Collections.<ControllerExtension>emptyList()); Collections.<ControllerExtension>emptyList(), featureFlagProvider ); configureAccount(); configureBackendManager(); Loading Loading
legacy/core/build.gradle.kts +1 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ dependencies { implementation(libs.timber) implementation(libs.mime4j.core) implementation(libs.mime4j.dom) implementation(projects.core.featureflags) testApi(projects.core.testing) testApi(projects.core.android.testing) Loading
legacy/core/src/main/java/com/fsck/k9/controller/ArchiveOperations.kt +10 −1 Original line number Diff line number Diff line package com.fsck.k9.controller import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.core.featureflag.FeatureFlagResult import app.k9mail.core.featureflag.toFeatureFlagKey import app.k9mail.legacy.account.Account import app.k9mail.legacy.message.controller.MessageReference import com.fsck.k9.controller.MessagingController.MessageActor Loading @@ -10,6 +13,7 @@ import timber.log.Timber internal class ArchiveOperations( private val messagingController: MessagingController, private val featureFlagProvider: FeatureFlagProvider, ) { fun archiveThreads(messages: List<MessageReference>) { archiveByFolder("archiveThreads", messages) { account, folderId, messagesInFolder, archiveFolderId -> Loading Loading @@ -69,12 +73,17 @@ internal class ArchiveOperations( messages: List<LocalMessage>, archiveFolderId: Long, ) { val operation = when (featureFlagProvider.provide("move_and_mark_as_read".toFeatureFlagKey())) { FeatureFlagResult.Enabled -> MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ FeatureFlagResult.Disabled -> MoveOrCopyFlavor.MOVE FeatureFlagResult.Unavailable -> MoveOrCopyFlavor.MOVE } messagingController.moveOrCopyMessageSynchronous( account, sourceFolderId, messages, archiveFolderId, MoveOrCopyFlavor.MOVE, operation, ) } Loading
legacy/core/src/main/java/com/fsck/k9/controller/KoinModule.kt +2 −0 Original line number Diff line number Diff line package com.fsck.k9.controller import android.content.Context import app.k9mail.core.featureflag.FeatureFlagProvider import app.k9mail.legacy.mailstore.MessageStoreManager import app.k9mail.legacy.message.controller.MessageCountsProvider import app.k9mail.legacy.message.controller.MessagingControllerRegistry Loading Loading @@ -28,6 +29,7 @@ val controllerModule = module { get<SpecialLocalFoldersCreator>(), get<LocalDeleteOperationDecider>(), get(named("controllerExtensions")), get<FeatureFlagProvider>(), ) } Loading
legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +20 −11 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import app.k9mail.core.featureflag.FeatureFlagProvider; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.account.Account.DeletePolicy; import app.k9mail.legacy.di.DI; Loading Loading @@ -131,6 +132,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi private final DraftOperations draftOperations; private final NotificationOperations notificationOperations; private final ArchiveOperations archiveOperations; private final FeatureFlagProvider featureFlagProvider; private volatile boolean stopped = false; Loading @@ -145,7 +147,9 @@ public class MessagingController implements MessagingControllerRegistry, Messagi NotificationStrategy notificationStrategy, LocalStoreProvider localStoreProvider, BackendManager backendManager, Preferences preferences, MessageStoreManager messageStoreManager, SaveMessageDataCreator saveMessageDataCreator, SpecialLocalFoldersCreator specialLocalFoldersCreator, LocalDeleteOperationDecider localDeleteOperationDecider, List<ControllerExtension> controllerExtensions) { LocalDeleteOperationDecider localDeleteOperationDecider, List<ControllerExtension> controllerExtensions, FeatureFlagProvider featureFlagProvider ) { this.context = context; this.notificationController = notificationController; this.notificationStrategy = notificationStrategy; Loading @@ -156,6 +160,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi this.saveMessageDataCreator = saveMessageDataCreator; this.specialLocalFoldersCreator = specialLocalFoldersCreator; this.localDeleteOperationDecider = localDeleteOperationDecider; this.featureFlagProvider = featureFlagProvider; controllerThread = new Thread(new Runnable() { @Override Loading @@ -171,7 +176,7 @@ public class MessagingController implements MessagingControllerRegistry, Messagi draftOperations = new DraftOperations(this, messageStoreManager, saveMessageDataCreator); notificationOperations = new NotificationOperations(notificationController, preferences, messageStoreManager); archiveOperations = new ArchiveOperations(this); archiveOperations = new ArchiveOperations(this, this.featureFlagProvider); } private void initializeControllerExtensions(List<ControllerExtension> controllerExtensions) { Loading Loading @@ -1754,10 +1759,6 @@ public class MessagingController implements MessagingControllerRegistry, Messagi void moveOrCopyMessageSynchronous(Account account, long srcFolderId, List<LocalMessage> inMessages, long destFolderId, MoveOrCopyFlavor operation) { if (operation == MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ) { throw new UnsupportedOperationException("MOVE_AND_MARK_AS_READ unsupported"); } try { LocalStore localStore = localStoreProvider.getInstance(account); if (operation == MoveOrCopyFlavor.MOVE && !isMoveCapable(account)) { Loading @@ -1781,10 +1782,18 @@ public class MessagingController implements MessagingControllerRegistry, Messagi uids.add(uid); } if (operation == MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ) { if (!message.isSet(Flag.SEEN)) { unreadCountAffected = true; message.setFlag(Flag.SEEN, true); } } else { if (!unreadCountAffected && !message.isSet(Flag.SEEN)) { unreadCountAffected = true; } } } List<LocalMessage> messages = localSrcFolder.getMessagesByUids(uids); if (messages.size() > 0) { Loading
legacy/core/src/test/java/com/fsck/k9/controller/MessagingControllerTest.java +7 −2 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ import java.util.List; import java.util.Set; import android.content.Context; import app.k9mail.core.featureflag.FeatureFlagProvider; import app.k9mail.core.featureflag.FeatureFlagResult.Disabled; import app.k9mail.legacy.account.Account; import app.k9mail.legacy.message.controller.SimpleMessagingListener; import com.fsck.k9.K9; Loading Loading @@ -111,6 +112,7 @@ public class MessagingControllerTest extends K9RobolectricTest { private Preferences preferences; private String accountUuid; private FeatureFlagProvider featureFlagProvider; @Before Loading @@ -120,11 +122,14 @@ public class MessagingControllerTest extends K9RobolectricTest { appContext = RuntimeEnvironment.getApplication(); preferences = Preferences.getPreferences(); featureFlagProvider = key -> Disabled.INSTANCE; controller = new MessagingController(appContext, notificationController, notificationStrategy, localStoreProvider, backendManager, preferences, messageStoreManager, saveMessageDataCreator, specialLocalFoldersCreator, new LocalDeleteOperationDecider(), Collections.<ControllerExtension>emptyList()); Collections.<ControllerExtension>emptyList(), featureFlagProvider ); configureAccount(); configureBackendManager(); Loading