From caa7b6d797f1c491ba1920070b8e86e3ade3e73c Mon Sep 17 00:00:00 2001 From: cketti Date: Wed, 12 Feb 2020 23:22:57 +0100 Subject: [PATCH] Don't load 'hasMoreMessages' data in main thread --- .../fsck/k9/activity/FolderInfoHolder.java | 6 +---- .../fsck/k9/fragment/MessageListFragment.java | 15 ++++------- .../com/fsck/k9/ui/messagelist/KoinModule.kt | 2 +- .../k9/ui/messagelist/MessageListLiveData.kt | 2 +- .../k9/ui/messagelist/MessageListLoader.kt | 27 ++++++++++++++++--- .../k9/ui/messagelist/MessageListViewModel.kt | 4 +-- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/app/ui/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java b/app/ui/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java index 99d49d89025..ef366f33d02 100644 --- a/app/ui/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java +++ b/app/ui/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java @@ -23,7 +23,7 @@ public FolderInfoHolder(FolderNameFormatter folderNameFormatter, LocalFolder loc this.serverId = localFolder.getServerId(); this.lastChecked = localFolder.getLastUpdate(); this.displayName = getDisplayName(account, localFolder); - setMoreMessagesFromFolder(localFolder); + moreMessages = localFolder.hasMoreMessages(); } private String getDisplayName(Account account, LocalFolder localFolder) { @@ -37,10 +37,6 @@ private String getDisplayName(Account account, LocalFolder localFolder) { return folderNameFormatter.displayName(folder); } - public void setMoreMessagesFromFolder(LocalFolder folder) { - moreMessages = folder.hasMoreMessages(); - } - public static FolderType getFolderType(Account account, String serverId) { if (serverId.equals(account.getInboxFolder())) { return FolderType.INBOX; diff --git a/app/ui/src/main/java/com/fsck/k9/fragment/MessageListFragment.java b/app/ui/src/main/java/com/fsck/k9/fragment/MessageListFragment.java index 55dd2baa63f..3912cb27a1a 100644 --- a/app/ui/src/main/java/com/fsck/k9/fragment/MessageListFragment.java +++ b/app/ui/src/main/java/com/fsck/k9/fragment/MessageListFragment.java @@ -67,6 +67,7 @@ import com.fsck.k9.ui.messagelist.MessageListAppearance; import com.fsck.k9.ui.messagelist.MessageListConfig; import com.fsck.k9.ui.messagelist.MessageListFragmentDiContainer; +import com.fsck.k9.ui.messagelist.MessageListInfo; import com.fsck.k9.ui.messagelist.MessageListItem; import com.fsck.k9.ui.messagelist.MessageListViewModel; @@ -191,7 +192,6 @@ void folderLoading(String folder, boolean loading) { if (currentFolder != null && currentFolder.serverId.equals(folder)) { currentFolder.loading = loading; } - updateMoreMessagesOfCurrentFolder(); updateFooterView(); } @@ -2375,7 +2375,8 @@ public boolean onSearchRequested() { return fragmentListener.startSearch(account, folderServerId); } - public void setMessageList(List messageListItems) { + public void setMessageList(MessageListInfo messageListInfo) { + List messageListItems = messageListInfo.getMessageListItems(); if (isThreadDisplay && messageListItems.isEmpty()) { handler.goBack(); return; @@ -2417,16 +2418,10 @@ public void setMessageList(List messageListItems) { } fragmentListener.updateMenu(); - } - private void updateMoreMessagesOfCurrentFolder() { if (folderServerId != null) { - try { - LocalFolder folder = MlfUtils.getOpenFolder(folderServerId, account); - currentFolder.setMoreMessagesFromFolder(folder); - } catch (MessagingException e) { - throw new RuntimeException(e); - } + currentFolder.moreMessages = messageListInfo.getHasMoreMessages(); + updateFooterView(); } } diff --git a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/KoinModule.kt b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/KoinModule.kt index 61d74fa1551..c24478518c3 100644 --- a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/KoinModule.kt +++ b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/KoinModule.kt @@ -7,6 +7,6 @@ val messageListUiModule = module { viewModel { MessageListViewModel(get()) } factory { DefaultFolderProvider() } factory { MessageListExtractor(get(), get()) } - factory { MessageListLoader(get(), get(), get()) } + factory { MessageListLoader(get(), get(), get(), get()) } factory { MessageListLiveDataFactory(get(), get(), get()) } } diff --git a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLiveData.kt b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLiveData.kt index 82ae6824f00..aaf36a1b08d 100644 --- a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLiveData.kt +++ b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLiveData.kt @@ -19,7 +19,7 @@ class MessageListLiveData( private val contentResolver: ContentResolver, private val coroutineScope: CoroutineScope, val config: MessageListConfig -) : LiveData>() { +) : LiveData() { private val contentObserver = object : ContentObserver(Handler()) { override fun onChange(selfChange: Boolean) { diff --git a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLoader.kt b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLoader.kt index 4b75e508bac..0d821cf40e4 100644 --- a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLoader.kt +++ b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListLoader.kt @@ -18,6 +18,7 @@ import com.fsck.k9.fragment.MessageListFragmentComparators.SenderComparator import com.fsck.k9.fragment.MessageListFragmentComparators.SubjectComparator import com.fsck.k9.fragment.MessageListFragmentComparators.UnreadComparator import com.fsck.k9.helper.MergeCursorWithUniqueId +import com.fsck.k9.mailstore.LocalStoreProvider import com.fsck.k9.provider.EmailProvider import com.fsck.k9.provider.EmailProvider.SpecialColumns import com.fsck.k9.search.LocalSearch @@ -30,11 +31,13 @@ import java.util.Comparator class MessageListLoader( private val preferences: Preferences, private val contentResolver: ContentResolver, + private val localStoreProvider: LocalStoreProvider, private val messageListExtractor: MessageListExtractor ) { - fun getMessageList(config: MessageListConfig): List { - val cursors = config.search.getAccounts(preferences) + fun getMessageList(config: MessageListConfig): MessageListInfo { + val accounts = config.search.getAccounts(preferences) + val cursors = accounts .mapNotNull { loadMessageListForAccount(it, config) } .toTypedArray() @@ -48,13 +51,16 @@ class MessageListLoader( uniqueIdColumn = MLFProjectionInfo.ID_COLUMN } - return cursor.use { + val messageListItems = cursor.use { messageListExtractor.extractMessageList( cursor, uniqueIdColumn, threadCountIncluded = config.showingThreadedList ) } + val hasMoreMessages = loadHasMoreMessages(accounts, config.search.folderServerIds) + + return MessageListInfo(messageListItems, hasMoreMessages) } private fun loadMessageListForAccount(account: Account, config: MessageListConfig): Cursor? { @@ -166,6 +172,19 @@ class MessageListLoader( return ComparatorChain(chain) } + private fun loadHasMoreMessages(accounts: List, folderServerIds: List): Boolean { + return if (accounts.size == 1 && folderServerIds.size == 1) { + val account = accounts[0] + val folderServerId = folderServerIds[0] + val localStore = localStoreProvider.getInstance(account) + val localFolder = localStore.getFolder(folderServerId) + localFolder.open() + localFolder.hasMoreMessages() + } else { + false + } + } + companion object { private val SORT_COMPARATORS = mapOf( SortType.SORT_ATTACHMENT to AttachmentComparator(), @@ -178,3 +197,5 @@ class MessageListLoader( ) } } + +data class MessageListInfo(val messageListItems: List, val hasMoreMessages: Boolean) diff --git a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListViewModel.kt b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListViewModel.kt index 162b29ee2ee..e394fdd05cc 100644 --- a/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListViewModel.kt +++ b/app/ui/src/main/java/com/fsck/k9/ui/messagelist/MessageListViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope class MessageListViewModel(private val messageListLiveDataFactory: MessageListLiveDataFactory) : ViewModel() { private var currentMessageListLiveData: MessageListLiveData? = null - private val messageListLiveData = MediatorLiveData>() + private val messageListLiveData = MediatorLiveData() - fun getMessageListLiveData(): LiveData> { + fun getMessageListLiveData(): LiveData { return messageListLiveData }