From 968d948dd098f032f3d1a47a613ab96388932f21 Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 30 Oct 2012 16:27:09 +0100 Subject: [PATCH] Restore show next/previous message functionality in MessageView This is just a temporary fix. In the future we want to get rid of passing the serialized message list from MessageList to MessageView. --- .../fsck/k9/fragment/MessageListFragment.java | 17 +++--- src/com/fsck/k9/provider/EmailProvider.java | 54 +++++++++++++++++-- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/com/fsck/k9/fragment/MessageListFragment.java b/src/com/fsck/k9/fragment/MessageListFragment.java index ad668d339..2cd5201c3 100644 --- a/src/com/fsck/k9/fragment/MessageListFragment.java +++ b/src/com/fsck/k9/fragment/MessageListFragment.java @@ -111,6 +111,7 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick MessageColumns.THREAD_ROOT, MessageColumns.THREAD_PARENT, SpecialColumns.ACCOUNT_UUID, + SpecialColumns.FOLDER_NAME, MessageColumns.THREAD_COUNT, }; @@ -130,7 +131,8 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick private static final int THREAD_ROOT_COLUMN = 12; private static final int THREAD_PARENT_COLUMN = 13; private static final int ACCOUNT_UUID_COLUMN = 14; - private static final int THREAD_COUNT_COLUMN = 15; + private static final int FOLDER_NAME_COLUMN = 15; + private static final int THREAD_COUNT_COLUMN = 16; private static final String[] PROJECTION = Utility.copyOf(THREADED_PROJECTION, THREAD_COUNT_COLUMN); @@ -2440,13 +2442,16 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick public ArrayList getMessageReferences() { ArrayList messageRefs = new ArrayList(); - /* - for (MessageInfoHolder holder : mAdapter.getMessages()) { - MessageReference ref = holder.message.makeMessageReference(); + for (int i = 0, len = mAdapter.getCount(); i < len; i++) { + Cursor cursor = (Cursor) mAdapter.getItem(i); + + MessageReference ref = new MessageReference(); + ref.accountUuid = cursor.getString(ACCOUNT_UUID_COLUMN); + ref.folderName = cursor.getString(FOLDER_NAME_COLUMN); + ref.uid = cursor.getString(UID_COLUMN); + messageRefs.add(ref); } - */ - //TODO: implement return messageRefs; } diff --git a/src/com/fsck/k9/provider/EmailProvider.java b/src/com/fsck/k9/provider/EmailProvider.java index 75f3a3b06..07b2ee1fa 100644 --- a/src/com/fsck/k9/provider/EmailProvider.java +++ b/src/com/fsck/k9/provider/EmailProvider.java @@ -8,6 +8,7 @@ import java.util.Map; import com.fsck.k9.Account; import com.fsck.k9.Preferences; import com.fsck.k9.helper.StringUtils; +import com.fsck.k9.helper.Utility; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.store.LocalStore; import com.fsck.k9.mail.store.LockableDatabase; @@ -36,8 +37,6 @@ import android.net.Uri; */ /* * TODO: - * - modify MessagingController (or LocalStore?) to call ContentResolver.notifyChange() to trigger - * notifications when the underlying data changes. * - add support for account list and folder list */ public class EmailProvider extends ContentProvider { @@ -94,6 +93,8 @@ public class EmailProvider extends ContentProvider { public interface SpecialColumns { public static final String ACCOUNT_UUID = "account_uuid"; + + public static final String FOLDER_NAME = "name"; } public interface MessageColumns { @@ -229,8 +230,42 @@ public class EmailProvider extends ContentProvider { InternalMessageColumns.EMPTY + "!=1)"; } - return db.query(MESSAGES_TABLE, projection, where, selectionArgs, null, null, - sortOrder); + final Cursor cursor; + if (Utility.arrayContains(projection, SpecialColumns.FOLDER_NAME)) { + StringBuilder query = new StringBuilder(); + query.append("SELECT "); + boolean first = true; + for (String columnName : projection) { + if (!first) { + query.append(","); + } else { + first = false; + } + + if (MessageColumns.ID.equals(columnName)) { + query.append("m."); + query.append(MessageColumns.ID); + query.append(" AS "); + query.append(MessageColumns.ID); + } else { + query.append(columnName); + } + } + + query.append(" FROM messages m " + + "LEFT JOIN folders f ON (m.folder_id = f.id) " + + "WHERE "); + query.append(addPrefixToSelection(MESSAGES_COLUMNS, "m.", where)); + query.append(" ORDER BY "); + query.append(addPrefixToSelection(MESSAGES_COLUMNS, "m.", sortOrder)); + + cursor = db.rawQuery(query.toString(), selectionArgs); + } else { + cursor = db.query(MESSAGES_TABLE, projection, where, selectionArgs, null, + null, sortOrder); + } + + return cursor; } }); } catch (UnavailableStorageException e) { @@ -264,6 +299,9 @@ public class EmailProvider extends ContentProvider { query.append("MAX(m.date) AS " + MessageColumns.DATE); } else if (MessageColumns.THREAD_COUNT.equals(columnName)) { query.append("COUNT(h.id) AS " + MessageColumns.THREAD_COUNT); + } else if (SpecialColumns.FOLDER_NAME.equals(columnName)) { + query.append("f." + SpecialColumns.FOLDER_NAME + " AS " + + SpecialColumns.FOLDER_NAME); } else { query.append("m."); query.append(columnName); @@ -274,7 +312,13 @@ public class EmailProvider extends ContentProvider { query.append( " FROM messages h JOIN messages m " + - "ON (h.id = m.thread_root OR h.id = m.id) " + + "ON (h.id = m.thread_root OR h.id = m.id) "); + + if (Utility.arrayContains(projection, SpecialColumns.FOLDER_NAME)) { + query.append("LEFT JOIN folders f ON (m.folder_id = f.id) "); + } + + query.append( "WHERE " + "(h.deleted = 0 AND m.deleted = 0 AND " + "(m.empty IS NULL OR m.empty != 1) AND " +