From 6147275aa72b177ca5894051f37154c08c4bf7b6 Mon Sep 17 00:00:00 2001 From: Shuo Qian Date: Mon, 28 Sep 2020 23:18:49 -0700 Subject: [PATCH] Introduce new App Ops permission for 3rd-party InCallService This permission is intended to be used internally as a system App Ops permission, and let CompanionDeviceManager or RoleManager to grant with users. If it is granted by user, the corresponding companion app has the ability to query the details of the ongoing calls, and also manage its life cycle. Bug: 169595473 Test: atest ThirdPartyInCallServiceAppOpsPermissionTest Change-Id: Ie0f790aab2edcd52cfdbded2630347b9f8dd4d49 Merged-In: Ie0f790aab2edcd52cfdbded2630347b9f8dd4d49 --- api/current.txt | 1 + api/system-current.txt | 1 + core/api/current.txt | 1 + core/api/system-current.txt | 1 + core/api/test-current.txt | 1 + core/java/android/app/AppOpsManager.java | 22 +++++++++++++++++++++- core/proto/android/app/enums.proto | 1 + core/res/AndroidManifest.xml | 5 +++++ 8 files changed, 32 insertions(+), 1 deletion(-) diff --git a/api/current.txt b/api/current.txt index 86debaa10c962..a8fb90c98d043 100644 --- a/api/current.txt +++ b/api/current.txt @@ -96,6 +96,7 @@ package android { field public static final String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE"; field public static final String MANAGE_DOCUMENTS = "android.permission.MANAGE_DOCUMENTS"; field public static final String MANAGE_EXTERNAL_STORAGE = "android.permission.MANAGE_EXTERNAL_STORAGE"; + field public static final String MANAGE_ONGOING_CALLS = "android.permission.MANAGE_ONGOING_CALLS"; field public static final String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS"; field public static final String MASTER_CLEAR = "android.permission.MASTER_CLEAR"; field public static final String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL"; diff --git a/api/system-current.txt b/api/system-current.txt index 55cc12e63a163..042e2dc53b9c2 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -393,6 +393,7 @@ package android.app { field public static final String OPSTR_LOADER_USAGE_STATS = "android:loader_usage_stats"; field public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; + field public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls"; field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; field public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; diff --git a/core/api/current.txt b/core/api/current.txt index 2179242cde622..14a8dec72080a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -96,6 +96,7 @@ package android { field public static final String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE"; field public static final String MANAGE_DOCUMENTS = "android.permission.MANAGE_DOCUMENTS"; field public static final String MANAGE_EXTERNAL_STORAGE = "android.permission.MANAGE_EXTERNAL_STORAGE"; + field public static final String MANAGE_ONGOING_CALLS = "android.permission.MANAGE_ONGOING_CALLS"; field public static final String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS"; field public static final String MASTER_CLEAR = "android.permission.MASTER_CLEAR"; field public static final String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index dc9789f2483a1..f36f4f33d7fee 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -393,6 +393,7 @@ package android.app { field public static final String OPSTR_LOADER_USAGE_STATS = "android:loader_usage_stats"; field public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; + field public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls"; field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; field public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 501534739096c..3de2f9d317f41 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -193,6 +193,7 @@ package android.app { field public static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time"; field public static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time"; field public static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; + field public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls"; field public static final int OP_COARSE_LOCATION = 0; // 0x0 field public static final int OP_RECORD_AUDIO = 27; // 0x1b field public static final int OP_START_FOREGROUND = 76; // 0x4c diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index e4ab6f2e01bd3..ff8d9e462cdbd 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -846,6 +846,8 @@ public class AppOpsManager { @UnsupportedAppUsage public static final int OP_SEND_SMS = AppProtoEnums.APP_OP_SEND_SMS; /** @hide */ + public static final int OP_MANAGE_ONGOING_CALLS = AppProtoEnums.APP_OP_MANAGE_ONGOING_CALLS; + /** @hide */ @UnsupportedAppUsage public static final int OP_READ_ICC_SMS = AppProtoEnums.APP_OP_READ_ICC_SMS; /** @hide */ @@ -1136,7 +1138,7 @@ public class AppOpsManager { /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public static final int _NUM_OP = 103; + public static final int _NUM_OP = 104; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1447,6 +1449,15 @@ public class AppOpsManager { @SystemApi public static final String OPSTR_LOADER_USAGE_STATS = "android:loader_usage_stats"; + /** + * Grants an app access to the {@link android.telecom.InCallService} API to see + * information about ongoing calls and to enable control of calls. + * @hide + */ + @SystemApi + @TestApi + public static final String OPSTR_MANAGE_ONGOING_CALLS = "android:manage_ongoing_calls"; + /** * AppOp granted to apps that we are started via {@code am instrument -e --no-isolated-storage} * @@ -1552,6 +1563,7 @@ public class AppOpsManager { OP_MANAGE_EXTERNAL_STORAGE, OP_INTERACT_ACROSS_PROFILES, OP_LOADER_USAGE_STATS, + OP_MANAGE_ONGOING_CALLS, }; /** @@ -1666,6 +1678,7 @@ public class AppOpsManager { OP_PHONE_CALL_MICROPHONE, // OP_PHONE_CALL_MICROPHONE OP_PHONE_CALL_CAMERA, // OP_PHONE_CALL_CAMERA OP_RECORD_AUDIO_HOTWORD, // RECORD_AUDIO_HOTWORD + OP_MANAGE_ONGOING_CALLS, // MANAGE_ONGOING_CALLS }; /** @@ -1775,6 +1788,7 @@ public class AppOpsManager { OPSTR_PHONE_CALL_MICROPHONE, OPSTR_PHONE_CALL_CAMERA, OPSTR_RECORD_AUDIO_HOTWORD, + OPSTR_MANAGE_ONGOING_CALLS, }; /** @@ -1885,6 +1899,7 @@ public class AppOpsManager { "PHONE_CALL_MICROPHONE", "PHONE_CALL_CAMERA", "RECORD_AUDIO_HOTWORD", + "MANAGE_ONGOING_CALLS", }; /** @@ -1996,6 +2011,7 @@ public class AppOpsManager { null, // no permission for OP_PHONE_CALL_MICROPHONE null, // no permission for OP_PHONE_CALL_CAMERA null, // no permission for OP_RECORD_AUDIO_HOTWORD + Manifest.permission.MANAGE_ONGOING_CALLS, }; /** @@ -2107,6 +2123,7 @@ public class AppOpsManager { null, // PHONE_CALL_MICROPHONE null, // PHONE_CALL_MICROPHONE null, // RECORD_AUDIO_HOTWORD + null, // MANAGE_ONGOING_CALLS }; /** @@ -2217,6 +2234,7 @@ public class AppOpsManager { null, // PHONE_CALL_MICROPHONE null, // PHONE_CALL_CAMERA null, // RECORD_AUDIO_HOTWORD + null, // MANAGE_ONGOING_CALLS }; /** @@ -2326,6 +2344,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // PHONE_CALL_MICROPHONE AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA AppOpsManager.MODE_ALLOWED, // OP_RECORD_AUDIO_HOTWORD + AppOpsManager.MODE_DEFAULT, // MANAGE_ONGOING_CALLS }; /** @@ -2439,6 +2458,7 @@ public class AppOpsManager { false, // PHONE_CALL_MICROPHONE false, // PHONE_CALL_CAMERA false, // RECORD_AUDIO_HOTWORD + true, // MANAGE_ONGOING_CALLS }; /** diff --git a/core/proto/android/app/enums.proto b/core/proto/android/app/enums.proto index 37a9f50dec898..2d2c8accc0399 100644 --- a/core/proto/android/app/enums.proto +++ b/core/proto/android/app/enums.proto @@ -210,4 +210,5 @@ enum AppOpEnum { APP_OP_PHONE_CALL_MICROPHONE = 100; APP_OP_PHONE_CALL_CAMERA = 101; APP_OP_RECORD_AUDIO_HOTWORD = 102; + APP_OP_MANAGE_ONGOING_CALLS = 103; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f3eb943e51d07..b254db790041e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2193,6 +2193,11 @@ + + +