Add new public API to allow call screening
This CL adds a new service that the default dialer can implement to screen incoming calls. If the service is implemented then Telecom uses it to decide if a call should be shown to the user or rejected. Note, I initially tried to simply extend InCallService instead of creating a whole new service. The problem with this approach is that: - this breaks some in call services which show UI as soon as they are bound to - the in call service lifecycle is tightly coupled to adding and removing calls. Call screening happens before a call is added which makes it a bad fit to in call service - call screening is a function of only the default dialer's in call service but the existing code also binds to "controller" call services For these reasons it seemed simpler to just create a new optional service. BUG: 22857261 Change-Id: I53f2ef93360e0af19b6ce45af21026be6cf3a7f3
This commit is contained in:
@ -265,6 +265,7 @@ public final class Call {
|
||||
// Next PROPERTY value: 0x00000040
|
||||
//******************************************************************************************
|
||||
|
||||
private final String mTelecomCallId;
|
||||
private final Uri mHandle;
|
||||
private final int mHandlePresentation;
|
||||
private final String mCallerDisplayName;
|
||||
@ -414,6 +415,11 @@ public final class Call {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/** {@hide} */
|
||||
public String getTelecomCallId() {
|
||||
return mTelecomCallId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The handle (e.g., phone number) to which the {@code Call} is currently
|
||||
* connected.
|
||||
@ -567,6 +573,7 @@ public final class Call {
|
||||
|
||||
/** {@hide} */
|
||||
public Details(
|
||||
String telecomCallId,
|
||||
Uri handle,
|
||||
int handlePresentation,
|
||||
String callerDisplayName,
|
||||
@ -581,6 +588,7 @@ public final class Call {
|
||||
StatusHints statusHints,
|
||||
Bundle extras,
|
||||
Bundle intentExtras) {
|
||||
mTelecomCallId = telecomCallId;
|
||||
mHandle = handle;
|
||||
mHandlePresentation = handlePresentation;
|
||||
mCallerDisplayName = callerDisplayName;
|
||||
@ -596,6 +604,26 @@ public final class Call {
|
||||
mExtras = extras;
|
||||
mIntentExtras = intentExtras;
|
||||
}
|
||||
|
||||
/** {@hide} */
|
||||
public static Details createFromParcelableCall(ParcelableCall parcelableCall) {
|
||||
return new Details(
|
||||
parcelableCall.getId(),
|
||||
parcelableCall.getHandle(),
|
||||
parcelableCall.getHandlePresentation(),
|
||||
parcelableCall.getCallerDisplayName(),
|
||||
parcelableCall.getCallerDisplayNamePresentation(),
|
||||
parcelableCall.getAccountHandle(),
|
||||
parcelableCall.getCapabilities(),
|
||||
parcelableCall.getProperties(),
|
||||
parcelableCall.getDisconnectCause(),
|
||||
parcelableCall.getConnectTimeMillis(),
|
||||
parcelableCall.getGatewayInfo(),
|
||||
parcelableCall.getVideoState(),
|
||||
parcelableCall.getStatusHints(),
|
||||
parcelableCall.getExtras(),
|
||||
parcelableCall.getIntentExtras());
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract class Callback {
|
||||
@ -1022,21 +1050,7 @@ public final class Call {
|
||||
/** {@hide} */
|
||||
final void internalUpdate(ParcelableCall parcelableCall, Map<String, Call> callIdMap) {
|
||||
// First, we update the internal state as far as possible before firing any updates.
|
||||
Details details = new Details(
|
||||
parcelableCall.getHandle(),
|
||||
parcelableCall.getHandlePresentation(),
|
||||
parcelableCall.getCallerDisplayName(),
|
||||
parcelableCall.getCallerDisplayNamePresentation(),
|
||||
parcelableCall.getAccountHandle(),
|
||||
parcelableCall.getCapabilities(),
|
||||
parcelableCall.getProperties(),
|
||||
parcelableCall.getDisconnectCause(),
|
||||
parcelableCall.getConnectTimeMillis(),
|
||||
parcelableCall.getGatewayInfo(),
|
||||
parcelableCall.getVideoState(),
|
||||
parcelableCall.getStatusHints(),
|
||||
parcelableCall.getExtras(),
|
||||
parcelableCall.getIntentExtras());
|
||||
Details details = Details.createFromParcelableCall(parcelableCall);
|
||||
boolean detailsChanged = !Objects.equals(mDetails, details);
|
||||
if (detailsChanged) {
|
||||
mDetails = details;
|
||||
|
Reference in New Issue
Block a user