[Call Screening]Programmatically changing the default call screening app.
Increase three methods in TelecomManager.java, modify
ITelecomService.aidl to make sure framworks can comunicate with service.
Bug: 113302920
Test: atest TelecomServiceImplTest.
Test: simulate third party call screening application to use methods in
TelecomManager.java, and triggle the activity to show the dialog of
setting default call screeening application.
Change-Id: I1e34061acd575813e92403c137731e618abb88d5
diff --git a/api/current.txt b/api/current.txt
index d6bd9b5..69ea2ac 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -41748,6 +41748,7 @@
method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
method public boolean handleMmi(java.lang.String);
method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle);
+ method public boolean isDefaultCallScreeningApp(android.content.ComponentName);
method public boolean isInCall();
method public boolean isInManagedCall();
method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle);
@@ -41756,12 +41757,14 @@
method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String);
method public void placeCall(android.net.Uri, android.os.Bundle);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
+ method public void requestChangeDefaultCallScreeningApp(android.content.ComponentName);
method public void showInCallScreen(boolean);
method public void silenceRinger();
method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
field public static final java.lang.String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
field public static final java.lang.String ACTION_CONFIGURE_PHONE_ACCOUNT = "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
+ field public static final java.lang.String ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED = "android.telecom.action.DEFAULT_CALL_SCREENING_APP_CHANGED";
field public static final java.lang.String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED";
field public static final deprecated java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
@@ -41778,9 +41781,11 @@
field public static final java.lang.String EXTRA_CALL_NETWORK_TYPE = "android.telecom.extra.CALL_NETWORK_TYPE";
field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
field public static final java.lang.String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME = "android.telecom.extra.DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME";
field public static final java.lang.String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS";
field public static final java.lang.String EXTRA_INCOMING_CALL_EXTRAS = "android.telecom.extra.INCOMING_CALL_EXTRAS";
field public static final java.lang.String EXTRA_INCOMING_VIDEO_STATE = "android.telecom.extra.INCOMING_VIDEO_STATE";
+ field public static final java.lang.String EXTRA_IS_DEFAULT_CALL_SCREENING_APP = "android.telecom.extra.IS_DEFAULT_CALL_SCREENING_APP";
field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telecom.extra.NOTIFICATION_COUNT";
field public static final java.lang.String EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
field public static final java.lang.String EXTRA_OUTGOING_CALL_EXTRAS = "android.telecom.extra.OUTGOING_CALL_EXTRAS";
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 3127b35..fa16bfe 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -15,6 +15,7 @@
package android.telecom;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SuppressAutoDoc;
import android.annotation.SuppressLint;
@@ -175,6 +176,33 @@
"android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME";
/**
+ * Broadcast intent action indicating that the current default call screening app has changed.
+ *
+ * The string extra {@link #EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME} will contain the
+ * name of the Component of the previous or the new call screening app.
+ *
+ * The boolean extra {@link #EXTRA_IS_DEFAULT_CALL_SCREENING_APP} will indicate the component
+ * name in the String extra {@link #EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME} is default
+ * call screening app or not.
+ */
+ public static final String ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED =
+ "android.telecom.action.DEFAULT_CALL_SCREENING_APP_CHANGED";
+
+ /**
+ * Extra value used with {@link #ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED} broadcast to
+ * indicate the ComponentName of the call screening app which has changed.
+ */
+ public static final String EXTRA_DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME =
+ "android.telecom.extra.DEFAULT_CALL_SCREENING_APP_COMPONENT_NAME";
+
+ /**
+ * Extra value used with {@link #ACTION_DEFAULT_CALL_SCREENING_APP_CHANGED} broadcast to
+ * indicate whether an app is the default call screening app.
+ */
+ public static final String EXTRA_IS_DEFAULT_CALL_SCREENING_APP =
+ "android.telecom.extra.IS_DEFAULT_CALL_SCREENING_APP";
+
+ /**
* Optional extra for {@link android.content.Intent#ACTION_CALL} containing a boolean that
* determines whether the speakerphone should be automatically turned on for an outgoing call.
*/
@@ -1169,6 +1197,79 @@
}
/**
+ * Used to trigger display of the ChangeDefaultCallScreeningApp activity to prompt the user to
+ * change the call screening app.
+ *
+ * A {@link SecurityException} will be thrown if calling package name doesn't match the package
+ * of the passed {@link ComponentName}
+ *
+ * @param componentName to verify that the calling package name matches the package of the
+ * passed ComponentName.
+ */
+ public void requestChangeDefaultCallScreeningApp(@NonNull ComponentName componentName) {
+ try {
+ if (isServiceConnected()) {
+ getTelecomService().requestChangeDefaultCallScreeningApp(componentName, mContext
+ .getOpPackageName());
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG,
+ "RemoteException calling ITelecomService#requestChangeDefaultCallScreeningApp.",
+ e);
+ }
+ }
+
+ /**
+ * Used to verify that the passed ComponentName is default call screening app.
+ *
+ * @param componentName to verify that the package of the passed ComponentName matched the default
+ * call screening packageName.
+ *
+ * @return {@code true} if the passed componentName matches the default call screening's, {@code
+ * false} if the passed componentName is null, or it doesn't match default call screening's.
+ */
+ public boolean isDefaultCallScreeningApp(ComponentName componentName) {
+ try {
+ if (isServiceConnected()) {
+ return getTelecomService().isDefaultCallScreeningApp(componentName);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG,
+ "RemoteException calling ITelecomService#isDefaultCallScreeningApp.",
+ e);
+ }
+ return false;
+ }
+
+ /**
+ * Used to set the default call screening package.
+ *
+ * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} Requires
+ * permission: {@link android.Manifest.permission#WRITE_SECURE_SETTINGS}
+ *
+ * A {@link IllegalArgumentException} will be thrown if the specified package and component name
+ * of {@link ComponentName} does't exist, or the specified component of {@link ComponentName}
+ * does't have {@link android.Manifest.permission#BIND_SCREENING_SERVICE}.
+ *
+ * @param componentName to set the default call screening to.
+ * @hide
+ */
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.MODIFY_PHONE_STATE,
+ android.Manifest.permission.WRITE_SECURE_SETTINGS
+ })
+ public void setDefaultCallScreeningApp(ComponentName componentName) {
+ try {
+ if (isServiceConnected()) {
+ getTelecomService().setDefaultCallScreeningApp(componentName);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG,
+ "RemoteException calling ITelecomService#setDefaultCallScreeningApp.", e);
+ }
+ }
+
+ /**
* Return whether a given phone number is the configured voicemail number for a
* particular phone account.
*
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index df7d683..d97f0c5f 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -256,6 +256,21 @@
boolean setDefaultDialer(in String packageName);
/**
+ * @see TelecomServiceImpl#requestChangeDefaultCallScreeningApp
+ */
+ void requestChangeDefaultCallScreeningApp(in ComponentName componentNamem, String callingPackage);
+
+ /**
+ * @see TelecomServiceImpl#isDefaultCallScreeningApp
+ */
+ boolean isDefaultCallScreeningApp(in ComponentName componentName);
+
+ /**
+ * @see TelecomServiceImpl#setDefaultCallScreeningApp
+ */
+ void setDefaultCallScreeningApp(in ComponentName componentName);
+
+ /**
* @see TelecomServiceImpl#createManageBlockedNumbersIntent
**/
Intent createManageBlockedNumbersIntent();