diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java index 7cb10161f..165982995 100644 --- a/src/com/fsck/k9/activity/MessageList.java +++ b/src/com/fsck/k9/activity/MessageList.java @@ -217,6 +217,7 @@ public class MessageList private static final String EXTRA_FOLDER_NAMES = "folderNames"; private static final String EXTRA_TITLE = "title"; private static final String EXTRA_LIST_POSITION = "listPosition"; + private static final String EXTRA_RETURN_FROM_MESSAGE_VIEW = "returnFromMessageView"; /** * Maps a {@link SORT_TYPE} to a {@link Comparator} implementation. @@ -546,6 +547,36 @@ public class MessageList } } + /** + * Show the message list that was used to open the {@link MessageView} for a message. + * + *

+ * Note: + * The {@link MessageList} instance should still be around and all we do is bring it back to + * the front (see the activity flags).
+ * Out of sheer paranoia we also set the extras that were used to create the original + * {@code MessageList} instance. Using those, the activity can be recreated in the unlikely + * case of it having been killed by the OS. + *

+ * + * @param context + * The {@link Context} instance to invoke the {@link Context#startActivity(Intent)} + * method on. + * @param extras + * The extras used to create the original {@code MessageList} instance. + * + * @see MessageView#actionView(Context, MessageReference, ArrayList, Bundle) + */ + public static void actionHandleFolder(Context context, Bundle extras) { + Intent intent = new Intent(context, MessageList.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtras(extras); + intent.putExtra(EXTRA_RETURN_FROM_MESSAGE_VIEW, true); + context.startActivity(intent); + } + public static void actionHandleFolder(Context context, Account account, String folder) { Intent intent = actionHandleFolderIntent(context, account, folder); context.startActivity(intent); @@ -632,36 +663,36 @@ public class MessageList mTouchView = K9.messageListTouchable(); mPreviewLines = K9.messageListPreviewLines(); - onNewIntent(getIntent()); + initializeMessageList(getIntent(), true); } @Override public void onNewIntent(Intent intent) { setIntent(intent); // onNewIntent doesn't autoset our "internal" intent + initializeMessageList(intent, false); + } + + private void initializeMessageList(Intent intent, boolean create) { + boolean returnFromMessageView = intent.getBooleanExtra( + EXTRA_RETURN_FROM_MESSAGE_VIEW, false); + + if (!create && returnFromMessageView) { + // We're returning from the MessageView activity with "Manage back button" enabled. + // So just leave the activity in the state it was left in. + return; + } String accountUuid = intent.getStringExtra(EXTRA_ACCOUNT); - Account account = Preferences.getPreferences(this).getAccount(accountUuid); - String folderName = intent.getStringExtra(EXTRA_FOLDER); - String queryString = intent.getStringExtra(EXTRA_QUERY); + mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - if (account != null && !account.isAvailable(this)) { + if (mAccount != null && !mAccount.isAvailable(this)) { Log.i(K9.LOG_TAG, "not opening MessageList of unavailable account"); onAccountUnavailable(); return; } - if (account != null && account.equals(mAccount) && - folderName != null && folderName.equals(mFolderName) && - ((queryString != null && queryString.equals(mQueryString)) || - (queryString == null && mQueryString == null))) { - // We're likely just returning from the MessageView activity with "Manage back button" - // enabled. So just leave the activity in the state it was left in. - return; - } - - mAccount = account; - mFolderName = folderName; - mQueryString = queryString; + mFolderName = intent.getStringExtra(EXTRA_FOLDER); + mQueryString = intent.getStringExtra(EXTRA_QUERY); String queryFlags = intent.getStringExtra(EXTRA_QUERY_FLAGS); if (queryFlags != null) { @@ -1092,7 +1123,7 @@ public class MessageList MessageReference ref = message.message.makeMessageReference(); Log.i(K9.LOG_TAG, "MessageList sending message " + ref); - MessageView.actionView(this, ref, messageRefs); + MessageView.actionView(this, ref, messageRefs, getIntent().getExtras()); } /* diff --git a/src/com/fsck/k9/activity/MessageView.java b/src/com/fsck/k9/activity/MessageView.java index 02fa9a88f..25af3543e 100644 --- a/src/com/fsck/k9/activity/MessageView.java +++ b/src/com/fsck/k9/activity/MessageView.java @@ -33,6 +33,7 @@ public class MessageView extends K9Activity implements OnClickListener { private static final String EXTRA_MESSAGE_REFERENCE = "com.fsck.k9.MessageView_messageReference"; private static final String EXTRA_MESSAGE_REFERENCES = "com.fsck.k9.MessageView_messageReferences"; private static final String EXTRA_NEXT = "com.fsck.k9.MessageView_next"; + private static final String EXTRA_MESSAGE_LIST_EXTRAS = "com.fsck.k9.MessageView_messageListExtras"; private static final String SHOW_PICTURES = "showPictures"; private static final String STATE_PGP_DATA = "pgpData"; private static final int ACTIVITY_CHOOSE_FOLDER_MOVE = 1; @@ -76,6 +77,14 @@ public class MessageView extends K9Activity implements OnClickListener { */ private String mDstFolder; + /** + * The extras used to create the {@link MessageList} instance that created this activity. May + * be {@code null}. + * + * @see MessageList#actionHandleFolder(Context, Bundle) + */ + private Bundle mMessageListExtras; + private final class StorageListenerImplementation implements StorageManager.StorageListener { @Override public void onUnmount(String providerId) { @@ -243,8 +252,9 @@ public class MessageView extends K9Activity implements OnClickListener { // or later, or by the code above on earlier versions of the // platform. if (K9.manageBack()) { - String folder = (mMessage != null) ? mMessage.getFolder().getName() : null; - MessageList.actionHandleFolder(this, mAccount, folder); + if (mMessageListExtras != null) { + MessageList.actionHandleFolder(this, mMessageListExtras); + } finish(); } else { finish(); @@ -303,8 +313,9 @@ public class MessageView extends K9Activity implements OnClickListener { } public static void actionView(Context context, MessageReference messRef, - ArrayList messReferences) { + ArrayList messReferences, Bundle messageListExtras) { Intent i = new Intent(context, MessageView.class); + i.putExtra(EXTRA_MESSAGE_LIST_EXTRAS, messageListExtras); i.putExtra(EXTRA_MESSAGE_REFERENCE, messRef); i.putParcelableArrayListExtra(EXTRA_MESSAGE_REFERENCES, messReferences); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); @@ -352,6 +363,8 @@ public class MessageView extends K9Activity implements OnClickListener { setTitle(""); final Intent intent = getIntent(); + mMessageListExtras = intent.getParcelableExtra(EXTRA_MESSAGE_LIST_EXTRAS); + Uri uri = intent.getData(); if (icicle != null) { mMessageReference = icicle.getParcelable(EXTRA_MESSAGE_REFERENCE);