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

Commit 4729ae04 authored by Andrew Fiddian-Green's avatar Andrew Fiddian-Green Committed by cketti
Browse files

Optionally show starred message count in navigation drawer

parent f6e9948c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -206,6 +206,9 @@ object K9 : EarlyInit {
    @JvmStatic
    var isShowUnifiedInbox = true

    @JvmStatic
    var isShowStarredCount = false

    @JvmStatic
    var isAutoFitWidth: Boolean = false

@@ -307,6 +310,7 @@ object K9 : EarlyInit {
        isUseVolumeKeysForNavigation = storage.getBoolean("useVolumeKeysForNavigation", false)
        isUseVolumeKeysForListNavigation = storage.getBoolean("useVolumeKeysForListNavigation", false)
        isShowUnifiedInbox = storage.getBoolean("showUnifiedInbox", true)
        isShowStarredCount = storage.getBoolean("showStarredCount", false)
        isMessageListSenderAboveSubject = storage.getBoolean("messageListSenderAboveSubject", false)
        isShowMessageListStars = storage.getBoolean("messageListStars", true)
        messageListPreviewLines = storage.getInt("messageListPreviewLines", 2)
@@ -392,6 +396,7 @@ object K9 : EarlyInit {

        editor.putBoolean("messageListSenderAboveSubject", isMessageListSenderAboveSubject)
        editor.putBoolean("showUnifiedInbox", isShowUnifiedInbox)
        editor.putBoolean("showStarredCount", isShowStarredCount)
        editor.putBoolean("messageListStars", isShowMessageListStars)
        editor.putInt("messageListPreviewLines", messageListPreviewLines)
        editor.putBoolean("showCorrespondentNames", isShowCorrespondentNames)
+4 −0
Original line number Diff line number Diff line
package com.fsck.k9.controller

import android.content.Context
import com.fsck.k9.DefaultMessageCountsProvider
import com.fsck.k9.MessageCountsProvider
import com.fsck.k9.Preferences
import com.fsck.k9.backend.BackendManager
import com.fsck.k9.mailstore.LocalStoreProvider
@@ -19,6 +21,7 @@ val controllerModule = module {
            get<NotificationStrategy>(),
            get<LocalStoreProvider>(),
            get<UnreadMessageCountProvider>(),
            get<MessageCountsProvider>(),
            get<BackendManager>(),
            get<Preferences>(),
            get<MessageStoreManager>(),
@@ -27,4 +30,5 @@ val controllerModule = module {
        )
    }
    single<UnreadMessageCountProvider> { DefaultUnreadMessageCountProvider(get(), get(), get(), get()) }
    single<MessageCountsProvider> { DefaultMessageCountsProvider(get(), get(), get(), get()) }
}
+68 −0
Original line number Diff line number Diff line
package com.fsck.k9

import android.content.Context
import com.fsck.k9.mail.MessagingException
import com.fsck.k9.mailstore.LocalStoreProvider
import com.fsck.k9.search.AccountSearchConditions
import com.fsck.k9.search.LocalSearch
import com.fsck.k9.search.SearchAccount
import com.fsck.k9.search.getAccounts
import timber.log.Timber

interface MessageCountsProvider {
    fun getMessageCounts(account: Account): MessageCounts
    fun getMessageCounts(searchAccount: SearchAccount): MessageCounts
}

data class MessageCounts(val unread: Int, val starred: Int)

internal class DefaultMessageCountsProvider(
    private val context: Context,
    private val preferences: Preferences,
    private val accountSearchConditions: AccountSearchConditions,
    private val localStoreProvider: LocalStoreProvider
) : MessageCountsProvider {
    override fun getMessageCounts(account: Account): MessageCounts {
        if (!account.isAvailable(context)) {
            return MessageCounts(0, 0)
        }

        return try {
            val localStore = localStoreProvider.getInstance(account)

            val search = LocalSearch()
            accountSearchConditions.excludeSpecialFolders(account, search)
            accountSearchConditions.limitToDisplayableFolders(account, search)

            localStore.getMessageCounts(search)
        } catch (e: MessagingException) {
            Timber.e(e, "Unable to getMessageCounts for account: %s", account)
            return MessageCounts(0, 0)
        }
    }

    override fun getMessageCounts(searchAccount: SearchAccount): MessageCounts {
        val search = searchAccount.relatedSearch
        val accounts = search.getAccounts(preferences)

        var unreadCount = 0
        var starredCount = 0
        for (account in accounts) {
            var accountMessageCount = getMessageCountsWithLocalSearch(account, search)
            unreadCount += accountMessageCount.unread
            starredCount += accountMessageCount.starred
        }

        return MessageCounts(unreadCount, starredCount)
    }

    private fun getMessageCountsWithLocalSearch(account: Account, search: LocalSearch): MessageCounts {
        return try {
            val localStore = localStoreProvider.getInstance(account)
            localStore.getMessageCounts(search)
        } catch (e: MessagingException) {
            Timber.e(e, "Unable to getMessageCounts for account: %s", account)
            return MessageCounts(0, 0)
        }
    }
}
+14 −2
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import com.fsck.k9.Account.DeletePolicy;
import com.fsck.k9.Account.Expunge;
import com.fsck.k9.DI;
import com.fsck.k9.K9;
import com.fsck.k9.MessageCounts;
import com.fsck.k9.MessageCountsProvider;
import com.fsck.k9.Preferences;
import com.fsck.k9.backend.BackendManager;
import com.fsck.k9.backend.api.Backend;
@@ -126,6 +128,7 @@ public class MessagingController {
    private final ExecutorService threadPool = Executors.newCachedThreadPool();
    private final MemorizingMessagingListener memorizingMessagingListener = new MemorizingMessagingListener();
    private final UnreadMessageCountProvider unreadMessageCountProvider;
    private final MessageCountsProvider messageCountsProvider;
    private final DraftOperations draftOperations;


@@ -140,14 +143,15 @@ public class MessagingController {

    MessagingController(Context context, NotificationController notificationController,
            NotificationStrategy notificationStrategy, LocalStoreProvider localStoreProvider,
            UnreadMessageCountProvider unreadMessageCountProvider, BackendManager backendManager,
            Preferences preferences, MessageStoreManager messageStoreManager,
            UnreadMessageCountProvider unreadMessageCountProvider, MessageCountsProvider messageCountsProvider,
            BackendManager backendManager, Preferences preferences, MessageStoreManager messageStoreManager,
            SaveMessageDataCreator saveMessageDataCreator, List<ControllerExtension> controllerExtensions) {
        this.context = context;
        this.notificationController = notificationController;
        this.notificationStrategy = notificationStrategy;
        this.localStoreProvider = localStoreProvider;
        this.unreadMessageCountProvider = unreadMessageCountProvider;
        this.messageCountsProvider = messageCountsProvider;
        this.backendManager = backendManager;
        this.preferences = preferences;
        this.messageStoreManager = messageStoreManager;
@@ -1683,6 +1687,14 @@ public class MessagingController {
        return unreadMessageCountProvider.getUnreadMessageCount(searchAccount);
    }

    public MessageCounts getMessageCounts(Account account) {
        return messageCountsProvider.getMessageCounts(account);
    }

    public MessageCounts getMessageCounts(SearchAccount searchAccount) {
        return messageCountsProvider.getMessageCounts(searchAccount);
    }

    public int getFolderUnreadMessageCount(Account account, Long folderId) throws MessagingException {
        LocalStore localStore = localStoreProvider.getInstance(account);
        LocalFolder localFolder = localStore.getFolder(folderId);
+2 −1
Original line number Diff line number Diff line
@@ -21,7 +21,8 @@ interface FolderDetailsAccessor {
    val pushClass: FolderClass
    val visibleLimit: Int
    val moreMessages: MoreMessages
    val messageCount: Int
    val unreadMessageCount: Int
    val starredMessageCount: Int

    fun serverIdOrThrow(): String
}
Loading