117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang/* 217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * Copyright (C) 2012 The Android Open Source Project 317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * 417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * you may not use this file except in compliance with the License. 617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * You may obtain a copy of the License at 717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * 817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * 1017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * Unless required by applicable law or agreed to in writing, software 1117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 1217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * See the License for the specific language governing permissions and 1417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * limitations under the License. 1517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang */ 1617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 1717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangpackage com.android.smsautoreply; 1817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 1917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.app.Activity; 2017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.content.BroadcastReceiver; 2117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.content.Context; 2217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.content.Intent; 2317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.content.IntentFilter; 2417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.net.ConnectivityManager; 2517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.os.Bundle; 2617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.os.Environment; 2717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.telephony.SmsManager; 2817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.telephony.SmsMessage; 2917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport android.util.Log; 3017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 3117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport java.io.File; 3217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport java.io.FileOutputStream; 3317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport java.io.IOException; 3417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport java.text.SimpleDateFormat; 3517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangimport java.util.Date; 3617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 3717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang/** 3817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * A sms reply activity which auto-replies the received sms message to the sender 3917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * This is used as the receiver for 1:M sms stress test. 4017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang * Keep the app in the foreground when running the test. 4117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang */ 4217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wangpublic class AutoReplyActivity extends Activity { 4317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private static final String TAG = "AutoReplyActivity"; 4417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private static final String LOG_FILE = "received_sms_log.txt"; 4517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private SmsMessageReceiver mSmsMsgReceiver = null; 4617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 4717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang @Override 4817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang public void onCreate(Bundle savedInstanceState) { 4917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang super.onCreate(savedInstanceState); 5017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang setContentView(R.layout.main); 5117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang mSmsMsgReceiver = new SmsMessageReceiver(); 5217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang registerReceiver(mSmsMsgReceiver, 5317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 5417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 5517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 5617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private class SmsMessageReceiver extends BroadcastReceiver { 5717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang @Override 5817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang public void onReceive(Context context, Intent intent) { 5917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang Bundle extras = intent.getExtras(); 6017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang if (extras == null) 6117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang return; 6217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 6317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang Object[] pdus = (Object[]) extras.get("pdus"); 6417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 6517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang for (int i = 0; i < pdus.length; i++) { 6617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); 6717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang Log.d(TAG, String.format("SMS received from %s, body: %s", 6817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang message.getOriginatingAddress(), message.getMessageBody())); 6917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang logMessage(message); 7017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang replyMessage(context, message); 7117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 7217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 7317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 7417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang // Log received sms message into an output file 7517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private void logMessage(SmsMessage msg) { 7617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang File logFile = new File(Environment.getExternalStorageDirectory(), LOG_FILE); 7717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 7817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang String logMsg = String.format("SMS: from: %s body: %s", 7917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang msg.getOriginatingAddress(),msg.getMessageBody()); 8017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang try { 8117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang String currentDateTimeString = 8217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang new SimpleDateFormat("MM-dd HH:mm:ss.SSS").format(new Date()); 8317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang logMsg = String.format("%s: %s\n", currentDateTimeString, logMsg); 8417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang FileOutputStream fos = new FileOutputStream(logFile, true); 8517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang fos.write(logMsg.getBytes()); 8617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang fos.flush(); 8717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang fos.close(); 8817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } catch (IOException ioe) { 8917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang Log.e(TAG, "failed to log SMS", ioe); 9017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang Log.d(TAG, logMsg); 9117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 9217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 9317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 9417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang private void replyMessage(Context context, SmsMessage msg) { 9517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang SmsManager sms = SmsManager.getDefault(); 9617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang String message = msg.getMessageBody(); 9717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang sms.sendTextMessage(msg.getOriginatingAddress(), null, message, null, null); 9817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 9917834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 10017834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang 10117834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang @Override 10217834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang protected void onPause() { 10317834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang super.onPause(); 10417834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang if (mSmsMsgReceiver != null) { 10517834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang unregisterReceiver(mSmsMsgReceiver); 10617834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 10717834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang } 10817834025dee14d7d0ecd00cad1c53c9c3d080fa3Xia Wang} 109