From 1bef339b88b3f760603dcc08d79a62647fc18296 Mon Sep 17 00:00:00 2001 From: Sailesh Nepal Date: Sun, 24 Jan 2016 18:21:53 -0800 Subject: [PATCH] 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 --- Android.mk | 2 + api/current.txt | 25 ++ api/system-current.txt | 25 ++ api/test-current.txt | 25 ++ core/res/AndroidManifest.xml | 7 + telecomm/java/android/telecom/Call.java | 44 ++-- .../android/telecom/CallScreeningService.java | 239 ++++++++++++++++++ .../telecom/ICallScreeningAdapter.aidl | 34 +++ .../telecom/ICallScreeningService.aidl | 30 +++ 9 files changed, 416 insertions(+), 15 deletions(-) create mode 100644 telecomm/java/android/telecom/CallScreeningService.java create mode 100644 telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl create mode 100644 telecomm/java/com/android/internal/telecom/ICallScreeningService.aidl diff --git a/Android.mk b/Android.mk index 1d797c49b3e7d..56234e69a646e 100644 --- a/Android.mk +++ b/Android.mk @@ -384,6 +384,8 @@ LOCAL_SRC_FILES += \ media/java/android/media/tv/ITvInputSessionCallback.aidl \ media/java/android/service/media/IMediaBrowserService.aidl \ media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl \ + telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl \ + telecomm/java/com/android/internal/telecom/ICallScreeningService.aidl \ telecomm/java/com/android/internal/telecom/IVideoCallback.aidl \ telecomm/java/com/android/internal/telecom/IVideoProvider.aidl \ telecomm/java/com/android/internal/telecom/IConnectionService.aidl \ diff --git a/api/current.txt b/api/current.txt index 2a4228face8c5..be804b1643335 100644 --- a/api/current.txt +++ b/api/current.txt @@ -33,6 +33,7 @@ package android { field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; + field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE"; field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; @@ -35289,6 +35290,30 @@ package android.telecom { field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 } + public abstract class CallScreeningService extends android.app.Service { + ctor public CallScreeningService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onScreenCall(android.telecom.Call.Details); + method public final void respondToCall(android.telecom.Call.Details, android.telecom.CallScreeningService.CallResponse); + field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.CallScreeningService"; + } + + public class CallScreeningService.CallResponse { + method public boolean getDisallowCall(); + method public boolean getRejectCall(); + method public boolean getSkipCallLog(); + method public boolean getSkipNotification(); + } + + public class CallScreeningService.CallResponse.Builder { + ctor public CallScreeningService.CallResponse.Builder(); + method public android.telecom.CallScreeningService.CallResponse build(); + method public android.telecom.CallScreeningService.CallResponse.Builder setDisallowCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setRejectCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipCallLog(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipNotification(boolean); + } + public abstract class Conference extends android.telecom.Conferenceable { ctor public Conference(android.telecom.PhoneAccountHandle); method public final boolean addConnection(android.telecom.Connection); diff --git a/api/system-current.txt b/api/system-current.txt index 18e54d7294f51..3c833771e6482 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -46,6 +46,7 @@ package android { field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; + field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE"; field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; @@ -37586,6 +37587,30 @@ package android.telecom { field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 } + public abstract class CallScreeningService extends android.app.Service { + ctor public CallScreeningService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onScreenCall(android.telecom.Call.Details); + method public final void respondToCall(android.telecom.Call.Details, android.telecom.CallScreeningService.CallResponse); + field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.CallScreeningService"; + } + + public class CallScreeningService.CallResponse { + method public boolean getDisallowCall(); + method public boolean getRejectCall(); + method public boolean getSkipCallLog(); + method public boolean getSkipNotification(); + } + + public class CallScreeningService.CallResponse.Builder { + ctor public CallScreeningService.CallResponse.Builder(); + method public android.telecom.CallScreeningService.CallResponse build(); + method public android.telecom.CallScreeningService.CallResponse.Builder setDisallowCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setRejectCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipCallLog(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipNotification(boolean); + } + public abstract class Conference extends android.telecom.Conferenceable { ctor public Conference(android.telecom.PhoneAccountHandle); method public final boolean addConnection(android.telecom.Connection); diff --git a/api/test-current.txt b/api/test-current.txt index 888ac03c4663f..d93eb69cf20ca 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -33,6 +33,7 @@ package android { field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_QUICK_SETTINGS_TILE = "android.permission.BIND_QUICK_SETTINGS_TILE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; + field public static final java.lang.String BIND_SCREENING_SERVICE = "android.permission.BIND_SCREENING_SERVICE"; field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; @@ -35303,6 +35304,30 @@ package android.telecom { field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 } + public abstract class CallScreeningService extends android.app.Service { + ctor public CallScreeningService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onScreenCall(android.telecom.Call.Details); + method public final void respondToCall(android.telecom.Call.Details, android.telecom.CallScreeningService.CallResponse); + field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.CallScreeningService"; + } + + public class CallScreeningService.CallResponse { + method public boolean getDisallowCall(); + method public boolean getRejectCall(); + method public boolean getSkipCallLog(); + method public boolean getSkipNotification(); + } + + public class CallScreeningService.CallResponse.Builder { + ctor public CallScreeningService.CallResponse.Builder(); + method public android.telecom.CallScreeningService.CallResponse build(); + method public android.telecom.CallScreeningService.CallResponse.Builder setDisallowCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setRejectCall(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipCallLog(boolean); + method public android.telecom.CallScreeningService.CallResponse.Builder setSkipNotification(boolean); + } + public abstract class Conference extends android.telecom.Conferenceable { ctor public Conference(android.telecom.PhoneAccountHandle); method public final boolean addConnection(android.telecom.Connection); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f5e704d78bad1..313d6d0437155 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1406,6 +1406,13 @@ + + +