From 49a5a3b7ff733aa945e4efa4c035a5b447288857 Mon Sep 17 00:00:00 2001 From: cketti Date: Thu, 25 Oct 2012 21:51:14 +0200 Subject: [PATCH] Fix message sorting for message lists of a single account To support sorting of message lists spanning multiple accounts (e.g. Unified Inbox) we need a MergeCursor that also does sorting. --- .../fsck/k9/fragment/MessageListFragment.java | 77 +++++++++++++------ src/com/fsck/k9/provider/EmailProvider.java | 12 +-- 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/src/com/fsck/k9/fragment/MessageListFragment.java b/src/com/fsck/k9/fragment/MessageListFragment.java index 8a1c5e03b..d61de81b0 100644 --- a/src/com/fsck/k9/fragment/MessageListFragment.java +++ b/src/com/fsck/k9/fragment/MessageListFragment.java @@ -413,17 +413,11 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick * perform the operation in the calling thread.

*/ class MessageListHandler extends Handler { - private static final int ACTION_SORT_MESSAGES = 1; - private static final int ACTION_FOLDER_LOADING = 2; - private static final int ACTION_REFRESH_TITLE = 3; - private static final int ACTION_PROGRESS = 4; + private static final int ACTION_FOLDER_LOADING = 1; + private static final int ACTION_REFRESH_TITLE = 2; + private static final int ACTION_PROGRESS = 3; - public void sortMessages() { - android.os.Message msg = android.os.Message.obtain(this, ACTION_SORT_MESSAGES); - sendMessage(msg); - } - public void folderLoading(String folder, boolean loading) { android.os.Message msg = android.os.Message.obtain(this, ACTION_FOLDER_LOADING, (loading) ? 1 : 0, 0, folder); @@ -454,10 +448,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { - case ACTION_SORT_MESSAGES: { - mAdapter.sortMessages(); - break; - } case ACTION_FOLDER_LOADING: { String folder = (String) msg.obj; boolean loading = (msg.arg1 == 1); @@ -1024,7 +1014,10 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick Toast toast = Toast.makeText(getActivity(), toastString, Toast.LENGTH_SHORT); toast.show(); - mAdapter.sortMessages(); + LoaderManager loaderManager = getLoaderManager(); + for (int i = 0, len = mAccountUuids.length; i < len; i++) { + loaderManager.restartLoader(i, null, this); + } } public void onCycleSort() { @@ -1451,7 +1444,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick if (updateForMe(account, folder)) { mHandler.progress(false); mHandler.folderLoading(folder, false); - mHandler.sortMessages(); } super.synchronizeMailboxFinished(account, folder, totalMessagesInMailbox, numNewMessages); } @@ -1462,7 +1454,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick if (updateForMe(account, folder)) { mHandler.progress(false); mHandler.folderLoading(folder, false); - mHandler.sortMessages(); } super.synchronizeMailboxFailed(account, folder, message); } @@ -1513,12 +1504,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick //notifyDataSetChanged(); } - public void sortMessages() { - //TODO: implement - - //notifyDataSetChanged(); - } - private String recipientSigil(boolean toMe, boolean ccMe) { if (toMe) { return getString(R.string.messagelist_sent_to_me_sigil); @@ -2667,8 +2652,54 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick String selection = query.toString(); String[] selectionArgs = queryArgs.toArray(new String[0]); + String sortColumn = MessageColumns.ID; + switch (mSortType) { + case SORT_ARRIVAL: { + sortColumn = MessageColumns.INTERNAL_DATE; + break; + } + case SORT_ATTACHMENT: { + sortColumn = "(" + MessageColumns.ATTACHMENT_COUNT + " < 1)"; + break; + } + case SORT_FLAGGED: { + sortColumn = "(" + MessageColumns.FLAGS + " NOT LIKE '%FLAGGED%')"; + break; + } + case SORT_SENDER: { + //FIXME + sortColumn = MessageColumns.SENDER_LIST; + break; + } + case SORT_SUBJECT: { + sortColumn = MessageColumns.SUBJECT; + break; + } + case SORT_UNREAD: { + sortColumn = "(" + MessageColumns.FLAGS + " LIKE '%SEEN%')"; + break; + } + case SORT_DATE: + default: { + sortColumn = MessageColumns.DATE; + } + } + + String sortDirection; + String secondarySort; + if (mSortType == SortType.SORT_DATE) { + sortDirection = (mSortDateAscending) ? " ASC" : " DESC"; + secondarySort = ""; + } else { + sortDirection = (mSortAscending) ? " ASC" : " DESC"; + secondarySort = MessageColumns.DATE + " DESC, "; + } + + String sortOrder = sortColumn + sortDirection + ", " + secondarySort + + MessageColumns.ID + " DESC"; + return new CursorLoader(getActivity(), uri, projection, selection, selectionArgs, - MessageColumns.DATE + " DESC"); + sortOrder); } private void buildQuery(Account account, ConditionsTreeNode node, StringBuilder query, diff --git a/src/com/fsck/k9/provider/EmailProvider.java b/src/com/fsck/k9/provider/EmailProvider.java index 55fff0e96..75f3a3b06 100644 --- a/src/com/fsck/k9/provider/EmailProvider.java +++ b/src/com/fsck/k9/provider/EmailProvider.java @@ -219,12 +219,14 @@ public class EmailProvider extends ContentProvider { String where; if (StringUtils.isNullOrEmpty(selection)) { - where = InternalMessageColumns.DELETED + "=0 AND " + - InternalMessageColumns.EMPTY + "!=1"; + where = InternalMessageColumns.DELETED + "=0 AND (" + + InternalMessageColumns.EMPTY + " IS NULL OR " + + InternalMessageColumns.EMPTY + "!=1)"; } else { where = "(" + selection + ") AND " + - InternalMessageColumns.DELETED + "=0 AND " + - InternalMessageColumns.EMPTY + "!=1"; + InternalMessageColumns.DELETED + "=0 AND (" + + InternalMessageColumns.EMPTY + " IS NULL OR " + + InternalMessageColumns.EMPTY + "!=1)"; } return db.query(MESSAGES_TABLE, projection, where, selectionArgs, null, null, @@ -288,7 +290,7 @@ public class EmailProvider extends ContentProvider { if (!StringUtils.isNullOrEmpty(sortOrder)) { query.append(" ORDER BY "); - query.append(sortOrder); + query.append(addPrefixToSelection(MESSAGES_COLUMNS, "m.", sortOrder)); } return db.rawQuery(query.toString(), selectionArgs);