1 /* 2 * Copyright (C) 2009 The Android Open Source Project 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 18 package com.android.mms; 19 20 import com.android.mms.LogTag; 21 import com.android.mms.R; 22 import com.android.mms.data.WorkingMessage; 23 import com.android.mms.ui.ComposeMessageActivity; 24 25 import android.app.Activity; 26 import android.app.Instrumentation; 27 import android.content.BroadcastReceiver; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 32 import android.test.suitebuilder.annotation.LargeTest; 33 import android.test.ActivityInstrumentationTestCase2; 34 35 import android.util.Log; 36 import android.view.KeyEvent; 37 import android.widget.Button; 38 import android.widget.EditText; 39 import android.widget.TextView; 40 41 /** 42 * 43 * Junit / Instrumentation test case for testing intercepting the send sms intent just 44 * like a 3rd party might want to do. 45 * 46 */ 47 48 public class InterceptSendSms extends ActivityInstrumentationTestCase2 <ComposeMessageActivity> { 49 private static String TAG = "InterceptSendSms"; 50 private static int WAIT_TIME = 4000; //Set the short wait time for 4 sec. 51 private static String RECIPIENTS = "4258365497,4258365496"; 52 private static String MESSAGE = "This is a test message of intercepting a SMS"; 53 54 private InterceptSmsReceiver mInterceptReceiver; 55 private TextView mRecipientsView; 56 private EditText mTextEditor; 57 private boolean mInterceptedSend; 58 InterceptSendSms()59 public InterceptSendSms() { 60 super("com.android.mms", ComposeMessageActivity.class); 61 } 62 63 @Override setUp()64 protected void setUp() throws Exception { 65 Activity activity = getActivity(); 66 super.setUp(); 67 mRecipientsView = (TextView)activity.findViewById(R.id.recipients_editor); 68 mTextEditor = (EditText)activity.findViewById(R.id.embedded_text_editor); 69 70 // Setup our receiver to listen for SMS's about to be sent. 71 mInterceptReceiver = new InterceptSmsReceiver(); 72 IntentFilter filter = new IntentFilter(WorkingMessage.ACTION_SENDING_SMS); 73 activity.registerReceiver(mInterceptReceiver, filter); 74 } 75 76 @Override tearDown()77 protected void tearDown() throws Exception { 78 getActivity().unregisterReceiver(mInterceptReceiver); 79 80 super.tearDown(); 81 } 82 83 // Create the object with the run() method 84 Runnable runnable = new sendMms(); 85 86 class sendMms implements Runnable { 87 // This method is called when the thread runs run()88 public void run() { 89 Instrumentation inst = getInstrumentation(); 90 91 mRecipientsView.setText(RECIPIENTS); 92 mTextEditor.setText(MESSAGE); 93 94 Button mSendButton = (Button) getActivity().getWindow().findViewById(R.id.send_button); 95 mSendButton.performClick(); 96 97 Log.v(TAG, "sendMms hitting send now"); 98 boolean messageSend = mSendButton.performClick(); 99 if (!messageSend) { 100 assertTrue("Fails to send mms", false); 101 Log.v(TAG, "messageSend is true"); 102 } 103 } 104 } 105 106 // Send sms and see if we get a chance to handle the send in our receiver. 107 @LargeTest testInterceptSendSms()108 public void testInterceptSendSms(){ 109 try{ 110 Instrumentation inst = getInstrumentation(); 111 112 // Send the sms message 113 inst.runOnMainSync(runnable); 114 Thread.sleep(WAIT_TIME); 115 assertTrue("Intercepted send SMS", mInterceptedSend); 116 } catch (Exception e){ 117 assertTrue("Failed to send sms", false); 118 Log.v(TAG, e.toString()); 119 } 120 } 121 122 /** 123 * InterceptSmsReceiver catches the NEW_SENDING_SMS broadcast from the messaging 124 * app when the app is about to send a SMS message. We pretend to be an app that 125 * takes over and does the sending ourself. We set the result code RESULT_OK so 126 * the message app doesn't actually send the message. 127 */ 128 public class InterceptSmsReceiver extends BroadcastReceiver { onReceive(Context context, Intent intent)129 public void onReceive(Context context, Intent intent) { 130 Log.v(TAG, "doReceive: " + intent); 131 mInterceptedSend = true; 132 133 final String msgText = intent.getStringExtra(WorkingMessage.EXTRA_SMS_MESSAGE); 134 final String semiSepRecipients = 135 intent.getStringExtra(WorkingMessage.EXTRA_SMS_RECIPIENTS); 136 final long threadId = intent.getLongExtra(WorkingMessage.EXTRA_SMS_THREAD_ID, 0); 137 138 assertEquals(msgText, MESSAGE); 139 assertEquals(semiSepRecipients, RECIPIENTS.replace(',', ';')); 140 assertTrue(threadId > 0); 141 142 // Mark that we're handling the sending of the sms. 143 setResultCode(android.app.Activity.RESULT_OK); 144 } 145 } 146 147 } 148