summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/mail/compose/ComposeActivity.java3
-rw-r--r--src/com/android/mail/ui/AbstractConversationWebViewClient.java12
-rw-r--r--src/com/android/mail/utils/Utils.java18
-rw-r--r--tests/src/com/android/mail/compose/ComposeActivityTest.java51
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());
}
});
}