diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 290486878..fa95bd48d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,9 +27,6 @@
-
-
-
diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java
index 626f522fb..7cb10161f 100644
--- a/src/com/fsck/k9/activity/MessageList.java
+++ b/src/com/fsck/k9/activity/MessageList.java
@@ -25,7 +25,6 @@ import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector;
-import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -554,6 +553,9 @@ public class MessageList
public static Intent actionHandleFolderIntent(Context context, Account account, String folder) {
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.putExtra(EXTRA_ACCOUNT, account.getUuid());
if (folder != null) {
@@ -573,6 +575,9 @@ public class MessageList
}
intent.putExtra(EXTRA_INTEGRATE, integrate);
intent.putExtra(EXTRA_TITLE, title);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
@@ -589,6 +594,9 @@ public class MessageList
intent.putExtra(EXTRA_ACCOUNT_UUIDS, searchSpecification.getAccountUuids());
intent.putExtra(EXTRA_FOLDER_NAMES, searchSpecification.getFolderNames());
intent.putExtra(EXTRA_TITLE, title);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
}
@@ -618,6 +626,12 @@ public class MessageList
mInflater = getLayoutInflater();
initializeLayout();
+
+ // Only set "touchable" when we're first starting up the activity.
+ // Otherwise we get force closes when the user toggles it midstream.
+ mTouchView = K9.messageListTouchable();
+ mPreviewLines = K9.messageListPreviewLines();
+
onNewIntent(getIntent());
}
@@ -625,22 +639,30 @@ public class MessageList
public void onNewIntent(Intent intent) {
setIntent(intent); // onNewIntent doesn't autoset our "internal" intent
- // Only set "touchable" when we're first starting up the activity.
- // Otherwise we get force closes when the user toggles it midstream.
- mTouchView = K9.messageListTouchable();
- mPreviewLines = K9.messageListPreviewLines();
-
String accountUuid = intent.getStringExtra(EXTRA_ACCOUNT);
- mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
- mFolderName = intent.getStringExtra(EXTRA_FOLDER);
- mQueryString = intent.getStringExtra(EXTRA_QUERY);
+ Account account = Preferences.getPreferences(this).getAccount(accountUuid);
+ String folderName = intent.getStringExtra(EXTRA_FOLDER);
+ String queryString = intent.getStringExtra(EXTRA_QUERY);
- if (mAccount != null && !mAccount.isAvailable(this)) {
+ if (account != null && !account.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;
+
String queryFlags = intent.getStringExtra(EXTRA_QUERY_FLAGS);
if (queryFlags != null) {
String[] flagStrings = queryFlags.split(",");
@@ -1070,7 +1092,7 @@ public class MessageList
MessageReference ref = message.message.makeMessageReference();
Log.i(K9.LOG_TAG, "MessageList sending message " + ref);
- MessageView.actionView(this, ref, messageRefs, getIntent());
+ MessageView.actionView(this, ref, messageRefs);
}
/*
diff --git a/src/com/fsck/k9/activity/MessageView.java b/src/com/fsck/k9/activity/MessageView.java
index 66670ab3a..888e57d0b 100644
--- a/src/com/fsck/k9/activity/MessageView.java
+++ b/src/com/fsck/k9/activity/MessageView.java
@@ -1,7 +1,5 @@
package com.fsck.k9.activity;
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningTaskInfo;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
@@ -36,7 +34,6 @@ import java.util.*;
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_ORIGINATING_INTENT = "com.fsck.k9.MessageView_originatingIntent";
private static final String EXTRA_NEXT = "com.fsck.k9.MessageView_next";
private static final String SHOW_PICTURES = "showPictures";
private static final String STATE_PGP_DATA = "pgpData";
@@ -65,12 +62,6 @@ public class MessageView extends K9Activity implements OnClickListener {
HAS_SUPER_ON_BACK_METHOD = hasOnBackMethod;
}
- /**
- * If user opt-in for the "Manage BACK button", we have to remember how to get back to the
- * originating activity (just recreating a new Intent could lose the calling activity state)
- */
- private Intent mCreatorIntent;
-
private SingleMessageView mMessageView;
private PgpData mPgpData;
@@ -275,20 +266,8 @@ public class MessageView extends K9Activity implements OnClickListener {
// or later, or by the code above on earlier versions of the
// platform.
if (K9.manageBack()) {
- final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- // retrieve the current+previous tasks
- final List runningTasks = activityManager.getRunningTasks(2);
- final RunningTaskInfo previousTask = runningTasks.get(1);
- final String originatingActivity = mCreatorIntent.getComponent().getClassName();
- if (originatingActivity.equals(previousTask.topActivity.getClassName())) {
- // we can safely just finish ourself since the most recent task matches our creator
- // this enable us not to worry about restoring the state of our creator
- } else {
- // the previous task top activity doesn't match our creator (previous task is from
- // another app and user used long-pressed-HOME to display MessageView)
- // launching our creator
- startActivity(mCreatorIntent);
- }
+ String folder = (mMessage != null) ? mMessage.getFolder().getName() : null;
+ MessageList.actionHandleFolder(this, mAccount, folder);
finish();
} else if (HAS_SUPER_ON_BACK_METHOD) {
super.onBackPressed();
@@ -348,29 +327,15 @@ public class MessageView extends K9Activity implements OnClickListener {
}
- /**
- * @param context
- * @param messRef
- * @param messReferences
- * @param originatingIntent
- * The intent that allow us to get back to the calling screen, for when the 'Manage
- * "Back" button' option is enabled. Never {@code null}.
- */
public static void actionView(Context context, MessageReference messRef,
- ArrayList messReferences, final Intent originatingIntent) {
+ ArrayList messReferences) {
Intent i = new Intent(context, MessageView.class);
i.putExtra(EXTRA_MESSAGE_REFERENCE, messRef);
i.putParcelableArrayListExtra(EXTRA_MESSAGE_REFERENCES, messReferences);
- i.putExtra(EXTRA_ORIGINATING_INTENT, originatingIntent);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
- @Override
- protected void onNewIntent(final Intent intent) {
- mCreatorIntent = intent.getParcelableExtra(EXTRA_ORIGINATING_INTENT);
- }
-
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle, false);
@@ -412,8 +377,6 @@ public class MessageView extends K9Activity implements OnClickListener {
setTitle("");
final Intent intent = getIntent();
- mCreatorIntent = getIntent().getParcelableExtra(EXTRA_ORIGINATING_INTENT);
-
Uri uri = intent.getData();
if (icicle != null) {
mMessageReference = icicle.getParcelable(EXTRA_MESSAGE_REFERENCE);