diff options
4 files changed, 65 insertions, 19 deletions
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java index 9c5f380d7..a92efd2ac 100644 --- a/src/com/android/mail/compose/ComposeActivity.java +++ b/src/com/android/mail/compose/ComposeActivity.java @@ -157,7 +157,8 @@ public class ComposeActivity extends Activity implements OnClickListener, OnNavi private static final String EXTRA_ATTACHMENT_PREVIEWS = "attachmentPreviews"; // Extra that we can get passed from other activities - private static final String EXTRA_TO = "to"; + @VisibleForTesting + protected static final String EXTRA_TO = "to"; private static final String EXTRA_CC = "cc"; private static final String EXTRA_BCC = "bcc"; diff --git a/src/com/android/mail/ui/AbstractConversationWebViewClient.java b/src/com/android/mail/ui/AbstractConversationWebViewClient.java index b372cb0fb..bf17eafb3 100644 --- a/src/com/android/mail/ui/AbstractConversationWebViewClient.java +++ b/src/com/android/mail/ui/AbstractConversationWebViewClient.java @@ -69,20 +69,20 @@ public class AbstractConversationWebViewClient extends WebViewClient { return false; } - boolean result = false; - final Intent intent; final Uri uri = Uri.parse(url); + if (Utils.divertMailtoUri(mActivity, uri, mAccount)) { + return true; + } + + final Intent intent; if (mAccount != null && !Utils.isEmpty(mAccount.viewIntentProxyUri)) { intent = generateProxyIntent(uri); } else { intent = new Intent(Intent.ACTION_VIEW, uri); - - // If this is a mailto: uri, we want to set the account name in the intent so - // the ComposeActivity can default to the current account - Utils.addAccountToMailtoIntent(intent, mAccount); intent.putExtra(Browser.EXTRA_APPLICATION_ID, mActivity.getPackageName()); } + boolean result = false; try { intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NO_ANIMATION); diff --git a/src/com/android/mail/utils/Utils.java b/src/com/android/mail/utils/Utils.java index 32c8de7f4..c3dcb8e29 100644 --- a/src/com/android/mail/utils/Utils.java +++ b/src/com/android/mail/utils/Utils.java @@ -1322,12 +1322,22 @@ public class Utils { } /** - * Adds the Account extra to mailto intents. + * Convenience method for diverting mailto: uris directly to our compose activity. Using this + * method ensures that the Account object is not accidentally sent to a different process. + * + * @param context for sending the intent + * @param uri mailto: or other uri + * @param account desired account for potential compose activity + * @return true if a compose activity was started, false if uri should be sent to a view intent */ - public static void addAccountToMailtoIntent(Intent intent, Account account) { - if (TextUtils.equals(MAILTO_SCHEME, intent.getData().getScheme())) { - intent.putExtra(Utils.EXTRA_ACCOUNT, account); + public static boolean divertMailtoUri(final Context context, final Uri uri, + final Account account) { + final String scheme = normalizeUri(uri).getScheme(); + if (TextUtils.equals(MAILTO_SCHEME, scheme)) { + ComposeActivity.composeToAddress(context, account, uri.getSchemeSpecificPart()); + return true; } + return false; } /** diff --git a/tests/src/com/android/mail/compose/ComposeActivityTest.java b/tests/src/com/android/mail/compose/ComposeActivityTest.java index c2c55de88..6f9734103 100644 --- a/tests/src/com/android/mail/compose/ComposeActivityTest.java +++ b/tests/src/com/android/mail/compose/ComposeActivityTest.java @@ -194,7 +194,7 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos String[] bcc = activity.getBccAddresses(); String toAsString = TextUtils.join(",", to); assertEquals(1, to.length); - assertTrue(toAsString.contains(account.name)); + assertTrue(toAsString.contains(account.getEmailAddress())); assertEquals(0, cc.length); assertEquals(0, bcc.length); } @@ -686,7 +686,7 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); assertEquals(0, cc.length); assertEquals(0, bcc.length); - assertEquals("account0@mockuiprovider.com", fromAccount.name); + assertEquals("account0@mockuiprovider.com", fromAccount.getEmailAddress()); } }); } @@ -726,13 +726,13 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); assertEquals(0, cc.length); assertEquals(0, bcc.length); - assertEquals("account2@mockuiprovider.com", fromAccount.name); + assertEquals("account2@mockuiprovider.com", fromAccount.getEmailAddress()); } }); } - // Test a mailto VIEW Intent, with an account specified - public void testMailToAccount() throws Throwable { + // Test a mailto VIEW Intent, with an account specified in JSON format + public void testMailToAccountJSON() throws Throwable { final Context context = getInstrumentation().getContext(); // Get the test account final Account currentAccount = getAccountForName(context, "account2@mockuiprovider.com"); @@ -740,7 +740,7 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos // Create the mailto intent final Intent mailtoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:test@localhost.com")); - Utils.addAccountToMailtoIntent(mailtoIntent, currentAccount); + mailtoIntent.putExtra(Utils.EXTRA_ACCOUNT, currentAccount.serialize()); setActivityIntent(mailtoIntent); @@ -759,7 +759,42 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); assertEquals(0, cc.length); assertEquals(0, bcc.length); - assertEquals("account2@mockuiprovider.com", fromAccount.name); + assertEquals("account2@mockuiprovider.com", fromAccount.getEmailAddress()); + } + }); + } + + // Test a COMPOSE Intent, with an account specified in parcel format + public void testMailToAccount() throws Throwable { + final Context context = getInstrumentation().getContext(); + // Get the test account + final Account currentAccount = getAccountForName(context, "account2@mockuiprovider.com"); + + // Create the mailto intent + Intent intent = new Intent(context, ComposeActivity.class); + intent.putExtra(ComposeActivity.EXTRA_FROM_EMAIL_TASK, true); + intent.putExtra(ComposeActivity.EXTRA_ACTION, ComposeActivity.COMPOSE); + intent.putExtra(Utils.EXTRA_ACCOUNT, currentAccount); + intent.putExtra(ComposeActivity.EXTRA_TO, "test@localhost.com"); + + setActivityIntent(intent); + + final ComposeActivity activity = getActivity(); + Account fromAccount = activity.getFromAccount(); + + runTestOnUiThread(new Runnable() { + @Override + public void run() { + String[] to = activity.getToAddresses(); + String[] cc = activity.getCcAddresses(); + String[] bcc = activity.getBccAddresses(); + Account fromAccount = activity.getFromAccount(); + assertEquals( 1, to.length); + assertEquals("test@localhost.com", + Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); + assertEquals(0, cc.length); + assertEquals(0, bcc.length); + assertEquals("account2@mockuiprovider.com", fromAccount.getEmailAddress()); } }); } @@ -795,7 +830,7 @@ public class ComposeActivityTest extends ActivityInstrumentationTestCase2<Compos Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); assertEquals(0, cc.length); assertEquals(0, bcc.length); - assertEquals("account1@mockuiprovider.com", fromAccount.name); + assertEquals("account1@mockuiprovider.com", fromAccount.getEmailAddress()); } }); } |