From e2e9f8b6a373091ff1fc6f3a331935e1f36184b8 Mon Sep 17 00:00:00 2001 From: cketti Date: Sun, 6 Nov 2011 23:37:49 +0100 Subject: [PATCH] Fixed startActivityForResult() failing for MessageList Fixes issue 3638 --- AndroidManifest.xml | 5 +-- src/com/fsck/k9/activity/MessageList.java | 44 +++++++++++++++++------ src/com/fsck/k9/activity/MessageView.java | 43 ++-------------------- 3 files changed, 37 insertions(+), 55 deletions(-) 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);