148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor/*
248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * Copyright (C) 2008 The Android Open Source Project
348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor *
448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * Licensed under the Apache License, Version 2.0 (the "License");
548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * you may not use this file except in compliance with the License.
648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * You may obtain a copy of the License at
748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor *
848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor *      http://www.apache.org/licenses/LICENSE-2.0
948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor *
1048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * Unless required by applicable law or agreed to in writing, software
1148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * distributed under the License is distributed on an "AS IS" BASIS,
1248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * See the License for the specific language governing permissions and
1448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor * limitations under the License.
1548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor */
1648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
1732a1dcecca6ed0881431555a4218d0282814326cWink Savillepackage com.android.mms.ui;
1832a1dcecca6ed0881431555a4218d0282814326cWink Saville
1948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport com.android.mms.R;
204a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wangimport com.android.mms.ui.ComposeMessageActivity;
214a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wangimport com.android.mms.ui.RecipientsEditor;
22e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylorimport com.android.mms.data.ContactList;
23e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylorimport com.android.mms.data.Conversation;
24e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylorimport com.android.mms.data.WorkingMessage;
2548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport com.android.mms.ui.MessageListAdapter.ColumnsMap;
2648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
2748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.content.Context;
2848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.database.Cursor;
2948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.test.ActivityInstrumentationTestCase2;
3048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.test.suitebuilder.annotation.MediumTest;
3132a1dcecca6ed0881431555a4218d0282814326cWink Savilleimport android.test.suitebuilder.annotation.SmallTest;
3232a1dcecca6ed0881431555a4218d0282814326cWink Savilleimport android.test.suitebuilder.annotation.LargeTest;
33e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylorimport android.util.Log;
3448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.view.View;
354a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wangimport android.view.ViewStub;
3648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.widget.EditText;
3748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylorimport android.widget.TextView;
3832a1dcecca6ed0881431555a4218d0282814326cWink Savilleimport android.widget.Button;
394a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wangimport android.widget.ImageButton;
4048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
4148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor/**
4232a1dcecca6ed0881431555a4218d0282814326cWink Saville * Various instrumentation tests for ComposeMessageActivity.
4348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor */
4432a1dcecca6ed0881431555a4218d0282814326cWink Savillepublic class ComposeMessageActivityTests
454a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang    extends ActivityInstrumentationTestCase2<ComposeMessageActivity> {
4648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
474a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang    private static final String TAG = "ComposeMessageActivityTests";
4848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private Context mContext;
494a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang    private RecipientsEditor mRecipientsEditor;
5048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private EditText mTextEditor;
5148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private MessageListView mMsgListView;
5248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private MessageListAdapter mMsgListAdapter;
5348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private ColumnsMap mColumnsMap;
544a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang    private ComposeMessageActivity mActivity;
5548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
5648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public ComposeMessageActivityTests() {
574a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        super(ComposeMessageActivity.class);
5848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    }
5948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
6048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    @Override
6148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    protected void setUp() throws Exception {
6248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        super.setUp();
6348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        mContext = getInstrumentation().getTargetContext();
6448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
654a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        mActivity = getActivity();
664a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang
674a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        ViewStub stub = (ViewStub)mActivity.findViewById(R.id.recipients_editor_stub);
684a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        if (stub != null) {
694a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang            View stubView = stub.inflate();
704a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang            mRecipientsEditor = (RecipientsEditor) stubView.findViewById(R.id.recipients_editor);
714a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        } else {
724a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang            mRecipientsEditor = (RecipientsEditor)mActivity.findViewById(R.id.recipients_editor);
734a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang            mRecipientsEditor.setVisibility(View.VISIBLE);
744a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        }
754a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        mTextEditor = (EditText)mActivity.findViewById(R.id.embedded_text_editor);
764a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        mMsgListView = (MessageListView)mActivity.findViewById(R.id.history);
7748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        mMsgListAdapter = (MessageListAdapter)mMsgListView.getAdapter();
7848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    }
7948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
8048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    class BoxChecker {
8148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private int[] mExpectedBoxStates;
8248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private boolean mDone;
8348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private String mError;
8467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
8548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public BoxChecker(int[] expectedBoxStates) {
8648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mExpectedBoxStates = expectedBoxStates;
8748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mDone = false;
8848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mError = null;
8967b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            mMsgListAdapter.setOnDataSetChangedListener(mDataSetChangedListener);
9048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
9167b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
9248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private final MessageListAdapter.OnDataSetChangedListener
9348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        mDataSetChangedListener = new MessageListAdapter.OnDataSetChangedListener() {
9448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            public void onDataSetChanged(MessageListAdapter adapter) {
9548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                int count = adapter.getCount();
9648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                if (count > 0) {
9748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    MessageItem item = getMessageItem(count - 1);   // get most recent
9867b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
9948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    int boxId = item.getBoxId();
10067b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
10148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    // is boxId a valid box?
10248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    boolean found = false;
10348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    boolean isLast = false;
10448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    for (int i = 0; i < mExpectedBoxStates.length; i++) {
10548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                        if (mExpectedBoxStates[i] == boxId) {
10648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                            found = true;
10767b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor                            isLast = i == mExpectedBoxStates.length - 1;
10848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                            break;
10948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                        }
11048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    }
11148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    if (!found) {
11248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                        setError("Unexpected box state");
11348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                        return;
11448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    }
11548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    if (isLast) {
11648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                        mDone = true;
11748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                    }
11848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor               }
11948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            }
12067b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
12167b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            public void onContentChanged(MessageListAdapter adapter) {
12267b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            }
12348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        };
12467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
12548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private void setError(String error) {
12648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mError = error;
12748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mDone = true;
12848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
12967b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
13048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public String getError() {
13148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            return mError;
13248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
13367b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
13448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public boolean isDone() {
13548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            return mDone;
13648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
13767b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
13848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        private MessageItem getMessageItem(int index) {
13948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            Cursor cursor = (Cursor)mMsgListAdapter.getItem(index);
14048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
14148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            mColumnsMap = new MessageListAdapter.ColumnsMap(cursor);
14248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            String type = cursor.getString(mColumnsMap.mColumnMsgType);
14348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            long msgId = cursor.getLong(mColumnsMap.mColumnMsgId);
14467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
14548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            MessageItem msgItem = mMsgListAdapter.getCachedMessageItem(type, msgId, cursor);
14667b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
14748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            return msgItem;
14848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
14948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor}
15067b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
15148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    /**
15248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor     * Tests that a simple SMS message is successfully sent.
15348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor     */
15448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    @LargeTest
15548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public void testSendMessage() throws Throwable {
15648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        runTestOnUiThread(new Runnable() {
15748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            public void run() {
1584a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang                checkFocused(mRecipientsEditor);
1594a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang                mRecipientsEditor.setText("2012130903");
16048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                mTextEditor.setText("This is a test message");
1614a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang                ImageButton send = (ImageButton)mActivity.findViewById(R.id.send_button_sms);
16248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                send.performClick();
16348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            }
16448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        });
16567b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
16648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        // Now poll while watching the adapter to see if the message got sent
16748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        BoxChecker boxChecker = new BoxChecker(new int[] {4, 2});    // outbox, sent
16848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        long now = System.currentTimeMillis();
16948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        boolean success = true;
17048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        while (!boxChecker.isDone()) {
17167b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            Thread.sleep(1000);
17248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            if (System.currentTimeMillis() - now > 10000) {
17348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                // Give up after ten seconds
17448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                success = false;
17548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor                break;
17648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor            }
17748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        }
17848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        assertTrue(success && boxChecker.getError() == null);
17948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    }
18067b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
18148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    /**
18248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor     * Helper method to verify which field has the focus
18348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor     * @param focused The view that should be focused (all others should not have focus)
18448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor     */
18532a1dcecca6ed0881431555a4218d0282814326cWink Saville    @SmallTest
18648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    private void checkFocused(View focused) {
1874a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang        assertEquals(focused == mRecipientsEditor, mRecipientsEditor.isFocused());
18848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        assertEquals(focused == mTextEditor, mTextEditor.isFocused());
18948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    }
19048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
191e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    // Here's how to execute just this one test:
192e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    //   runtest -m testCreateManyThreads mms -c com.android.mms.ui.ComposeMessageActivityTests
193e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    // This test intentionally uses the UI functions to create the threads rather than adding
194e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    // the threads directly to the mms provider's threads table.
195e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    @LargeTest
196e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    public void testCreateManyThreads() {
197b51ea8318ca2e4019b666d938e3e7efdf6e643b3Tom Taylor        for (int i = 0; i < 10; i++) {
198e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor            String phoneNum = String.format("424-123-%04d", i);
199e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor            ContactList contactList = ContactList.getByNumbers(phoneNum, false, false);
2004a082ceeba3674fe9f08cd344689443ed70dcf31Xia Wang            Conversation conv = Conversation.get(mActivity, contactList, false);
201e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor
20208712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor            WorkingMessage workingMsg = WorkingMessage.loadDraft(mActivity, conv, null);
203e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor            workingMsg.setConversation(conv);
204e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor            workingMsg.setText("This is test #" + i + " thread id: " + conv.getThreadId());
205e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor
206e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor//            Log.i(TAG, "[testCreateManyThreads] workingMsg: ");
207e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor//            workingMsg.dump();
208e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor
209ef3eb49cde359d36f9536dbaffe5c16f3639c1f2Tom Taylor            workingMsg.saveDraft(false);
210e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor        }
211e2986af492c30ad92c96bcb7adf8092d4d948565Tom Taylor    }
21248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor}
213