Skip to content

Commit

Permalink
Merge pull request thunderbird#4531 from k9mail/more_messages_ui_update
Browse files Browse the repository at this point in the history
Don't load 'hasMoreMessages' data in main thread
  • Loading branch information
cketti authored Feb 13, 2020
2 parents 8a96435 + caa7b6d commit 5dce110
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
Expand Down
15 changes: 5 additions & 10 deletions app/ui/src/main/java/com/fsck/k9/fragment/MessageListFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -191,7 +192,6 @@ void folderLoading(String folder, boolean loading) {
if (currentFolder != null && currentFolder.serverId.equals(folder)) {
currentFolder.loading = loading;
}
updateMoreMessagesOfCurrentFolder();
updateFooterView();
}

Expand Down Expand Up @@ -2375,7 +2375,8 @@ public boolean onSearchRequested() {
return fragmentListener.startSearch(account, folderServerId);
}

public void setMessageList(List<MessageListItem> messageListItems) {
public void setMessageList(MessageListInfo messageListInfo) {
List<MessageListItem> messageListItems = messageListInfo.getMessageListItems();
if (isThreadDisplay && messageListItems.isEmpty()) {
handler.goBack();
return;
Expand Down Expand Up @@ -2417,16 +2418,10 @@ public void setMessageList(List<MessageListItem> 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();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class MessageListLiveData(
private val contentResolver: ContentResolver,
private val coroutineScope: CoroutineScope,
val config: MessageListConfig
) : LiveData<List<MessageListItem>>() {
) : LiveData<MessageListInfo>() {

private val contentObserver = object : ContentObserver(Handler()) {
override fun onChange(selfChange: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<MessageListItem> {
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()

Expand All @@ -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? {
Expand Down Expand Up @@ -166,6 +172,19 @@ class MessageListLoader(
return ComparatorChain(chain)
}

private fun loadHasMoreMessages(accounts: List<Account>, folderServerIds: List<String>): 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(),
Expand All @@ -178,3 +197,5 @@ class MessageListLoader(
)
}
}

data class MessageListInfo(val messageListItems: List<MessageListItem>, val hasMoreMessages: Boolean)
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope

class MessageListViewModel(private val messageListLiveDataFactory: MessageListLiveDataFactory) : ViewModel() {
private var currentMessageListLiveData: MessageListLiveData? = null
private val messageListLiveData = MediatorLiveData<List<MessageListItem>>()
private val messageListLiveData = MediatorLiveData<MessageListInfo>()

fun getMessageListLiveData(): LiveData<List<MessageListItem>> {
fun getMessageListLiveData(): LiveData<MessageListInfo> {
return messageListLiveData
}

Expand Down

0 comments on commit 5dce110

Please sign in to comment.