Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37adb419 authored by shamim-emon's avatar shamim-emon
Browse files

Always mark read when archiving email messages

parent f63b9648
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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)
+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
@@ -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 ->
@@ -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,
        )
    }

+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
@@ -28,6 +29,7 @@ val controllerModule = module {
            get<SpecialLocalFoldersCreator>(),
            get<LocalDeleteOperationDecider>(),
            get(named("controllerExtensions")),
            get<FeatureFlagProvider>(),
        )
    }

+20 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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
@@ -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) {
@@ -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)) {
@@ -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) {
+7 −2
Original line number Diff line number Diff line
@@ -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;
@@ -111,6 +112,7 @@ public class MessagingControllerTest extends K9RobolectricTest {

    private Preferences preferences;
    private String accountUuid;
    private FeatureFlagProvider featureFlagProvider;


    @Before
@@ -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();