Home | History | Annotate | Download | only in compose
      1 /**
      2  * Copyright (c) 2012, Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.mail.compose;
     18 
     19 import android.content.ContentResolver;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.database.Cursor;
     23 import android.database.MatrixCursor;
     24 import android.net.Uri;
     25 import android.test.ActivityInstrumentationTestCase2;
     26 import android.test.suitebuilder.annotation.SmallTest;
     27 import android.text.Html;
     28 import android.text.TextUtils;
     29 import android.text.util.Rfc822Tokenizer;
     30 
     31 import com.android.mail.providers.Account;
     32 import com.android.mail.providers.Attachment;
     33 import com.android.mail.providers.MailAppProvider;
     34 import com.android.mail.providers.Message;
     35 import com.android.mail.providers.ReplyFromAccount;
     36 import com.android.mail.providers.UIProvider;
     37 import com.android.mail.utils.AccountUtils;
     38 import com.android.mail.utils.MatrixCursorWithCachedColumns;
     39 import com.android.mail.utils.Utils;
     40 
     41 import org.json.JSONArray;
     42 import org.json.JSONException;
     43 
     44 import java.io.UnsupportedEncodingException;
     45 import java.net.URLEncoder;
     46 import java.util.Date;
     47 import java.util.HashSet;
     48 
     49 @SmallTest
     50 public class ComposeActivityTest extends ActivityInstrumentationTestCase2<ComposeActivity> {
     51     // TODO: Remove usages of FromAddressSpinner#initialize and ComposeActivity#initReplyRecipients.
     52     // The internal state of the activity instance may have the wrong mReplyFromAccount as
     53     // this is set when handling the initial intent.  Theses tests should
     54     // instantiate the ComposeActivity with the correct reply all intent
     55 
     56     // This varible shouldn't be used, as it may not match the state of the ComposeActivity
     57     // TODO: remove usage of this variable
     58     @Deprecated
     59     private Account mAccount;
     60 
     61     private static final Account[] EMPTY_ACCOUNT_LIST = new Account[0];
     62 
     63     public ComposeActivityTest() {
     64         super(ComposeActivity.class);
     65     }
     66 
     67     private Message getRefMessage(ContentResolver resolver, Uri folderListUri) {
     68         Cursor foldersCursor = resolver.query(folderListUri,
     69                 UIProvider.FOLDERS_PROJECTION, null, null, null);
     70         Uri convUri = null;
     71         if (foldersCursor != null) {
     72             foldersCursor.moveToFirst();
     73             convUri = Uri.parse(foldersCursor
     74                     .getString(UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN));
     75             foldersCursor.close();
     76         }
     77 
     78         Cursor convCursor = resolver.query(convUri,
     79                 UIProvider.CONVERSATION_PROJECTION, null, null, null);
     80         Uri messagesUri = null;
     81         if (convCursor != null) {
     82             convCursor.moveToFirst();
     83             messagesUri = Uri.parse(convCursor
     84                     .getString(UIProvider.CONVERSATION_MESSAGE_LIST_URI_COLUMN));
     85             convCursor.close();
     86         }
     87 
     88         Cursor msgCursor = resolver.query(messagesUri,
     89                 UIProvider.MESSAGE_PROJECTION, null, null, null);
     90         if (msgCursor != null) {
     91             msgCursor.moveToFirst();
     92         }
     93         return new Message(msgCursor);
     94     }
     95 
     96 
     97     private Message getRefMessage(ContentResolver resolver) {
     98         final Account account = getActivity().getFromAccount();
     99         return getRefMessage(resolver, account.folderListUri);
    100     }
    101 
    102     public void setAccount(ComposeActivity activity, String accountName) {
    103         // Get a mock account.
    104         final Account account = getAccountForName(activity, accountName);
    105         if (account != null) {
    106             mAccount = account;
    107             activity.setAccount(mAccount);
    108         }
    109     }
    110 
    111     private Account[] getAccounts(Context context) {
    112         return AccountUtils.getSyncingAccounts(context);
    113     }
    114 
    115     private Account getAccountForName(Context context, String accountName) {
    116         Account[] results = getAccounts(context);
    117         for (Account account : results) {
    118             if (account.getEmailAddress().equals(accountName)) {
    119                 return account;
    120             }
    121         }
    122         return null;
    123     }
    124 
    125     /**
    126      * Test the cases where: The user's reply-to is one of their custom from's
    127      * and they are replying all to a message where their custom from was a
    128      * recipient. TODO: verify web behavior
    129      */
    130     public void testRecipientsRefReplyAllCustomFromReplyTo() throws Throwable {
    131         final ComposeActivity activity = getActivity();
    132         setAccount(activity, "account3 (at) mockuiprovider.com");
    133         final Message refMessage = getRefMessage(activity.getContentResolver());
    134         final String customFrom = "CUSTOMaccount3 (at) mockuiprovider.com";
    135         refMessage.setFrom("account3 (at) mockuiprovider.com");
    136         refMessage.setTo("someotheraccount1 (at) mockuiprovider.com, "
    137                 + "someotheraccount2 (at) mockuiprovider.com, someotheraccount3 (at) mockuiprovider.com, "
    138                 + customFrom);
    139         refMessage.setReplyTo(customFrom);
    140         activity.mFromSpinner = new FromAddressSpinner(activity);
    141         ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom,
    142                 customFrom, customFrom, true, true);
    143         JSONArray array = new JSONArray();
    144         array.put(a.serialize());
    145         mAccount.accountFromAddresses = array.toString();
    146         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    147                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), customFrom, true, false);
    148         activity.mFromSpinner.setCurrentAccount(currentAccount);
    149 
    150         activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL,
    151                 currentAccount.account, EMPTY_ACCOUNT_LIST, null);
    152         runTestOnUiThread(new Runnable() {
    153             @Override
    154             public void run() {
    155                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    156                 String[] to = activity.getToAddresses();
    157                 String[] cc = activity.getCcAddresses();
    158                 String[] bcc = activity.getBccAddresses();
    159                 String toAsString = TextUtils.join(",", to);
    160                 assertEquals(3, to.length);
    161                 assertFalse(toAsString.contains(customFrom));
    162                 assertEquals(0, cc.length);
    163                 assertEquals(0, bcc.length);
    164             }
    165         });
    166     }
    167 
    168     /**
    169      * Test the cases where: The user sent a message to one of
    170      * their custom froms and just replied to that message
    171      */
    172     public void testRecipientsRefReplyAllOnlyAccount() throws Throwable {
    173         final ComposeActivity activity = getActivity();
    174         setAccount(activity, "account3 (at) mockuiprovider.com");
    175         final Message refMessage = getRefMessage(activity.getContentResolver());
    176         refMessage.setFrom("account3 (at) mockuiprovider.com");
    177         refMessage.setTo("account3 (at) mockuiprovider.com");
    178         final Account account = mAccount;
    179         activity.mFromSpinner = new FromAddressSpinner(activity);
    180         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    181                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), mAccount.getEmailAddress(),
    182                 true, false);
    183         activity.mFromSpinner.setCurrentAccount(currentAccount);
    184 
    185         activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL,
    186                 currentAccount.account, EMPTY_ACCOUNT_LIST, null);
    187         runTestOnUiThread(new Runnable() {
    188             @Override
    189             public void run() {
    190                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    191                 String[] to = activity.getToAddresses();
    192                 String[] cc = activity.getCcAddresses();
    193                 String[] bcc = activity.getBccAddresses();
    194                 String toAsString = TextUtils.join(",", to);
    195                 assertEquals(1, to.length);
    196                 assertTrue(toAsString.contains(account.getEmailAddress()));
    197                 assertEquals(0, cc.length);
    198                 assertEquals(0, bcc.length);
    199             }
    200         });
    201     }
    202 
    203     /**
    204      * Test the cases where: The user sent a message to one of
    205      * their custom froms and just replied to that message
    206      */
    207     public void testRecipientsRefReplyAllOnlyCustomFrom() throws Throwable {
    208         final ComposeActivity activity = getActivity();
    209         setAccount(activity, "account3 (at) mockuiprovider.com");
    210         final Message refMessage = getRefMessage(activity.getContentResolver());
    211         final String customFrom = "CUSTOMaccount3 (at) mockuiprovider.com";
    212         refMessage.setFrom("account3 (at) mockuiprovider.com");
    213         refMessage.setTo(customFrom);
    214         activity.mFromSpinner = new FromAddressSpinner(activity);
    215         ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom,
    216                 customFrom, customFrom, true, true);
    217         JSONArray array = new JSONArray();
    218         array.put(a.serialize());
    219         mAccount.accountFromAddresses = array.toString();
    220         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    221                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), customFrom, true, false);
    222         activity.mFromSpinner.setCurrentAccount(currentAccount);
    223 
    224         activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL,
    225                 currentAccount.account, EMPTY_ACCOUNT_LIST, null);
    226         runTestOnUiThread(new Runnable() {
    227             @Override
    228             public void run() {
    229                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    230                 String[] to = activity.getToAddresses();
    231                 String[] cc = activity.getCcAddresses();
    232                 String[] bcc = activity.getBccAddresses();
    233                 String toAsString = TextUtils.join(",", to);
    234                 assertEquals(1, to.length);
    235                 assertTrue(toAsString.contains(customFrom));
    236                 assertEquals(0, cc.length);
    237                 assertEquals(0, bcc.length);
    238             }
    239         });
    240     }
    241 
    242     public void testReply() throws Throwable {
    243         final ComposeActivity activity = getActivity();
    244         setAccount(activity, "account0 (at) mockuiprovider.com");
    245         final Message refMessage = getRefMessage(activity.getContentResolver());
    246         final String refMessageFromAccount = refMessage.getFrom();
    247 
    248         runTestOnUiThread(new Runnable() {
    249             @Override
    250             public void run() {
    251                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    252                 String[] to = activity.getToAddresses();
    253                 String[] cc = activity.getCcAddresses();
    254                 String[] bcc = activity.getBccAddresses();
    255                 assertTrue(to.length == 1);
    256                 assertEquals(refMessageFromAccount,
    257                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    258                 assertTrue(cc.length == 0);
    259                 assertTrue(bcc.length == 0);
    260             }
    261         });
    262     }
    263 
    264     public void testReplyWithReplyTo() throws Throwable {
    265         final ComposeActivity activity = getActivity();
    266         setAccount(activity, "account1 (at) mockuiprovider.com");
    267         final Message refMessage = getRefMessage(activity.getContentResolver());
    268         refMessage.setReplyTo("replytofromaccount1 (at) mock.com");
    269         final String refReplyToAccount = refMessage.getReplyTo();
    270 
    271         runTestOnUiThread(new Runnable() {
    272             @Override
    273             public void run() {
    274                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    275                 String[] to = activity.getToAddresses();
    276                 String[] cc = activity.getCcAddresses();
    277                 String[] bcc = activity.getBccAddresses();
    278                 assertTrue(to.length == 1);
    279                 assertEquals(refReplyToAccount,
    280                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    281                 assertTrue(cc.length == 0);
    282                 assertTrue(bcc.length == 0);
    283             }
    284         });
    285     }
    286 
    287     /**
    288      * Reply to a message you sent yourself to some recipients in the to field.
    289      */
    290     public void testReplyToSelf() throws Throwable {
    291         final ComposeActivity activity = getActivity();
    292         setAccount(activity, "account1 (at) mockuiprovider.com");
    293         final Message refMessage = getRefMessage(activity.getContentResolver());
    294         refMessage.setFrom("Account Test <account1 (at) mockuiprovider.com>");
    295         refMessage.setTo("test1 (at) gmail.com");
    296         runTestOnUiThread(new Runnable() {
    297             @Override
    298             public void run() {
    299                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    300                 String[] to = activity.getToAddresses();
    301                 String[] cc = activity.getCcAddresses();
    302                 String[] bcc = activity.getBccAddresses();
    303                 assertTrue(to.length == 1);
    304                 String toAsString = TextUtils.join(",", to);
    305                 assertTrue(toAsString.contains("test1 (at) gmail.com"));
    306                 assertTrue(cc.length == 0);
    307                 assertTrue(bcc.length == 0);
    308             }
    309         });
    310     }
    311 
    312     /**
    313      * Reply-all to a message you sent.
    314      */
    315     public void testReplyAllToSelf() throws Throwable {
    316         final ComposeActivity activity = getActivity();
    317         setAccount(activity, "account1 (at) mockuiprovider.com");
    318         final Message refMessage = getRefMessage(activity.getContentResolver());
    319         refMessage.setFrom("Account Test <account1 (at) mockuiprovider.com>");
    320         refMessage.setTo("test1 (at) gmail.com, test2 (at) gmail.com");
    321         runTestOnUiThread(new Runnable() {
    322             @Override
    323             public void run() {
    324                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    325                 String[] to = activity.getToAddresses();
    326                 String[] cc = activity.getCcAddresses();
    327                 String[] bcc = activity.getBccAddresses();
    328                 assertEquals(to.length, 2);
    329                 String toAsString = TextUtils.join(",", to);
    330                 assertTrue(toAsString.contains("test1 (at) gmail.com"));
    331                 assertTrue(toAsString.contains("test2 (at) gmail.com"));
    332                 assertTrue(cc.length == 0);
    333                 assertTrue(bcc.length == 0);
    334             }
    335         });
    336     }
    337 
    338     /**
    339      * Reply-all to a message you sent with some to and some CC recips.
    340      */
    341     public void testReplyAllToSelfWithCc() throws Throwable {
    342         final ComposeActivity activity = getActivity();
    343         setAccount(activity, "account1 (at) mockuiprovider.com");
    344         final Message refMessage = getRefMessage(activity.getContentResolver());
    345         refMessage.setFrom("Account Test <account1 (at) mockuiprovider.com>");
    346         refMessage.setTo("test1 (at) gmail.com, test2 (at) gmail.com");
    347         refMessage.setCc("testcc (at) gmail.com");
    348         runTestOnUiThread(new Runnable() {
    349             @Override
    350             public void run() {
    351                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    352                 String[] to = activity.getToAddresses();
    353                 String[] cc = activity.getCcAddresses();
    354                 String[] bcc = activity.getBccAddresses();
    355                 assertEquals(to.length, 2);
    356                 String toAsString = TextUtils.join(",", to);
    357                 assertTrue(toAsString.contains("test1 (at) gmail.com"));
    358                 assertTrue(toAsString.contains("test2 (at) gmail.com"));
    359                 String ccAsString = TextUtils.join(",", cc);
    360                 assertTrue(ccAsString.contains("testcc (at) gmail.com"));
    361                 assertTrue(cc.length == 1);
    362                 assertTrue(bcc.length == 0);
    363             }
    364         });
    365     }
    366 
    367     public void testReplyAll() throws Throwable {
    368         final ComposeActivity activity = getActivity();
    369         setAccount(activity, "account0 (at) mockuiprovider.com");
    370         final Message refMessage = getRefMessage(activity.getContentResolver());
    371         final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
    372         final String refMessageFromAccount = refMessage.getFrom();
    373 
    374         runTestOnUiThread(new Runnable() {
    375             @Override
    376             public void run() {
    377                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    378                 String[] to = activity.getToAddresses();
    379                 String[] cc = activity.getCcAddresses();
    380                 String[] bcc = activity.getBccAddresses();
    381                 assertTrue(to.length == 1);
    382                 assertEquals(refMessageFromAccount,
    383                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    384                 assertEquals(cc.length, refMessageTo.length);
    385                 assertTrue(bcc.length == 0);
    386             }
    387         });
    388     }
    389 
    390     public void testReplyAllWithReplyTo() throws Throwable {
    391         final ComposeActivity activity = getActivity();
    392         setAccount(activity, "account1 (at) mockuiprovider.com");
    393         final Message refMessage = getRefMessage(activity.getContentResolver());
    394         refMessage.setReplyTo("replytofromaccount1 (at) mock.com");
    395         final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
    396         final String refReplyToAccount = refMessage.getReplyTo();
    397 
    398         runTestOnUiThread(new Runnable() {
    399             @Override
    400             public void run() {
    401                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    402                 String[] to = activity.getToAddresses();
    403                 String[] cc = activity.getCcAddresses();
    404                 String[] bcc = activity.getBccAddresses();
    405                 assertTrue(to.length == 1);
    406                 assertEquals(refReplyToAccount, Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    407                 assertEquals(cc.length, refMessageTo.length);
    408                 assertTrue(bcc.length == 0);
    409             }
    410         });
    411     }
    412 
    413     private static Message getRefMessageWithCc(long messageId, boolean hasAttachments) {
    414         MatrixCursor cursor = new MatrixCursorWithCachedColumns(UIProvider.MESSAGE_PROJECTION);
    415         final String messageUri = "content://xxx/message/" + messageId;
    416         Object[] messageValues = new Object[UIProvider.MESSAGE_PROJECTION.length];
    417         messageValues[UIProvider.MESSAGE_ID_COLUMN] = Long.valueOf(messageId);
    418         messageValues[UIProvider.MESSAGE_URI_COLUMN] = messageUri;
    419         messageValues[UIProvider.MESSAGE_SUBJECT_COLUMN] = "Message subject";
    420         messageValues[UIProvider.MESSAGE_SNIPPET_COLUMN] = "SNIPPET";
    421         String html = "<html><body><b><i>This is some html!!!</i></b></body></html>";
    422         messageValues[UIProvider.MESSAGE_BODY_HTML_COLUMN] = html;
    423         messageValues[UIProvider.MESSAGE_BODY_TEXT_COLUMN] = Html.fromHtml(html);
    424         messageValues[UIProvider.MESSAGE_HAS_ATTACHMENTS_COLUMN] = hasAttachments ? 1 : 0;
    425         messageValues[UIProvider.MESSAGE_DATE_RECEIVED_MS_COLUMN] = new Date().getTime();
    426         messageValues[UIProvider.MESSAGE_ATTACHMENT_LIST_URI_COLUMN] = messageUri
    427                 + "/getAttachments";
    428         messageValues[UIProvider.MESSAGE_TO_COLUMN] = "account1 (at) mock.com, account2 (at) mock.com";
    429         messageValues[UIProvider.MESSAGE_FROM_COLUMN] = "fromaccount1 (at) mock.com";
    430         messageValues[UIProvider.MESSAGE_CC_COLUMN] = "accountcc1 (at) mock.com, accountcc2 (at) mock.com";
    431         cursor.addRow(messageValues);
    432         cursor.moveToFirst();
    433         return new Message(cursor);
    434     }
    435 
    436     public void testReplyAllWithCc() throws Throwable {
    437         final ComposeActivity activity = getActivity();
    438         setAccount(activity, "account1 (at) mockuiprovider.com");
    439         final Message refMessage = getRefMessageWithCc(0, false);
    440         final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
    441         final String[] refMessageCc = TextUtils.split(refMessage.getCc(), ",");
    442         final String refMessageFromAccount = refMessage.getFrom();
    443 
    444         runTestOnUiThread(new Runnable() {
    445             @Override
    446             public void run() {
    447                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    448                 String[] to = activity.getToAddresses();
    449                 String[] cc = activity.getCcAddresses();
    450                 String[] bcc = activity.getBccAddresses();
    451                 assertTrue(to.length == 1);
    452                 assertEquals(refMessageFromAccount,
    453                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    454                 assertEquals(cc.length, refMessageTo.length + refMessageCc.length);
    455                 HashSet<String> ccMap = new HashSet<String>();
    456                 for (String recip : cc) {
    457                     ccMap.add(Rfc822Tokenizer.tokenize(recip.trim())[0].getAddress());
    458                 }
    459                 for (String toRecip : refMessageTo) {
    460                     assertTrue(ccMap.contains(toRecip.trim()));
    461                 }
    462                 for (String ccRecip : refMessageCc) {
    463                     assertTrue(ccMap.contains(ccRecip.trim()));
    464                 }
    465                 assertTrue(bcc.length == 0);
    466             }
    467         });
    468     }
    469 
    470     public void testForward() throws Throwable {
    471         final ComposeActivity activity = getActivity();
    472         setAccount(activity, "account0 (at) mockuiprovider.com");
    473         final Message refMessage = getRefMessage(activity.getContentResolver());
    474 
    475         runTestOnUiThread(new Runnable() {
    476             @Override
    477             public void run() {
    478                 activity.initReplyRecipients(refMessage, ComposeActivity.FORWARD);
    479                 String[] to = activity.getToAddresses();
    480                 String[] cc = activity.getCcAddresses();
    481                 String[] bcc = activity.getBccAddresses();
    482                 assertEquals(to.length, 0);
    483                 assertEquals(cc.length, 0);
    484                 assertEquals(bcc.length, 0);
    485             }
    486         });
    487     }
    488 
    489     public void testCompose() throws Throwable {
    490         final ComposeActivity activity = getActivity();
    491         setAccount(activity, "account0 (at) mockuiprovider.com");
    492         final Message refMessage = getRefMessage(activity.getContentResolver());
    493 
    494         runTestOnUiThread(new Runnable() {
    495             @Override
    496             public void run() {
    497                 activity.initReplyRecipients(refMessage, ComposeActivity.COMPOSE);
    498                 String[] to = activity.getToAddresses();
    499                 String[] cc = activity.getCcAddresses();
    500                 String[] bcc = activity.getBccAddresses();
    501                 assertEquals(to.length, 0);
    502                 assertEquals(cc.length, 0);
    503                 assertEquals(bcc.length, 0);
    504             }
    505         });
    506     }
    507 
    508     /**
    509      * Test the cases where: The user is replying to a message they sent
    510      */
    511     public void testRecipientsRefMessageReplyToSelf() throws Throwable {
    512         final ComposeActivity activity = getActivity();
    513         setAccount(activity, "account0 (at) mockuiprovider.com");
    514         final Message refMessage = getRefMessage(activity.getContentResolver());
    515         refMessage.setFrom("account0 (at) mockuiprovider.com");
    516         refMessage.setTo("someotheraccount (at) mockuiprovider.com");
    517 
    518         runTestOnUiThread(new Runnable() {
    519             @Override
    520             public void run() {
    521                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    522                 String[] to = activity.getToAddresses();
    523                 String[] cc = activity.getCcAddresses();
    524                 String[] bcc = activity.getBccAddresses();
    525                 assertEquals(to.length, 1);
    526                 assertTrue(to[0].contains(refMessage.getTo()));
    527                 assertEquals(cc.length, 0);
    528                 assertEquals(bcc.length, 0);
    529             }
    530         });
    531     }
    532 
    533     /**
    534      * Test the cases where:
    535      * The user is replying to a message sent from one of their custom froms
    536      */
    537     public void brokentestRecipientsRefMessageReplyToCustomFrom() throws Throwable {
    538         final ComposeActivity activity = getActivity();
    539         setAccount(activity, "account1 (at) mockuiprovider.com");
    540         final Message refMessage = getRefMessage(activity.getContentResolver());
    541         refMessage.setFrom("CUSTOMaccount1 (at) mockuiprovider.com");
    542         refMessage.setTo("someotheraccount (at) mockuiprovider.com");
    543         activity.mFromSpinner = new FromAddressSpinner(activity);
    544         ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, refMessage.getFrom(),
    545                 refMessage.getFrom(), refMessage.getFrom(), true, true);
    546         JSONArray array = new JSONArray();
    547         array.put(a.serialize());
    548         mAccount.accountFromAddresses = array.toString();
    549         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    550                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), mAccount.getEmailAddress(),
    551                 true, false);
    552         activity.mFromSpinner.setCurrentAccount(currentAccount);
    553         activity.mFromSpinner.initialize(ComposeActivity.REPLY, currentAccount.account,
    554                 EMPTY_ACCOUNT_LIST, null);
    555 
    556         runTestOnUiThread(new Runnable() {
    557             @Override
    558             public void run() {
    559                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    560                 String[] to = activity.getToAddresses();
    561                 String[] cc = activity.getCcAddresses();
    562                 String[] bcc = activity.getBccAddresses();
    563                 assertEquals(to.length, 1);
    564                 assertTrue(to[0].contains(refMessage.getTo()));
    565                 assertEquals(cc.length, 0);
    566                 assertEquals(bcc.length, 0);
    567             }
    568         });
    569     }
    570 
    571     /**
    572      * Test the cases where:
    573      * The user is replying to a message sent from one of their custom froms
    574      */
    575     public void brokentestRecipientsRefMessageReplyAllCustomFrom() throws Throwable {
    576         final ComposeActivity activity = getActivity();
    577         setAccount(activity, "account1 (at) mockuiprovider.com");
    578         final Message refMessage = getRefMessage(activity.getContentResolver());
    579         final String customFrom = "CUSTOMaccount1 (at) mockuiprovider.com";
    580         refMessage.setFrom("senderaccount (at) mockuiprovider.com");
    581         refMessage.setTo("someotheraccount (at) mockuiprovider.com, "
    582                 + "someotheraccount2 (at) mockuiprovider.com, someotheraccount4 (at) mockuiprovider.com, "
    583                 + customFrom);
    584         activity.mFromSpinner = new FromAddressSpinner(activity);
    585         ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom,
    586                 customFrom, customFrom, true, true);
    587         JSONArray array = new JSONArray();
    588         array.put(a.serialize());
    589         mAccount.accountFromAddresses = array.toString();
    590         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    591                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), mAccount.getEmailAddress(),
    592                 true, false);
    593         activity.mFromSpinner.setCurrentAccount(currentAccount);
    594         activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL,
    595                 currentAccount.account, EMPTY_ACCOUNT_LIST, null);
    596         runTestOnUiThread(new Runnable() {
    597             @Override
    598             public void run() {
    599                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    600                 String[] to = activity.getToAddresses();
    601                 String[] cc = activity.getCcAddresses();
    602                 String[] bcc = activity.getBccAddresses();
    603                 String toAsString = TextUtils.join(",", to);
    604                 String ccAsString = TextUtils.join(",", cc);
    605                 String bccAsString = TextUtils.join(",", bcc);
    606                 assertEquals(to.length, 1);
    607                 assertFalse(toAsString.contains(customFrom));
    608                 assertFalse(ccAsString.contains(customFrom));
    609                 assertFalse(bccAsString.contains(customFrom));
    610             }
    611         });
    612     }
    613 
    614     /**
    615      * Test the cases where:
    616      * The user is replying to a message sent from one of their custom froms
    617      */
    618     public void brokentestRecipientsRefMessageReplyAllCustomFromThisAccount() throws Throwable {
    619         final ComposeActivity activity = getActivity();
    620         setAccount(activity, "account1 (at) mockuiprovider.com");
    621         final Message refMessage = getRefMessage(activity.getContentResolver());
    622         final String customFrom = "CUSTOMaccount1 (at) mockuiprovider.com";
    623         refMessage.setFrom("account1 (at) mockuiprovider.com");
    624         refMessage.setTo("someotheraccount (at) mockuiprovider.com, "
    625                 + "someotheraccount2 (at) mockuiprovider.com, someotheraccount4 (at) mockuiprovider.com, "
    626                 + customFrom);
    627         activity.mFromSpinner = new FromAddressSpinner(activity);
    628         ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, customFrom,
    629                 customFrom, customFrom, true, true);
    630         JSONArray array = new JSONArray();
    631         array.put(a.serialize());
    632         mAccount.accountFromAddresses = array.toString();
    633         ReplyFromAccount currentAccount = new ReplyFromAccount(mAccount, mAccount.uri,
    634                 mAccount.getEmailAddress(), mAccount.getEmailAddress(), mAccount.getEmailAddress(),
    635                 true, false);
    636         activity.mFromSpinner.setCurrentAccount(currentAccount);
    637         activity.mFromSpinner.initialize(ComposeActivity.REPLY_ALL,
    638                 currentAccount.account, EMPTY_ACCOUNT_LIST, null);
    639         runTestOnUiThread(new Runnable() {
    640             @Override
    641             public void run() {
    642                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY_ALL);
    643                 String[] to = activity.getToAddresses();
    644                 String[] cc = activity.getCcAddresses();
    645                 String[] bcc = activity.getBccAddresses();
    646                 String toAsString = TextUtils.join(",", to);
    647                 String ccAsString = TextUtils.join(",", cc);
    648                 String bccAsString = TextUtils.join(",", bcc);
    649                 // Should have the same count as the original message.
    650                 assertEquals(to.length, 3);
    651                 assertFalse(toAsString.contains(customFrom));
    652                 assertFalse(ccAsString.contains(customFrom));
    653                 assertFalse(bccAsString.contains(customFrom));
    654             }
    655         });
    656     }
    657 
    658     // Test replying to a message in the first account in the list, and verify that
    659     // the Compose Activity's from account for the reply is correct
    660     public void testReplySendingAccount0() throws Throwable {
    661         final Context context = getInstrumentation().getContext();
    662         // Get the test account
    663         final Account currentAccount = getAccountForName(context, "account0 (at) mockuiprovider.com");
    664 
    665         // Get the message to be replied to
    666         final Message refMessage =
    667                 getRefMessage(context.getContentResolver(), currentAccount.folderListUri);
    668 
    669         // Create the reply intent
    670         final Intent replyIntent =
    671                 ComposeActivity.updateActionIntent(currentAccount, refMessage.uri,
    672                         ComposeActivity.REPLY, new Intent());
    673 
    674         setActivityIntent(replyIntent);
    675 
    676         final ComposeActivity activity = getActivity();
    677         final String refMessageFromAccount = refMessage.getFrom();
    678 
    679         runTestOnUiThread(new Runnable() {
    680             @Override
    681             public void run() {
    682                 String[] to = activity.getToAddresses();
    683                 String[] cc = activity.getCcAddresses();
    684                 String[] bcc = activity.getBccAddresses();
    685                 Account fromAccount = activity.getFromAccount();
    686                 assertEquals(1, to.length);
    687                 assertEquals(refMessageFromAccount,
    688                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    689                 assertEquals(0, cc.length);
    690                 assertEquals(0, bcc.length);
    691                 assertEquals("account0 (at) mockuiprovider.com", fromAccount.getEmailAddress());
    692             }
    693         });
    694     }
    695 
    696     // Test replying to a message in the third account in the list, and verify that
    697     // the Compose Activity's from account for the reply is correct
    698     public void testReplySendingAccount1() throws Throwable {
    699         final Context context = getInstrumentation().getContext();
    700         // Get the test account
    701         final Account currentAccount = getAccountForName(context, "account2 (at) mockuiprovider.com");
    702 
    703         // Get the message to be replied to
    704         final Message refMessage =
    705                 getRefMessage(context.getContentResolver(), currentAccount.folderListUri);
    706 
    707         // Create the reply intent
    708         final Intent replyIntent =
    709                 ComposeActivity.updateActionIntent(currentAccount, refMessage.uri,
    710                         ComposeActivity.REPLY, new Intent());
    711 
    712         setActivityIntent(replyIntent);
    713 
    714         final ComposeActivity activity = getActivity();
    715         Account fromAccount = activity.getFromAccount();
    716 
    717         final String refMessageFromAccount = refMessage.getFrom();
    718 
    719         runTestOnUiThread(new Runnable() {
    720             @Override
    721             public void run() {
    722                 String[] to = activity.getToAddresses();
    723                 String[] cc = activity.getCcAddresses();
    724                 String[] bcc = activity.getBccAddresses();
    725                 Account fromAccount = activity.getFromAccount();
    726                 assertEquals(1, to.length);
    727                 assertEquals(refMessageFromAccount,
    728                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    729                 assertEquals(0, cc.length);
    730                 assertEquals(0, bcc.length);
    731                 assertEquals("account2 (at) mockuiprovider.com", fromAccount.getEmailAddress());
    732             }
    733         });
    734     }
    735 
    736     private static String encodeMailtoParam(String s) throws UnsupportedEncodingException {
    737         return URLEncoder.encode(s, "UTF-8").replace("+", "%20");
    738     }
    739 
    740     public void testMailto() throws Throwable {
    741         final String to = "foo (at) bar.com";
    742         final String cc = "baz (at) baf.com";
    743         final String subject = "hello world";
    744         final String body = "Dear foo,\nGoodbye.\n--me";
    745 
    746         final String mailto = String.format("mailto:%s?cc=%s&subject=%s&body=%s",
    747                 encodeMailtoParam(to), encodeMailtoParam(cc), encodeMailtoParam(subject),
    748                 encodeMailtoParam(body));
    749 
    750         final Intent mailtoIntent = new Intent(Intent.ACTION_VIEW,
    751                 Uri.parse(mailto));
    752         setActivityIntent(mailtoIntent);
    753 
    754         final ComposeActivity activity = getActivity();
    755 
    756         runTestOnUiThread(new Runnable() {
    757             @Override
    758             public void run() {
    759                 final String resultTo[] = activity.getToAddresses();
    760                 assertEquals(1, resultTo.length);
    761                 assertEquals(to, Rfc822Tokenizer.tokenize(resultTo[0])[0].getAddress());
    762 
    763                 final String resultCc[] = activity.getCcAddresses();
    764                 assertEquals(1, resultCc.length);
    765                 assertEquals(cc, Rfc822Tokenizer.tokenize(resultCc[0])[0].getAddress());
    766 
    767                 assertEquals(subject, activity.getSubject());
    768 // the result is HTML-wrapped in a way that's not trivial to test, so disabled for now
    769 //                assertEquals(body, activity.getBodyHtml());
    770             }
    771         });
    772     }
    773 
    774     // Test a mailto VIEW Intent, with an account specified in JSON format
    775     public void testMailToAccountJSON() throws Throwable {
    776         final Context context = getInstrumentation().getContext();
    777         // Get the test account
    778         final Account currentAccount = getAccountForName(context, "account2 (at) mockuiprovider.com");
    779 
    780         // Create the mailto intent
    781         final Intent mailtoIntent =
    782                 new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:test (at) localhost.com"));
    783         mailtoIntent.putExtra(Utils.EXTRA_ACCOUNT, currentAccount.serialize());
    784 
    785         setActivityIntent(mailtoIntent);
    786 
    787         final ComposeActivity activity = getActivity();
    788         Account fromAccount = activity.getFromAccount();
    789 
    790         runTestOnUiThread(new Runnable() {
    791             @Override
    792             public void run() {
    793                 String[] to = activity.getToAddresses();
    794                 String[] cc = activity.getCcAddresses();
    795                 String[] bcc = activity.getBccAddresses();
    796                 Account fromAccount = activity.getFromAccount();
    797                 assertEquals( 1, to.length);
    798                 assertEquals("test (at) localhost.com",
    799                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    800                 assertEquals(0, cc.length);
    801                 assertEquals(0, bcc.length);
    802                 assertEquals("account2 (at) mockuiprovider.com", fromAccount.getEmailAddress());
    803             }
    804         });
    805     }
    806 
    807     // Test a COMPOSE Intent, with an account specified in parcel format
    808     public void testMailToAccount() throws Throwable {
    809         final Context context = getInstrumentation().getContext();
    810         // Get the test account
    811         final Account currentAccount = getAccountForName(context, "account2 (at) mockuiprovider.com");
    812 
    813         // Create the mailto intent
    814         Intent intent = new Intent(context, ComposeActivity.class);
    815         intent.putExtra(ComposeActivity.EXTRA_FROM_EMAIL_TASK, true);
    816         intent.putExtra(ComposeActivity.EXTRA_ACTION, ComposeActivity.COMPOSE);
    817         intent.putExtra(Utils.EXTRA_ACCOUNT, currentAccount);
    818         intent.putExtra(ComposeActivity.EXTRA_TO, "test (at) localhost.com");
    819 
    820         setActivityIntent(intent);
    821 
    822         final ComposeActivity activity = getActivity();
    823         Account fromAccount = activity.getFromAccount();
    824 
    825         runTestOnUiThread(new Runnable() {
    826             @Override
    827             public void run() {
    828                 String[] to = activity.getToAddresses();
    829                 String[] cc = activity.getCcAddresses();
    830                 String[] bcc = activity.getBccAddresses();
    831                 Account fromAccount = activity.getFromAccount();
    832                 assertEquals( 1, to.length);
    833                 assertEquals("test (at) localhost.com",
    834                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    835                 assertEquals(0, cc.length);
    836                 assertEquals(0, bcc.length);
    837                 assertEquals("account2 (at) mockuiprovider.com", fromAccount.getEmailAddress());
    838             }
    839         });
    840     }
    841 
    842     // Test a mailto VIEW Intent, with no account specified.  The fromAccount should default to the
    843     // last sent account.
    844     public void testMailToAccountWithLastSentAccount() throws Throwable {
    845         final Context context = getInstrumentation().getContext();
    846 
    847         // Set the last sent account to account0
    848         final Account lastSentAccount = getAccountForName(context, "account1 (at) mockuiprovider.com");
    849         MailAppProvider appProvider = MailAppProvider.getInstance();
    850         appProvider.setLastSentFromAccount(lastSentAccount.uri.toString());
    851 
    852         // Create the mailto intent
    853         final Intent mailtoIntent =
    854                 new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:test (at) localhost.com"));
    855 
    856         setActivityIntent(mailtoIntent);
    857 
    858         final ComposeActivity activity = getActivity();
    859         Account fromAccount = activity.getFromAccount();
    860 
    861         runTestOnUiThread(new Runnable() {
    862             @Override
    863             public void run() {
    864                 String[] to = activity.getToAddresses();
    865                 String[] cc = activity.getCcAddresses();
    866                 String[] bcc = activity.getBccAddresses();
    867                 Account fromAccount = activity.getFromAccount();
    868                 assertEquals( 1, to.length);
    869                 assertEquals("test (at) localhost.com",
    870                         Rfc822Tokenizer.tokenize(to[0])[0].getAddress());
    871                 assertEquals(0, cc.length);
    872                 assertEquals(0, bcc.length);
    873                 assertEquals("account1 (at) mockuiprovider.com", fromAccount.getEmailAddress());
    874             }
    875         });
    876     }
    877 
    878     private static String createAttachmentsJson() {
    879         Attachment attachment1 = new Attachment();
    880         attachment1.contentUri = Uri.parse("www.google.com");
    881         attachment1.setContentType("img/jpeg");
    882         attachment1.setName("attachment1");
    883         Attachment attachment2 = new Attachment();
    884         attachment2.contentUri = Uri.parse("www.google.com");
    885         attachment2.setContentType("img/jpeg");
    886         attachment2.setName("attachment2");
    887         JSONArray attachments = new JSONArray();
    888         try {
    889             attachments.put(attachment1.toJSON());
    890             attachments.put(attachment2.toJSON());
    891         } catch (JSONException e) {
    892             assertTrue(false);
    893         }
    894         return attachments.toString();
    895     }
    896 
    897     // First test: switch reply to reply all to fwd, 1 to recipient, 1 cc recipient.
    898     public void testChangeModes0() throws Throwable {
    899         final ComposeActivity activity = getActivity();
    900         setAccount(activity, "account0 (at) mockuiprovider.com");
    901         final Message refMessage = getRefMessage(activity.getContentResolver());
    902         refMessage.setFrom("fromaccount (at) mockuiprovider.com");
    903         refMessage.setTo("account0 (at) mockuiprovider.com");
    904         refMessage.setCc("ccaccount (at) mockuiprovider.com");
    905         runTestOnUiThread(new Runnable() {
    906             @Override
    907             public void run() {
    908                 activity.mRefMessage = refMessage;
    909                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    910                 String[] to = activity.getToAddresses();
    911                 String[] cc = activity.getCcAddresses();
    912                 String[] bcc = activity.getBccAddresses();
    913                 assertEquals(1, to.length);
    914                 assertTrue(to[0].contains(refMessage.getFrom()));
    915                 assertEquals(cc.length, 0);
    916                 assertEquals(bcc.length, 0);
    917                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
    918                 assertEquals(activity.getToAddresses().length, 1);
    919                 assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
    920                 assertEquals(activity.getCcAddresses().length, 1);
    921                 assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc()));
    922                 assertEquals(activity.getBccAddresses().length, 0);
    923                 activity.onNavigationItemSelected(2, ComposeActivity.FORWARD);
    924                 assertEquals(activity.getToAddresses().length, 0);
    925                 assertEquals(activity.getCcAddresses().length, 0);
    926                 assertEquals(activity.getBccAddresses().length, 0);
    927             }
    928         });
    929     }
    930 
    931     // Switch reply to reply all to fwd, 2 to recipients, 1 cc recipient.
    932     public void testChangeModes1() throws Throwable {
    933         final ComposeActivity activity = getActivity();
    934         setAccount(activity, "account0 (at) mockuiprovider.com");
    935         final Message refMessage = getRefMessage(activity.getContentResolver());
    936         refMessage.setFrom("fromaccount (at) mockuiprovider.com");
    937         refMessage.setTo("account0 (at) mockuiprovider.com, toaccount0 (at) mockuiprovider.com");
    938         refMessage.setCc("ccaccount (at) mockuiprovider.com");
    939         runTestOnUiThread(new Runnable() {
    940             @Override
    941             public void run() {
    942                 activity.mRefMessage = refMessage;
    943                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    944                 String[] to = activity.getToAddresses();
    945                 String[] cc = activity.getCcAddresses();
    946                 String[] bcc = activity.getBccAddresses();
    947                 assertEquals(to.length, 1);
    948                 assertTrue(to[0].contains(refMessage.getFrom()));
    949                 assertEquals(cc.length, 0);
    950                 assertEquals(bcc.length, 0);
    951                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
    952                 assertEquals(activity.getToAddresses().length, 1);
    953                 assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
    954                 assertEquals(activity.getCcAddresses().length, 2);
    955                 assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc())
    956                         || activity.getCcAddresses()[1].contains(refMessage.getCc()));
    957                 assertTrue(activity.getCcAddresses()[0].contains("toaccount0 (at) mockuiprovider.com")
    958                         || activity.getCcAddresses()[1]
    959                         .contains("toaccount0 (at) mockuiprovider.com"));
    960                 assertEquals(activity.getBccAddresses().length, 0);
    961                 activity.onNavigationItemSelected(2, ComposeActivity.FORWARD);
    962                 assertEquals(activity.getToAddresses().length, 0);
    963                 assertEquals(activity.getCcAddresses().length, 0);
    964                 assertEquals(activity.getBccAddresses().length, 0);
    965             }
    966         });
    967     }
    968 
    969     // Switch reply to reply all to fwd, 2 to recipients, 2 cc recipients.
    970     public void testChangeModes2() throws Throwable {
    971         final ComposeActivity activity = getActivity();
    972         setAccount(activity, "account0 (at) mockuiprovider.com");
    973         final Message refMessage = getRefMessage(activity.getContentResolver());
    974         refMessage.setFrom("fromaccount (at) mockuiprovider.com");
    975         refMessage.setTo("account0 (at) mockuiprovider.com, toaccount0 (at) mockuiprovider.com");
    976         refMessage.setCc("ccaccount (at) mockuiprovider.com, ccaccount2 (at) mockuiprovider.com");
    977         runTestOnUiThread(new Runnable() {
    978             @Override
    979             public void run() {
    980                 activity.mRefMessage = refMessage;
    981                 activity.initReplyRecipients(refMessage, ComposeActivity.REPLY);
    982                 String[] to = activity.getToAddresses();
    983                 String[] cc = activity.getCcAddresses();
    984                 String[] bcc = activity.getBccAddresses();
    985                 assertEquals(to.length, 1);
    986                 assertTrue(to[0].contains(refMessage.getFrom()));
    987                 assertEquals(cc.length, 0);
    988                 assertEquals(bcc.length, 0);
    989                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
    990                 assertEquals(activity.getToAddresses().length, 1);
    991                 assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
    992                 assertEquals(activity.getCcAddresses().length, 3);
    993                 assertTrue(activity.getCcAddresses()[0].contains("ccaccount (at) mockuiprovider.com")
    994                         || activity.getCcAddresses()[1].contains("ccaccount (at) mockuiprovider.com")
    995                         || activity.getCcAddresses()[2].contains("ccaccount (at) mockuiprovider.com"));
    996                 assertTrue(activity.getCcAddresses()[0].contains("ccaccount2 (at) mockuiprovider.com")
    997                         || activity.getCcAddresses()[1].contains("ccaccount2 (at) mockuiprovider.com")
    998                         || activity.getCcAddresses()[2].contains("ccaccount2 (at) mockuiprovider.com"));
    999                 assertTrue(activity.getCcAddresses()[0].contains("toaccount0 (at) mockuiprovider.com")
   1000                         || activity.getCcAddresses()[1].contains("toaccount0 (at) mockuiprovider.com")
   1001                         || activity.getCcAddresses()[2].contains("toaccount0 (at) mockuiprovider.com"));
   1002                 assertTrue(activity.getCcAddresses()[0].contains("toaccount0 (at) mockuiprovider.com")
   1003                         || activity.getCcAddresses()[1]
   1004                         .contains("toaccount0 (at) mockuiprovider.com")
   1005                         || activity.getCcAddresses()[2]
   1006                         .contains("toaccount0 (at) mockuiprovider.com"));
   1007                 assertEquals(activity.getBccAddresses().length, 0);
   1008                 activity.onNavigationItemSelected(2, ComposeActivity.FORWARD);
   1009                 assertEquals(activity.getToAddresses().length, 0);
   1010                 assertEquals(activity.getCcAddresses().length, 0);
   1011                 assertEquals(activity.getBccAddresses().length, 0);
   1012             }
   1013         });
   1014     }
   1015 
   1016     // Switch reply to reply all to fwd, 2 attachments.
   1017     public void testChangeModes3() throws Throwable {
   1018         final ComposeActivity activity = getActivity();
   1019         setAccount(activity, "account0 (at) mockuiprovider.com");
   1020         final Message refMessage = getRefMessage(activity.getContentResolver());
   1021         refMessage.hasAttachments = true;
   1022         refMessage.attachmentsJson = createAttachmentsJson();
   1023         runTestOnUiThread(new Runnable() {
   1024             @Override
   1025             public void run() {
   1026                 activity.mRefMessage = refMessage;
   1027                 activity.initAttachments(refMessage);
   1028                 assertEquals(activity.getAttachments().size(), 2);
   1029                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY);
   1030                 assertEquals(activity.getAttachments().size(), 0);
   1031                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
   1032                 assertEquals(activity.getAttachments().size(), 0);
   1033                 activity.onNavigationItemSelected(2, ComposeActivity.FORWARD);
   1034                 assertEquals(activity.getAttachments().size(), 2);
   1035             }
   1036         });
   1037     }
   1038 
   1039     // Test existence of % signs and basic functionality (to, cc, bcc, subject)
   1040     public void testInitFromMailTo0() throws Throwable {
   1041         final ComposeActivity activity = getActivity();
   1042         final String input = "mailto:Test1 (at) Test1.com?cc=Test2 (at) Test2.com" +
   1043                 "&bcc=Test3 (at) Test3.com&subject=Hello&body=Bye%25Bye";
   1044 
   1045         runTestOnUiThread(new Runnable() {
   1046             @Override
   1047             public void run() {
   1048                 activity.initFromMailTo(input);
   1049                 assertEquals(1, activity.getToAddresses().length);
   1050                 assertTrue(activity.getToAddresses()[0].contains("Test1 (at) Test1.com"));
   1051                 assertEquals(1, activity.getCcAddresses().length);
   1052                 assertTrue(activity.getCcAddresses()[0].contains("Test2 (at) Test2.com"));
   1053                 assertEquals(1, activity.getBccAddresses().length);
   1054                 assertTrue(activity.getBccAddresses()[0].contains("Test3 (at) Test3.com"));
   1055                 assertEquals("Hello", activity.getSubject());
   1056                 assertEquals("%25 should be decoded into %",
   1057                         "Bye%Bye", activity.getBody().getText().toString());
   1058             }
   1059         });
   1060     }
   1061 
   1062     // Test existence of + and space in addition to %
   1063     public void testInitFromMailTo1() throws Throwable {
   1064         final ComposeActivity activity = getActivity();
   1065         final String query = "Bye+Bye %";
   1066         final Uri uri = Uri.parse("mailto:test (at) test.com?body=" + encodeMailtoParam(query));
   1067 
   1068         runTestOnUiThread(new Runnable() {
   1069             @Override
   1070             public void run() {
   1071                 activity.initFromMailTo(uri.toString());
   1072                 assertEquals(query, activity.getBody().getText().toString());
   1073             }
   1074         });
   1075     }
   1076 
   1077     // Test existence of random set of url encoded characters
   1078     public void testInitFromMailTo2() throws Throwable {
   1079         final ComposeActivity activity = getActivity();
   1080         final String query = "I'm TESTING @#$%^&*\"";
   1081         final Uri uri = Uri.parse("mailto:test (at) test.com?body=" + encodeMailtoParam(query));
   1082 
   1083         runTestOnUiThread(new Runnable() {
   1084             @Override
   1085             public void run() {
   1086                 activity.initFromMailTo(uri.toString());
   1087                 assertEquals(query, activity.getBody().getText().toString());
   1088             }
   1089         });
   1090     }
   1091 }
   1092