From ff60f5ec27aa6bc515421f19a27225679fe92b41 Mon Sep 17 00:00:00 2001 From: tonyzhu Date: Mon, 1 Oct 2018 19:14:59 +0800 Subject: [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 --- api/current.txt | 5 + telecomm/java/android/telecom/TelecomManager.java | 101 +++++++++++++++++++++ .../android/internal/telecom/ITelecomService.aidl | 15 +++ 3 files changed, 121 insertions(+) diff --git a/api/current.txt b/api/current.txt index d6bd9b51580e..69ea2ac3f83b 100755 --- a/api/current.txt +++ b/api/current.txt @@ -41748,6 +41748,7 @@ package android.telecom { 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 @@ package android.telecom { 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 @@ package android.telecom { 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 3127b3584dd9..fa16bfe8e795 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; @@ -174,6 +175,33 @@ public class TelecomManager { public static final String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "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. @@ -1168,6 +1196,79 @@ public class TelecomManager { return null; } + /** + * 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 df7d6832833a..d97f0c5f7684 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -255,6 +255,21 @@ interface ITelecomService { */ 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 **/ -- cgit v1.2.3-59-g8ed1b