| /** |
| * Copyright (c) 2012, Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.mail.compose; |
| |
| import android.content.ContentResolver; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.database.Cursor; |
| import android.database.MatrixCursor; |
| import android.net.Uri; |
| import android.test.ActivityInstrumentationTestCase2; |
| import android.test.suitebuilder.annotation.SmallTest; |
| import android.text.Html; |
| import android.text.TextUtils; |
| import android.text.util.Rfc822Tokenizer; |
| |
| import com.android.mail.compose.ComposeActivity; |
| import com.android.mail.providers.Account; |
| import com.android.mail.providers.Attachment; |
| import com.android.mail.providers.MailAppProvider; |
| import com.android.mail.providers.Message; |
| import com.android.mail.providers.ReplyFromAccount; |
| import com.android.mail.providers.UIProvider; |
| import com.android.mail.utils.AccountUtils; |
| import com.android.mail.utils.LogUtils; |
| import com.android.mail.utils.MatrixCursorWithCachedColumns; |
| import com.android.mail.utils.Utils; |
| |
| import org.json.JSONArray; |
| import org.json.JSONException; |
| |
| import java.lang.Deprecated; |
| import java.lang.Throwable; |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.HashSet; |
| |
| @SmallTest |
| public class ComposeActivityTest extends ActivityInstrumentationTestCase2<ComposeActivity> { |
| // TODO: Remove usages of FromAddressSpinner#initialize and ComposeActivity#initReplyRecipients. |
| // The internal state of the activity instance may have the wrong mReplyFromAccount as |
| // this is set when handling the initial intent. Theses tests should |
| // instantiate the ComposeActivity with the correct reply all intent |
| |
| // This varible shouldn't be used, as it may not match the state of the ComposeActivity |
| // TODO: remove usage of this variable |
| @Deprecated |
| private Account mAccount; |
| |
| private static final Account[] EMPTY_ACCOUNT_LIST = new Account[0]; |
| |
| public ComposeActivityTest() { |
| super(ComposeActivity.class); |
| } |
| |
| private Message getRefMessage(ContentResolver resolver, Uri folderListUri) { |
| Cursor foldersCursor = resolver.query(folderListUri, |
| UIProvider.FOLDERS_PROJECTION, null, null, null); |
| Uri convUri = null; |
| if (foldersCursor != null) { |
| foldersCursor.moveToFirst(); |
| convUri = Uri.parse(foldersCursor |
| .getString(UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN)); |
| foldersCursor.close(); |
| } |
| |
| Cursor convCursor = resolver.query(convUri, |
| UIProvider.CONVERSATION_PROJECTION, null, null, null); |
| Uri messagesUri = null; |
| if (convCursor != null) { |
| convCursor.moveToFirst(); |
| messagesUri = Uri.parse(convCursor |
| .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN)); |
| convCursor.close(); |
| } |
| |
| Cursor msgCursor = resolver.query(messagesUri, |
| UIProvider.MESSAGE_PROJECTION, null, null, null); |
| if (msgCursor != null) { |
| msgCursor.moveToFirst(); |
| } |
| return new Message(msgCursor); |
| } |
| |
| |
| private Message getRefMessage(ContentResolver resolver) { |
| return getRefMessage(resolver, mAccount.folderListUri); |
| } |
| |
| public void setAccount(ComposeActivity activity, String accountName) { |
| // Get a mock account. |
| final Account account = getAccountForName(activity, accountName); |
| if (account != null) { |
| mAccount = account; |
| activity.setAccount(mAccount); |
| } |
| } |
| |
| private Account[] getAccounts(Context context) { |
| return AccountUtils.getSyncingAccounts(context); |
| } |
| |
| private Account getAccountForName(Context context, String accountName) { |
| Account[] results = getAccounts(context); |
| for (Account account : results) { |
| if (account.name.equals(accountName)) { |
| return account; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Test the cases where: The user's reply-to is one of their custom from's |
| * and they are replying all to a message where their custom from was a |
| * recipient. TODO: verify web behavior |
| */ |
| public void testRecipientsRefReplyAllCustomFromReplyTo() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account3@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String customFrom = "CUSTOMaccount3@mockuiprovider.com"; |
| refMessage.setFrom("account3@mockuiprovider.com"); |
| refMessage.setTo("someotheraccount1@mockuiprovider.com, " |
| + "someotheraccount2@mockuiprovider.com, someotheraccount3@mockuiprovider.com, " |
| + customFrom); |
| refMessage.setReplyTo(customFrom); |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom, |
| customFrom, customFrom, true, true); |
| JSONArray array = new JSONArray(); |
| array.put(a.serialize()); |
| mAccount.accountFromAddresses = array.toString(); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, customFrom, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL, |
| currentAccount.account, EMPTY_ACCOUNT_LIST, null); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| String toAsString = TextUtils.join(",", to); |
| assertEquals(3, to.length); |
| assertFalse(toAsString.contains(customFrom)); |
| assertEquals(0, cc.length); |
| assertEquals(0, bcc.length); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: The user sent a message to one of |
| * their custom froms and just replied to that message |
| */ |
| public void testRecipientsRefReplyAllOnlyAccount() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account3@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("account3@mockuiprovider.com"); |
| refMessage.setTo("account3@mockuiprovider.com"); |
| final Account account = mAccount; |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, mAccount.name, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL, |
| currentAccount.account, EMPTY_ACCOUNT_LIST, null); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| String toAsString = TextUtils.join(",", to); |
| assertEquals(1, to.length); |
| assertTrue(toAsString.contains(account.getEmailAddress())); |
| assertEquals(0, cc.length); |
| assertEquals(0, bcc.length); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: The user sent a message to one of |
| * their custom froms and just replied to that message |
| */ |
| public void testRecipientsRefReplyAllOnlyCustomFrom() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account3@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String customFrom = "CUSTOMaccount3@mockuiprovider.com"; |
| refMessage.setFrom("account3@mockuiprovider.com"); |
| refMessage.setTo(customFrom); |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom, |
| customFrom, customFrom, true, true); |
| JSONArray array = new JSONArray(); |
| array.put(a.serialize()); |
| mAccount.accountFromAddresses = array.toString(); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, customFrom, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL, |
| currentAccount.account, EMPTY_ACCOUNT_LIST, null); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| String toAsString = TextUtils.join(",", to); |
| assertEquals(1, to.length); |
| assertTrue(toAsString.contains(customFrom)); |
| assertEquals(0, cc.length); |
| assertEquals(0, bcc.length); |
| } |
| }); |
| } |
| |
| public void testReply() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String refMessageFromAccount = refMessage.getFrom(); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| assertEquals(refMessageFromAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertTrue(cc.length == 0); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| public void testReplyWithReplyTo() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setReplyTo("replytofromaccount1@mock.com"); |
| final String refReplyToAccount = refMessage.getReplyTo(); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| assertEquals(refReplyToAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertTrue(cc.length == 0); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| /** |
| * Reply to a message you sent yourself to some recipients in the to field. |
| */ |
| public void testReplyToSelf() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("Account Test <account1@mockuiprovider.com>"); |
| refMessage.setTo("test1@gmail.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| String toAsString = TextUtils.join(",", to); |
| assertTrue(toAsString.contains("test1@gmail.com")); |
| assertTrue(cc.length == 0); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| /** |
| * Reply-all to a message you sent. |
| */ |
| public void testReplyAllToSelf() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("Account Test <account1@mockuiprovider.com>"); |
| refMessage.setTo("test1@gmail.com, test2@gmail.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 2); |
| String toAsString = TextUtils.join(",", to); |
| assertTrue(toAsString.contains("test1@gmail.com")); |
| assertTrue(toAsString.contains("test2@gmail.com")); |
| assertTrue(cc.length == 0); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| /** |
| * Reply-all to a message you sent with some to and some CC recips. |
| */ |
| public void testReplyAllToSelfWithCc() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("Account Test <account1@mockuiprovider.com>"); |
| refMessage.setTo("test1@gmail.com, test2@gmail.com"); |
| refMessage.setCc("testcc@gmail.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 2); |
| String toAsString = TextUtils.join(",", to); |
| assertTrue(toAsString.contains("test1@gmail.com")); |
| assertTrue(toAsString.contains("test2@gmail.com")); |
| String ccAsString = TextUtils.join(",", cc); |
| assertTrue(ccAsString.contains("testcc@gmail.com")); |
| assertTrue(cc.length == 1); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| public void testReplyAll() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ","); |
| final String refMessageFromAccount = refMessage.getFrom(); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| assertEquals(refMessageFromAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertEquals(cc.length, refMessageTo.length); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| public void testReplyAllWithReplyTo() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setReplyTo("replytofromaccount1@mock.com"); |
| final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ","); |
| final String refReplyToAccount = refMessage.getReplyTo(); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| assertEquals(refReplyToAccount, Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertEquals(cc.length, refMessageTo.length); |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| private static Message getRefMessageWithCc(long messageId, boolean hasAttachments) { |
| MatrixCursor cursor = new MatrixCursorWithCachedColumns(UIProvider.MESSAGE_PROJECTION); |
| final String messageUri = "content://xxx/message/" + messageId; |
| Object[] messageValues = new Object[UIProvider.MESSAGE_PROJECTION.length]; |
| messageValues[UIProvider.MESSAGE_ID_COLUMN] = Long.valueOf(messageId); |
| messageValues[UIProvider.MESSAGE_URI_COLUMN] = messageUri; |
| messageValues[UIProvider.MESSAGE_SUBJECT_COLUMN] = "Message subject"; |
| messageValues[UIProvider.MESSAGE_SNIPPET_COLUMN] = "SNIPPET"; |
| String html = "<html><body><b><i>This is some html!!!</i></b></body></html>"; |
| messageValues[UIProvider.MESSAGE_BODY_HTML_COLUMN] = html; |
| messageValues[UIProvider.MESSAGE_BODY_TEXT_COLUMN] = Html.fromHtml(html); |
| messageValues[UIProvider.MESSAGE_HAS_ATTACHMENTS_COLUMN] = hasAttachments ? 1 : 0; |
| messageValues[UIProvider.MESSAGE_DATE_RECEIVED_MS_COLUMN] = new Date().getTime(); |
| messageValues[UIProvider.MESSAGE_ATTACHMENT_LIST_URI_COLUMN] = messageUri |
| + "/getAttachments"; |
| messageValues[UIProvider.MESSAGE_TO_COLUMN] = "account1@mock.com, account2@mock.com"; |
| messageValues[UIProvider.MESSAGE_FROM_COLUMN] = "fromaccount1@mock.com"; |
| messageValues[UIProvider.MESSAGE_CC_COLUMN] = "accountcc1@mock.com, accountcc2@mock.com"; |
| cursor.addRow(messageValues); |
| cursor.moveToFirst(); |
| return new Message(cursor); |
| } |
| |
| public void testReplyAllWithCc() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessageWithCc(0, false); |
| final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ","); |
| final String[] refMessageCc = TextUtils.split(refMessage.getCc(), ","); |
| final String refMessageFromAccount = refMessage.getFrom(); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertTrue(to.length == 1); |
| assertEquals(refMessageFromAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertEquals(cc.length, refMessageTo.length + refMessageCc.length); |
| HashSet<String> ccMap = new HashSet<String>(); |
| for (String recip : cc) { |
| ccMap.add(Rfc822Tokenizer.tokenize(recip.trim())[0].getAddress()); |
| } |
| for (String toRecip : refMessageTo) { |
| assertTrue(ccMap.contains(toRecip.trim())); |
| } |
| for (String ccRecip : refMessageCc) { |
| assertTrue(ccMap.contains(ccRecip.trim())); |
| } |
| assertTrue(bcc.length == 0); |
| } |
| }); |
| } |
| |
| public void testForward() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.FORWARD); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 0); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| } |
| }); |
| } |
| |
| public void testCompose() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.COMPOSE); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 0); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: The user is replying to a message they sent |
| */ |
| public void testRecipientsRefMessageReplyToSelf() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("account0@mockuiprovider.com"); |
| refMessage.setTo("someotheraccount@mockuiprovider.com"); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 1); |
| assertTrue(to[0].contains(refMessage.getTo())); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: |
| * The user is replying to a message sent from one of their custom froms |
| */ |
| public void brokentestRecipientsRefMessageReplyToCustomFrom() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("CUSTOMaccount1@mockuiprovider.com"); |
| refMessage.setTo("someotheraccount@mockuiprovider.com"); |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, refMessage.getFrom(), |
| refMessage.getFrom(), refMessage.getFrom(), true, true); |
| JSONArray array = new JSONArray(); |
| array.put(a.serialize()); |
| mAccount.accountFromAddresses = array.toString(); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, mAccount.name, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY, currentAccount.account, |
| EMPTY_ACCOUNT_LIST, null); |
| |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 1); |
| assertTrue(to[0].contains(refMessage.getTo())); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: |
| * The user is replying to a message sent from one of their custom froms |
| */ |
| public void brokentestRecipientsRefMessageReplyAllCustomFrom() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String customFrom = "CUSTOMaccount1@mockuiprovider.com"; |
| refMessage.setFrom("senderaccount@mockuiprovider.com"); |
| refMessage.setTo("someotheraccount@mockuiprovider.com, " |
| + "someotheraccount2@mockuiprovider.com, someotheraccount4@mockuiprovider.com, " |
| + customFrom); |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom, |
| customFrom, customFrom, true, true); |
| JSONArray array = new JSONArray(); |
| array.put(a.serialize()); |
| mAccount.accountFromAddresses = array.toString(); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, mAccount.name, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL, |
| currentAccount.account, EMPTY_ACCOUNT_LIST, null); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| String toAsString = TextUtils.join(",", to); |
| String ccAsString = TextUtils.join(",", cc); |
| String bccAsString = TextUtils.join(",", bcc); |
| assertEquals(to.length, 1); |
| assertFalse(toAsString.contains(customFrom)); |
| assertFalse(ccAsString.contains(customFrom)); |
| assertFalse(bccAsString.contains(customFrom)); |
| } |
| }); |
| } |
| |
| /** |
| * Test the cases where: |
| * The user is replying to a message sent from one of their custom froms |
| */ |
| public void brokentestRecipientsRefMessageReplyAllCustomFromThisAccount() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account1@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| final String customFrom = "CUSTOMaccount1@mockuiprovider.com"; |
| refMessage.setFrom("account1@mockuiprovider.com"); |
| refMessage.setTo("someotheraccount@mockuiprovider.com, " |
| + "someotheraccount2@mockuiprovider.com, someotheraccount4@mockuiprovider.com, " |
| + customFrom); |
| activity.mFromSpinner = new FromAddressSpinner(activity); |
| ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom, |
| customFrom, customFrom, true, true); |
| JSONArray array = new JSONArray(); |
| array.put(a.serialize()); |
| mAccount.accountFromAddresses = array.toString(); |
| ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri, |
| mAccount.name, mAccount.name, mAccount.name, true, false); |
| activity.mFromSpinner.setCurrentAccount(currentAccount); |
| activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL, |
| currentAccount.account, EMPTY_ACCOUNT_LIST, null); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| String toAsString = TextUtils.join(",", to); |
| String ccAsString = TextUtils.join(",", cc); |
| String bccAsString = TextUtils.join(",", bcc); |
| // Should have the same count as the original message. |
| assertEquals(to.length, 3); |
| assertFalse(toAsString.contains(customFrom)); |
| assertFalse(ccAsString.contains(customFrom)); |
| assertFalse(bccAsString.contains(customFrom)); |
| } |
| }); |
| } |
| |
| // Test replying to a message in the first account in the list, and verify that |
| // the Compose Activity's from account for the reply is correct |
| public void testReplySendingAccount0() throws Throwable { |
| final Context context = getInstrumentation().getContext(); |
| // Get the test account |
| final Account currentAccount = getAccountForName(context, "account0@mockuiprovider.com"); |
| |
| // Get the message to be replied to |
| final Message refMessage = |
| getRefMessage(context.getContentResolver(), currentAccount.folderListUri); |
| |
| // Create the reply intent |
| final Intent replyIntent = |
| ComposeActivity.updateActionIntent(currentAccount, refMessage.uri, |
| ComposeActivity.REPLY, new Intent()); |
| |
| setActivityIntent(replyIntent); |
| |
| final ComposeActivity activity = getActivity(); |
| final String refMessageFromAccount = refMessage.getFrom(); |
| |
| 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(refMessageFromAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertEquals(0, cc.length); |
| assertEquals(0, bcc.length); |
| assertEquals("account0@mockuiprovider.com", fromAccount.getEmailAddress()); |
| } |
| }); |
| } |
| |
| // Test replying to a message in the third account in the list, and verify that |
| // the Compose Activity's from account for the reply is correct |
| public void testReplySendingAccount1() throws Throwable { |
| final Context context = getInstrumentation().getContext(); |
| // Get the test account |
| final Account currentAccount = getAccountForName(context, "account2@mockuiprovider.com"); |
| |
| // Get the message to be replied to |
| final Message refMessage = |
| getRefMessage(context.getContentResolver(), currentAccount.folderListUri); |
| |
| // Create the reply intent |
| final Intent replyIntent = |
| ComposeActivity.updateActionIntent(currentAccount, refMessage.uri, |
| ComposeActivity.REPLY, new Intent()); |
| |
| setActivityIntent(replyIntent); |
| |
| final ComposeActivity activity = getActivity(); |
| Account fromAccount = activity.getFromAccount(); |
| |
| final String refMessageFromAccount = refMessage.getFrom(); |
| |
| 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(refMessageFromAccount, |
| Rfc822Tokenizer.tokenize(to[0])[0].getAddress()); |
| assertEquals(0, cc.length); |
| assertEquals(0, bcc.length); |
| assertEquals("account2@mockuiprovider.com", fromAccount.getEmailAddress()); |
| } |
| }); |
| } |
| |
| // 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"); |
| |
| // Create the mailto intent |
| final Intent mailtoIntent = |
| new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:test@localhost.com")); |
| mailtoIntent.putExtra(Utils.EXTRA_ACCOUNT, currentAccount.serialize()); |
| |
| setActivityIntent(mailtoIntent); |
| |
| 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()); |
| } |
| }); |
| } |
| |
| // 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()); |
| } |
| }); |
| } |
| |
| // Test a mailto VIEW Intent, with no account specified. The fromAccount should default to the |
| // last sent account. |
| public void testMailToAccountWithLastSentAccount() throws Throwable { |
| final Context context = getInstrumentation().getContext(); |
| |
| // Set the last sent account to account0 |
| final Account lastSentAccount = getAccountForName(context, "account1@mockuiprovider.com"); |
| MailAppProvider appProvider = MailAppProvider.getInstance(); |
| appProvider.setLastSentFromAccount(lastSentAccount.uri.toString()); |
| |
| // Create the mailto intent |
| final Intent mailtoIntent = |
| new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:test@localhost.com")); |
| |
| setActivityIntent(mailtoIntent); |
| |
| 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("account1@mockuiprovider.com", fromAccount.getEmailAddress()); |
| } |
| }); |
| } |
| |
| private static String createAttachmentsJson() { |
| Attachment attachment1 = new Attachment(); |
| attachment1.contentUri = Uri.parse("www.google.com"); |
| attachment1.setContentType("img/jpeg"); |
| attachment1.setName("attachment1"); |
| Attachment attachment2 = new Attachment(); |
| attachment2.contentUri = Uri.parse("www.google.com"); |
| attachment2.setContentType("img/jpeg"); |
| attachment2.setName("attachment2"); |
| JSONArray attachments = new JSONArray(); |
| try { |
| attachments.put(attachment1.toJSON()); |
| attachments.put(attachment2.toJSON()); |
| } catch (JSONException e) { |
| assertTrue(false); |
| } |
| return attachments.toString(); |
| } |
| |
| // First test: switch reply to reply all to fwd, 1 to recipient, 1 cc recipient. |
| public void testChangeModes0() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("fromaccount@mockuiprovider.com"); |
| refMessage.setTo("account0@mockuiprovider.com"); |
| refMessage.setCc("ccaccount@mockuiprovider.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.mRefMessage = refMessage; |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(1, to.length); |
| assertTrue(to[0].contains(refMessage.getFrom())); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL); |
| assertEquals(activity.getToAddresses().length, 1); |
| assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom())); |
| assertEquals(activity.getCcAddresses().length, 1); |
| assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc())); |
| assertEquals(activity.getBccAddresses().length, 0); |
| activity.onNavigationItemSelected(2, ComposeActivity.FORWARD); |
| assertEquals(activity.getToAddresses().length, 0); |
| assertEquals(activity.getCcAddresses().length, 0); |
| assertEquals(activity.getBccAddresses().length, 0); |
| } |
| }); |
| } |
| |
| // Switch reply to reply all to fwd, 2 to recipients, 1 cc recipient. |
| public void testChangeModes1() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("fromaccount@mockuiprovider.com"); |
| refMessage.setTo("account0@mockuiprovider.com, toaccount0@mockuiprovider.com"); |
| refMessage.setCc("ccaccount@mockuiprovider.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.mRefMessage = refMessage; |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 1); |
| assertTrue(to[0].contains(refMessage.getFrom())); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL); |
| assertEquals(activity.getToAddresses().length, 1); |
| assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom())); |
| assertEquals(activity.getCcAddresses().length, 2); |
| assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc()) |
| || activity.getCcAddresses()[1].contains(refMessage.getCc())); |
| assertTrue(activity.getCcAddresses()[0].contains("toaccount0@mockuiprovider.com") |
| || activity.getCcAddresses()[1] |
| .contains("toaccount0@mockuiprovider.com")); |
| assertEquals(activity.getBccAddresses().length, 0); |
| activity.onNavigationItemSelected(2, ComposeActivity.FORWARD); |
| assertEquals(activity.getToAddresses().length, 0); |
| assertEquals(activity.getCcAddresses().length, 0); |
| assertEquals(activity.getBccAddresses().length, 0); |
| } |
| }); |
| } |
| |
| // Switch reply to reply all to fwd, 2 to recipients, 2 cc recipients. |
| public void testChangeModes2() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.setFrom("fromaccount@mockuiprovider.com"); |
| refMessage.setTo("account0@mockuiprovider.com, toaccount0@mockuiprovider.com"); |
| refMessage.setCc("ccaccount@mockuiprovider.com, ccaccount2@mockuiprovider.com"); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.mRefMessage = refMessage; |
| activity.initReplyRecipients(refMessage, ComposeActivity.REPLY); |
| String[] to = activity.getToAddresses(); |
| String[] cc = activity.getCcAddresses(); |
| String[] bcc = activity.getBccAddresses(); |
| assertEquals(to.length, 1); |
| assertTrue(to[0].contains(refMessage.getFrom())); |
| assertEquals(cc.length, 0); |
| assertEquals(bcc.length, 0); |
| activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL); |
| assertEquals(activity.getToAddresses().length, 1); |
| assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom())); |
| assertEquals(activity.getCcAddresses().length, 3); |
| assertTrue(activity.getCcAddresses()[0].contains("ccaccount@mockuiprovider.com") |
| || activity.getCcAddresses()[1].contains("ccaccount@mockuiprovider.com") |
| || activity.getCcAddresses()[2].contains("ccaccount@mockuiprovider.com")); |
| assertTrue(activity.getCcAddresses()[0].contains("ccaccount2@mockuiprovider.com") |
| || activity.getCcAddresses()[1].contains("ccaccount2@mockuiprovider.com") |
| || activity.getCcAddresses()[2].contains("ccaccount2@mockuiprovider.com")); |
| assertTrue(activity.getCcAddresses()[0].contains("toaccount0@mockuiprovider.com") |
| || activity.getCcAddresses()[1].contains("toaccount0@mockuiprovider.com") |
| || activity.getCcAddresses()[2].contains("toaccount0@mockuiprovider.com")); |
| assertTrue(activity.getCcAddresses()[0].contains("toaccount0@mockuiprovider.com") |
| || activity.getCcAddresses()[1] |
| .contains("toaccount0@mockuiprovider.com") |
| || activity.getCcAddresses()[2] |
| .contains("toaccount0@mockuiprovider.com")); |
| assertEquals(activity.getBccAddresses().length, 0); |
| activity.onNavigationItemSelected(2, ComposeActivity.FORWARD); |
| assertEquals(activity.getToAddresses().length, 0); |
| assertEquals(activity.getCcAddresses().length, 0); |
| assertEquals(activity.getBccAddresses().length, 0); |
| } |
| }); |
| } |
| |
| // Switch reply to reply all to fwd, 2 attachments. |
| public void testChangeModes3() throws Throwable { |
| final ComposeActivity activity = getActivity(); |
| setAccount(activity, "account0@mockuiprovider.com"); |
| final Message refMessage = getRefMessage(activity.getContentResolver()); |
| refMessage.hasAttachments = true; |
| refMessage.attachmentsJson = createAttachmentsJson(); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| activity.mRefMessage = refMessage; |
| activity.initAttachments(refMessage); |
| assertEquals(activity.getAttachments().size(), 2); |
| activity.onNavigationItemSelected(1, ComposeActivity.REPLY); |
| assertEquals(activity.getAttachments().size(), 0); |
| activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL); |
| assertEquals(activity.getAttachments().size(), 0); |
| activity.onNavigationItemSelected(2, ComposeActivity.FORWARD); |
| assertEquals(activity.getAttachments().size(), 2); |
| } |
| }); |
| } |
| } |