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:
Sailesh Nepal
2016-01-24 18:21:53 -08:00
parent 9c2618b17f
commit 1bef339b88
9 changed files with 416 additions and 15 deletions

View File

@ -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;