forked from jens/Automation
Telephony receiver
This commit is contained in:
parent
0acb52099c
commit
3fc1dd1a26
@ -6,10 +6,15 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.os.Build;
|
||||||
import android.telephony.PhoneStateListener;
|
import android.telephony.PhoneStateListener;
|
||||||
|
import android.telephony.TelephonyCallback;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import com.jens.automation2.ActivityPermissions;
|
import com.jens.automation2.ActivityPermissions;
|
||||||
import com.jens.automation2.AutomationService;
|
import com.jens.automation2.AutomationService;
|
||||||
import com.jens.automation2.Miscellaneous;
|
import com.jens.automation2.Miscellaneous;
|
||||||
@ -22,6 +27,7 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
public class PhoneStatusListener implements AutomationListenerInterface
|
public class PhoneStatusListener implements AutomationListenerInterface
|
||||||
{
|
{
|
||||||
|
static int problematicAndroidLevel = 29;
|
||||||
protected static String lastPhoneNumber="";
|
protected static String lastPhoneNumber="";
|
||||||
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
|
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
|
||||||
protected static int currentState = -1;
|
protected static int currentState = -1;
|
||||||
@ -70,22 +76,13 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
|||||||
return currentState;
|
return currentState;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class IncomingCallsReceiver extends PhoneStateListener
|
public static interface IncomingCallsReceiver
|
||||||
{
|
{
|
||||||
@Override
|
|
||||||
public void onCallStateChanged(int state, String incomingNumber)
|
}
|
||||||
|
|
||||||
|
protected static void workWithIncomingCallData(int state, String incomingNumber)
|
||||||
{
|
{
|
||||||
// Miscellaneous.logEvent("i", "Call state", "New call state: " + String.valueOf(state), 4);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Unfortunately receivers for incoming and outgoing calls behave pretty differently:
|
|
||||||
|
|
||||||
The Outgoing-Receiver is called when starting a call (ringing)
|
|
||||||
It is not called when that outgoing call ends however, only the incoming receiver.
|
|
||||||
|
|
||||||
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
|
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
|
||||||
{
|
{
|
||||||
// This status update is actually for an outgoing call
|
// This status update is actually for an outgoing call
|
||||||
@ -147,6 +144,61 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class IncomingCallsReceiverOld extends PhoneStateListener implements IncomingCallsReceiver
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onCallStateChanged(int state, String incomingNumber)
|
||||||
|
{
|
||||||
|
// Miscellaneous.logEvent("i", "Call state", "New call state: " + String.valueOf(state), 4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Unfortunately receivers for incoming and outgoing calls behave pretty differently:
|
||||||
|
|
||||||
|
The Outgoing-Receiver is called when starting a call (ringing)
|
||||||
|
It is not called when that outgoing call ends however, only the incoming receiver.
|
||||||
|
|
||||||
|
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
|
||||||
|
*/
|
||||||
|
|
||||||
|
workWithIncomingCallData(state, incomingNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.S)
|
||||||
|
public static class IncomingCallsReceiverNew extends BroadcastReceiver implements IncomingCallsReceiver
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
this code detects both incoming and outgoing,
|
||||||
|
if the state changes idle => ringing you know it's an incoming call,
|
||||||
|
if the state changes idle => offhook, you know it's an outgoing call
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
|
||||||
|
{
|
||||||
|
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
|
||||||
|
int state = 99;
|
||||||
|
|
||||||
|
switch(stateStr)
|
||||||
|
{
|
||||||
|
case "RINGING":
|
||||||
|
state = TelephonyManager.CALL_STATE_RINGING;
|
||||||
|
break;
|
||||||
|
case "IDLE":
|
||||||
|
state = TelephonyManager.CALL_STATE_IDLE;
|
||||||
|
break;
|
||||||
|
case "OFFHOOK":
|
||||||
|
state = TelephonyManager.CALL_STATE_OFFHOOK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
|
||||||
|
Log.i("test", "test");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setLastPhoneDirection(int i)
|
static void setLastPhoneDirection(int i)
|
||||||
@ -201,7 +253,12 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(incomingCallsReceiverInstance == null)
|
if(incomingCallsReceiverInstance == null)
|
||||||
incomingCallsReceiverInstance = new IncomingCallsReceiver();
|
{
|
||||||
|
if(Build.VERSION.SDK_INT >= 31)
|
||||||
|
incomingCallsReceiverInstance = new IncomingCallsReceiverNew();
|
||||||
|
else
|
||||||
|
incomingCallsReceiverInstance = new IncomingCallsReceiverOld();
|
||||||
|
}
|
||||||
|
|
||||||
if(outgoingCallsReceiverInstance == null)
|
if(outgoingCallsReceiverInstance == null)
|
||||||
outgoingCallsReceiverInstance = new OutgoingCallsReceiver();
|
outgoingCallsReceiverInstance = new OutgoingCallsReceiver();
|
||||||
@ -211,8 +268,17 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
|||||||
if(!incomingCallsReceiverActive)
|
if(!incomingCallsReceiverActive)
|
||||||
{
|
{
|
||||||
Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4);
|
Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4);
|
||||||
|
if(Build.VERSION.SDK_INT >= problematicAndroidLevel)
|
||||||
|
{
|
||||||
|
IntentFilter callsFilter = new IntentFilter();
|
||||||
|
callsFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
|
||||||
|
automationService.registerReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance, callsFilter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
|
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
|
||||||
|
}
|
||||||
incomingCallsReceiverActive = true;
|
incomingCallsReceiverActive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,8 +302,15 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
|||||||
if(incomingCallsReceiverActive)
|
if(incomingCallsReceiverActive)
|
||||||
{
|
{
|
||||||
Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4);
|
Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4);
|
||||||
|
if(Build.VERSION.SDK_INT >= 31)
|
||||||
|
{
|
||||||
|
automationService.unregisterReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
|
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
|
||||||
|
}
|
||||||
incomingCallsReceiverActive = false;
|
incomingCallsReceiverActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user