package com.fekracomputers.quran.Utilities; /** * Created by nosier on 11/6/2016. */ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; import android.telephony.TelephonyManager; import android.util.Log; import android.widget.Toast; import com.fekracomputers.quran.Audio.service.AudioManager; import com.fekracomputers.quran.Audio.service.AudioService; import java.util.Date; public class IncommingCallReceiver extends BroadcastReceiver { AudioManager audi=new AudioManager(); @Override public void onReceive(Context context, Intent intent) { try { System.out.println("Receiver start"); String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); //receive_incoming_call if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("receive_incoming_call").putExtra("state",1)); } //EXTRA_STATE_OFFHOOK if ((state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))){ LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("EXTRA_STATE_OFFHOOK").putExtra("state",3)); } //rejected_incoming_call if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("rejected_incoming_call").putExtra("state",2)); } } catch (Exception e){ e.printStackTrace(); } } // // // //The receiver will be recreated whenever android feels like it. We need a static variable to remember data between instantiations // // private static int lastState = TelephonyManager.CALL_STATE_IDLE; // private static Date callStartTime; // private static boolean isIncoming; // private static String savedNumber; //because the passed incoming is only valid in ringing // // // @Override // public void onReceive(Context context, Intent intent) { // // //We listen to two intents. The new outgoing call only tells us of an outgoing call. We use it to get the number. // if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { // savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); // } // else{ // String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); // String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); // int state = 0; // if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){ // state = TelephonyManager.CALL_STATE_IDLE; // } // else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ // state = TelephonyManager.CALL_STATE_OFFHOOK; // } // else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){ // state = TelephonyManager.CALL_STATE_RINGING; // } // // // onCallStateChanged(context, state, number); // } // } // // //Derived classes should override these to respond to specific events of interest // protected abstract void onIncomingCallReceived(Context ctx, String number, Date start); // protected abstract void onIncomingCallAnswered(Context ctx, String number, Date start); // protected abstract void onIncomingCallEnded(Context ctx, String number, Date start, Date end); // // protected abstract void onOutgoingCallStarted(Context ctx, String number, Date start); // protected abstract void onOutgoingCallEnded(Context ctx, String number, Date start, Date end); // // protected abstract void onMissedCall(Context ctx, String number, Date start); // // //Deals with actual events // // //Incoming call- goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up // //Outgoing call- goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up // public void onCallStateChanged(Context context, int state, String number) { // if(lastState == state){ // //No change, debounce extras // return; // } // switch (state) { // case TelephonyManager.CALL_STATE_RINGING: // isIncoming = true; // callStartTime = new Date(); // savedNumber = number; // onIncomingCallReceived(context, number, callStartTime); // break; // case TelephonyManager.CALL_STATE_OFFHOOK: // //Transition of ringing->offhook are pickups of incoming calls. Nothing done on them // if(lastState != TelephonyManager.CALL_STATE_RINGING){ // isIncoming = false; // callStartTime = new Date(); // onOutgoingCallStarted(context, savedNumber, callStartTime); // } // else // { // isIncoming = true; // callStartTime = new Date(); // onIncomingCallAnswered(context, savedNumber, callStartTime); // } // // break; // case TelephonyManager.CALL_STATE_IDLE: // //Went to idle- this is the end of a call. What type depends on previous state(s) // if(lastState == TelephonyManager.CALL_STATE_RINGING){ // //Ring but no pickup- a miss // onMissedCall(context, savedNumber, callStartTime); // } // else if(isIncoming){ // onIncomingCallEnded(context, savedNumber, callStartTime, new Date()); // } // else{ // onOutgoingCallEnded(context, savedNumber, callStartTime, new Date()); // } // break; // } // lastState = state; // } }