1
0
mirror of https://github.com/moparisthebest/k-9 synced 2025-01-31 15:20:09 -05:00

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.
This commit is contained in:
cketti 2012-10-25 21:51:14 +02:00
parent a4585657d1
commit 49a5a3b7ff
2 changed files with 61 additions and 28 deletions

View File

@ -413,17 +413,11 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
* perform the operation in the calling thread.</p> * perform the operation in the calling thread.</p>
*/ */
class MessageListHandler extends Handler { class MessageListHandler extends Handler {
private static final int ACTION_SORT_MESSAGES = 1; private static final int ACTION_FOLDER_LOADING = 1;
private static final int ACTION_FOLDER_LOADING = 2; private static final int ACTION_REFRESH_TITLE = 2;
private static final int ACTION_REFRESH_TITLE = 3; private static final int ACTION_PROGRESS = 3;
private static final int ACTION_PROGRESS = 4;
public void sortMessages() {
android.os.Message msg = android.os.Message.obtain(this, ACTION_SORT_MESSAGES);
sendMessage(msg);
}
public void folderLoading(String folder, boolean loading) { public void folderLoading(String folder, boolean loading) {
android.os.Message msg = android.os.Message.obtain(this, ACTION_FOLDER_LOADING, android.os.Message msg = android.os.Message.obtain(this, ACTION_FOLDER_LOADING,
(loading) ? 1 : 0, 0, folder); (loading) ? 1 : 0, 0, folder);
@ -454,10 +448,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
@Override @Override
public void handleMessage(android.os.Message msg) { public void handleMessage(android.os.Message msg) {
switch (msg.what) { switch (msg.what) {
case ACTION_SORT_MESSAGES: {
mAdapter.sortMessages();
break;
}
case ACTION_FOLDER_LOADING: { case ACTION_FOLDER_LOADING: {
String folder = (String) msg.obj; String folder = (String) msg.obj;
boolean loading = (msg.arg1 == 1); 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 toast = Toast.makeText(getActivity(), toastString, Toast.LENGTH_SHORT);
toast.show(); 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() { public void onCycleSort() {
@ -1451,7 +1444,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
if (updateForMe(account, folder)) { if (updateForMe(account, folder)) {
mHandler.progress(false); mHandler.progress(false);
mHandler.folderLoading(folder, false); mHandler.folderLoading(folder, false);
mHandler.sortMessages();
} }
super.synchronizeMailboxFinished(account, folder, totalMessagesInMailbox, numNewMessages); super.synchronizeMailboxFinished(account, folder, totalMessagesInMailbox, numNewMessages);
} }
@ -1462,7 +1454,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
if (updateForMe(account, folder)) { if (updateForMe(account, folder)) {
mHandler.progress(false); mHandler.progress(false);
mHandler.folderLoading(folder, false); mHandler.folderLoading(folder, false);
mHandler.sortMessages();
} }
super.synchronizeMailboxFailed(account, folder, message); super.synchronizeMailboxFailed(account, folder, message);
} }
@ -1513,12 +1504,6 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
//notifyDataSetChanged(); //notifyDataSetChanged();
} }
public void sortMessages() {
//TODO: implement
//notifyDataSetChanged();
}
private String recipientSigil(boolean toMe, boolean ccMe) { private String recipientSigil(boolean toMe, boolean ccMe) {
if (toMe) { if (toMe) {
return getString(R.string.messagelist_sent_to_me_sigil); 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 selection = query.toString();
String[] selectionArgs = queryArgs.toArray(new String[0]); 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, return new CursorLoader(getActivity(), uri, projection, selection, selectionArgs,
MessageColumns.DATE + " DESC"); sortOrder);
} }
private void buildQuery(Account account, ConditionsTreeNode node, StringBuilder query, private void buildQuery(Account account, ConditionsTreeNode node, StringBuilder query,

View File

@ -219,12 +219,14 @@ public class EmailProvider extends ContentProvider {
String where; String where;
if (StringUtils.isNullOrEmpty(selection)) { if (StringUtils.isNullOrEmpty(selection)) {
where = InternalMessageColumns.DELETED + "=0 AND " + where = InternalMessageColumns.DELETED + "=0 AND (" +
InternalMessageColumns.EMPTY + "!=1"; InternalMessageColumns.EMPTY + " IS NULL OR " +
InternalMessageColumns.EMPTY + "!=1)";
} else { } else {
where = "(" + selection + ") AND " + where = "(" + selection + ") AND " +
InternalMessageColumns.DELETED + "=0 AND " + InternalMessageColumns.DELETED + "=0 AND (" +
InternalMessageColumns.EMPTY + "!=1"; InternalMessageColumns.EMPTY + " IS NULL OR " +
InternalMessageColumns.EMPTY + "!=1)";
} }
return db.query(MESSAGES_TABLE, projection, where, selectionArgs, null, null, return db.query(MESSAGES_TABLE, projection, where, selectionArgs, null, null,
@ -288,7 +290,7 @@ public class EmailProvider extends ContentProvider {
if (!StringUtils.isNullOrEmpty(sortOrder)) { if (!StringUtils.isNullOrEmpty(sortOrder)) {
query.append(" ORDER BY "); query.append(" ORDER BY ");
query.append(sortOrder); query.append(addPrefixToSelection(MESSAGES_COLUMNS, "m.", sortOrder));
} }
return db.rawQuery(query.toString(), selectionArgs); return db.rawQuery(query.toString(), selectionArgs);