package net.screenfreeze.deskcon;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
public class EventBroadcastReceiver extends BroadcastReceiver{
private static boolean ring=false;
private static boolean callReceived=false;
private static String callerId;
private static SharedPreferences sharedPrefs;
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Event: ", "received");
Bundle extras = intent.getExtras();
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
// permissions
boolean send_messages = sharedPrefs.getBoolean("send_messages", false);
boolean send_calls = sharedPrefs.getBoolean("send_calls", false);
// Event Power status
if (extras == null) {
startStatusUpdateService(context);
}
//Event is phonecall
else if (extras.getString(TelephonyManager.EXTRA_STATE) != null) {
if (send_calls) handleCall(context, extras);
}
// Event is SMS received
else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
if (send_messages) handleSMS(context, extras);
}
// just update status
else {
startStatusUpdateService(context);
}
}
private void handleCall(Context context, Bundle data) {
Log.d("Event: ", "handle call");
String callstate = data.getString(TelephonyManager.EXTRA_STATE);
// is ringing
if (callstate.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
String number = data.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
ring = true;
callerId = number;
// get Contact Name if present
if (getContactName(context, number) != null) {
callerId = getContactName(context, number);
}
startServiceCommand(context, "CALL", callerId);
}
// end ringing
if (callstate.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
callReceived=true;
}
// is idle again
if (callstate.equals(TelephonyManager.EXTRA_STATE_IDLE)){
// If phone was ringing(ring=true) and not received,then it is a missed call
if(ring==true&&callReceived==false){
startServiceCommand(context, "MIS_CALL", callerId);
}
//reset values
callReceived = false;
ring = false;
}
}
private void handleSMS(Context context, Bundle data) {
Log.d("Event: ", "handle sms");
Object[] pdus = (Object[]) data.get("pdus");
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdus[0]);
String number = sms.getOriginatingAddress();
String contactname = "";
JSONObject jobject = new JSONObject();
// get Contact Name if present
if (getContactName(context, number) != null) {
contactname = getContactName(context, number);
}
//create json object to send
try {
jobject.put("name", contactname);
jobject.put("number", number);
jobject.put("message", sms.getMessageBody());
} catch (JSONException e) {
e.printStackTrace();
}
startServiceCommand(context, "SMS", jobject.toString());
}
//send specific Command
private void startServiceCommand(Context context, String cmd, String mess) {
Intent i = new Intent(context, StatusUpdateService.class);
i.putExtra("commandtype", cmd);
i.putExtra("message", mess);
context.startService(i);
}
//start without infos, the Service will retrive current stats
private void startStatusUpdateService(Context context) {
Intent i = new Intent(context, StatusUpdateService.class);
i.putExtra("dummy", true); // jast to have Extras on Intent for now
context.startService(i);
}
public static String getContactName(Context context, String phoneNumber) {
ContentResolver cr = context.getContentResolver();
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor == null) {
return null;
}
String contactName = null;
if(cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
}
if(cursor != null && !cursor.isClosed()) {
cursor.close();
}
return contactName;
}
}