package edu.fsu.cs.contextprovider.sensor;
import java.util.List;
import edu.fsu.cs.contextprovider.data.ContextConstants;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
public class TelephonyService extends Service implements OnSharedPreferenceChangeListener {
private static final String TAG = "SMS Service";
private static final boolean DEBUG = false;
protected boolean running = false;
public static String PHONE_STATE = "NA";
public static long PHONE_STATE_UPDATE = 0;
public static long PHONE_LAST_CALL = 0;
public static long PHONE_LAST_NUMBER_RECV = 0;
public static long PHONE_LAST_NUMBER_DIAL = 0;
public static String SMS_STATE = "NA";
public static String SMS_LAST_SENDER = "NA";
public static String SMS_LAST_MESSAGE = "NA";
public static long SMS_STATE_UPDATE = 0;
public static long SMS_STATE_SINCE_UPDATE = 0;
private static final int MAX_LENGTH = 30;
private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
SharedPreferences prefs;
TelephonyManager tm;
private PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
PHONE_STATE = "CALL_STATE_IDLE";
PHONE_STATE_UPDATE = Long.valueOf(System.currentTimeMillis());
if (DEBUG) Log.d(TAG, "State: " + PHONE_STATE);
break;
case TelephonyManager.CALL_STATE_RINGING:
PHONE_STATE = "CALL_STATE_RINGING";
PHONE_STATE_UPDATE = Long.valueOf(System.currentTimeMillis());
if (DEBUG) Log.d(TAG, "State: " + PHONE_STATE);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
PHONE_STATE = "CALL_STATE_IDLE";
PHONE_STATE_UPDATE = Long.valueOf(System.currentTimeMillis());
if (DEBUG) Log.d(TAG, "State: " + PHONE_STATE);
break;
}
}
};
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_SMS_RECEIVED.equals(intent.getAction())) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdu = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdu.length];
for (int i = 0; i < pdu.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdu[i]);
}
for (SmsMessage message : messages) {
String msg = message.getMessageBody();
String msgSender = message.getDisplayOriginatingAddress();
if (msg.length() > MAX_LENGTH)
msg = msg.substring(0, MAX_LENGTH);
if (DEBUG)
Log.d(TAG, "send: " + msg);
SMS_STATE = "SMS_STATE_IDLE";
SMS_STATE_UPDATE = Long.valueOf(System.currentTimeMillis());
SMS_LAST_SENDER = msgSender;
SMS_LAST_MESSAGE = msg;
if (DEBUG) Log.d(TAG, "State: " + SMS_STATE);
break;
}
}
}
}
};
public void init() {
if (!running) {
startService();
}
}
private void startService() {
getPrefs();
IntentFilter filter = new IntentFilter(ACTION_SMS_RECEIVED);
registerReceiver(receiver, filter);
// don't forget to set plug-in enabled if everything was initialized
running = true;
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
IntentFilter restartFilter = new IntentFilter();
restartFilter.addAction(ContextConstants.CONTEXT_RESTART_INTENT);
registerReceiver(restartIntentReceiver, restartFilter);
}
private void getPrefs() {
prefs = getSharedPreferences(ContextConstants.CONTEXT_PREFS, MODE_WORLD_READABLE);
// accelPoll = prefs.getInt(ContextConstants.PREFS_ACCEL_POLL_FREQ, 1);
// ignoreThreshold = prefs.getInt(ContextConstants.PREFS_ACCEL_IGNORE_THRESHOLD, 0);
prefs.registerOnSharedPreferenceChangeListener(this);
}
private void stopService() {
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
unregisterReceiver(restartIntentReceiver);
unregisterReceiver(receiver);
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
running = false;
}
BroadcastReceiver restartIntentReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d(TAG, TAG + "Restart Intent: " + intent.getAction());
if (running) {
stopService();
}
startService();
}
};
@Override
public void onDestroy() {
if (running) {
stopService();
}
super.onDestroy();
}
public String getTAG() {
return TAG;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
}
}