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