From 732608a6be70f9756e9dfcb91941549c40ad5abb Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Mon, 17 Aug 2020 17:37:09 -0700 Subject: [PATCH 1/4] Add app-ops for camera/mic use during phone call Test: Started a phone call, verified app-op was active Bug: 162547999 Change-Id: I93bf59d24e3cfbeaede442571f09ba97f0990c75 --- core/java/android/app/AppOpsManager.java | 46 +++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 0a6827cde3d35..d13137d4a7163 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1124,9 +1124,24 @@ public class AppOpsManager { /** @hide */ public static final int OP_NO_ISOLATED_STORAGE = AppProtoEnums.APP_OP_NO_ISOLATED_STORAGE; + /** + * Phone call is using microphone + * + * @hide + */ + // TODO: Add as AppProtoEnums + public static final int OP_PHONE_CALL_MICROPHONE = 100; + /** + * Phone call is using camera + * + * @hide + */ + // TODO: Add as AppProtoEnums + public static final int OP_PHONE_CALL_CAMERA = 101; + /** @hide */ @UnsupportedAppUsage - public static final int _NUM_OP = 100; + public static final int _NUM_OP = 102; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1444,6 +1459,19 @@ public class AppOpsManager { */ public static final String OPSTR_NO_ISOLATED_STORAGE = "android:no_isolated_storage"; + /** + * Phone call is using microphone + * + * @hide + */ + public static final String OPSTR_PHONE_CALL_MICROPHONE = "android:phone_call_microphone"; + /** + * Phone call is using camera + * + * @hide + */ + public static final String OPSTR_PHONE_CALL_CAMERA = "android:phone_call_camera"; + /** {@link #sAppOpsToNote} not initialized yet for this op */ private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0; /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */ @@ -1633,6 +1661,8 @@ public class AppOpsManager { OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, //AUTO_REVOKE_PERMISSIONS_IF_UNUSED OP_AUTO_REVOKE_MANAGED_BY_INSTALLER, //OP_AUTO_REVOKE_MANAGED_BY_INSTALLER OP_NO_ISOLATED_STORAGE, // NO_ISOLATED_STORAGE + OP_PHONE_CALL_MICROPHONE, // OP_PHONE_CALL_MICROPHONE + OP_PHONE_CALL_CAMERA, // OP_PHONE_CALL_CAMERA }; /** @@ -1739,6 +1769,8 @@ public class AppOpsManager { OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, OPSTR_AUTO_REVOKE_MANAGED_BY_INSTALLER, OPSTR_NO_ISOLATED_STORAGE, + OPSTR_PHONE_CALL_MICROPHONE, + OPSTR_PHONE_CALL_CAMERA, }; /** @@ -1846,6 +1878,8 @@ public class AppOpsManager { "AUTO_REVOKE_PERMISSIONS_IF_UNUSED", "AUTO_REVOKE_MANAGED_BY_INSTALLER", "NO_ISOLATED_STORAGE", + "PHONE_CALL_MICROPHONE", + "PHONE_CALL_CAMERA", }; /** @@ -1954,6 +1988,8 @@ public class AppOpsManager { null, // no permission for OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED null, // no permission for OP_AUTO_REVOKE_MANAGED_BY_INSTALLER null, // no permission for OP_NO_ISOLATED_STORAGE + null, // no permission for OP_PHONE_CALL_MICROPHONE + null, // no permission for OP_PHONE_CALL_CAMERA }; /** @@ -2062,6 +2098,8 @@ public class AppOpsManager { null, // AUTO_REVOKE_PERMISSIONS_IF_UNUSED null, // AUTO_REVOKE_MANAGED_BY_INSTALLER null, // NO_ISOLATED_STORAGE + null, // PHONE_CALL_MICROPHONE + null, // PHONE_CALL_MICROPHONE }; /** @@ -2169,6 +2207,8 @@ public class AppOpsManager { null, // AUTO_REVOKE_PERMISSIONS_IF_UNUSED null, // AUTO_REVOKE_MANAGED_BY_INSTALLER null, // NO_ISOLATED_STORAGE + null, // PHONE_CALL_MICROPHONE + null, // PHONE_CALL_CAMERA }; /** @@ -2275,6 +2315,8 @@ public class AppOpsManager { AppOpsManager.MODE_DEFAULT, // OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED AppOpsManager.MODE_ALLOWED, // OP_AUTO_REVOKE_MANAGED_BY_INSTALLER AppOpsManager.MODE_ERRORED, // OP_NO_ISOLATED_STORAGE + AppOpsManager.MODE_ALLOWED, // PHONE_CALL_MICROPHONE + AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA }; /** @@ -2385,6 +2427,8 @@ public class AppOpsManager { false, // AUTO_REVOKE_PERMISSIONS_IF_UNUSED false, // AUTO_REVOKE_MANAGED_BY_INSTALLER true, // NO_ISOLATED_STORAGE + false, // PHONE_CALL_MICROPHONE + false, // PHONE_CALL_CAMERA }; /** From 94afe73ca26292e33bd1d51a4934e2313a551843 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Mon, 17 Aug 2020 18:37:30 -0700 Subject: [PATCH 2/4] Treat phone call mic/camera similar to other mic/camera app-ops Bug: 162547999 Test: Started a phone call and swiped clicked all way through privacy chip flow Change-Id: Icb933c7e4e430d3da54cef44b5aaab99093ffeca --- .../com/android/systemui/appops/AppOpsControllerImpl.java | 6 +++++- .../com/android/systemui/privacy/PrivacyItemController.kt | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index 01841249f4ac4..6347cee7d8929 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -82,8 +82,10 @@ public class AppOpsControllerImpl implements AppOpsController, protected static final int[] OPS = new int[] { AppOpsManager.OP_CAMERA, + AppOpsManager.OP_PHONE_CALL_CAMERA, AppOpsManager.OP_SYSTEM_ALERT_WINDOW, AppOpsManager.OP_RECORD_AUDIO, + AppOpsManager.OP_PHONE_CALL_MICROPHONE, AppOpsManager.OP_COARSE_LOCATION, AppOpsManager.OP_FINE_LOCATION }; @@ -302,7 +304,9 @@ public class AppOpsControllerImpl implements AppOpsController, // does not correspond to a platform permission // which may be user sensitive, so for now always show it to the user. if (appOpCode == AppOpsManager.OP_SYSTEM_ALERT_WINDOW - || appOpCode == AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION) { + || appOpCode == AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION + || appOpCode == AppOpsManager.OP_PHONE_CALL_CAMERA + || appOpCode == AppOpsManager.OP_PHONE_CALL_MICROPHONE) { return true; } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index 2be69c10a77b0..59118bf3534e2 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -57,7 +57,8 @@ class PrivacyItemController @Inject constructor( @VisibleForTesting internal companion object { val OPS_MIC_CAMERA = intArrayOf(AppOpsManager.OP_CAMERA, - AppOpsManager.OP_RECORD_AUDIO) + AppOpsManager.OP_PHONE_CALL_CAMERA, AppOpsManager.OP_RECORD_AUDIO, + AppOpsManager.OP_PHONE_CALL_MICROPHONE) val OPS_LOCATION = intArrayOf( AppOpsManager.OP_COARSE_LOCATION, AppOpsManager.OP_FINE_LOCATION) @@ -248,9 +249,11 @@ class PrivacyItemController @Inject constructor( private fun toPrivacyItem(appOpItem: AppOpItem): PrivacyItem? { val type: PrivacyType = when (appOpItem.code) { + AppOpsManager.OP_PHONE_CALL_CAMERA, AppOpsManager.OP_CAMERA -> PrivacyType.TYPE_CAMERA - AppOpsManager.OP_COARSE_LOCATION -> PrivacyType.TYPE_LOCATION + AppOpsManager.OP_COARSE_LOCATION, AppOpsManager.OP_FINE_LOCATION -> PrivacyType.TYPE_LOCATION + AppOpsManager.OP_PHONE_CALL_MICROPHONE, AppOpsManager.OP_RECORD_AUDIO -> PrivacyType.TYPE_MICROPHONE else -> return null } From 64c801d344aba147359875a1650003b52987b5b1 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Tue, 18 Aug 2020 19:39:01 -0700 Subject: [PATCH 3/4] Special case location provider camera accesses and show them as indicators Bug: 162547999 Test: Made location provider access camera and saw privacy chip Change-Id: I5960fdff38b38a0bd8f4d9c9826639cc89a94603 --- .../com/android/systemui/appops/AppOpsControllerImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index 6347cee7d8929..b70142826c1e7 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -19,6 +19,7 @@ package com.android.systemui.appops; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; +import android.location.LocationManager; import android.media.AudioManager; import android.media.AudioRecordingConfiguration; import android.os.Handler; @@ -66,6 +67,7 @@ public class AppOpsControllerImpl implements AppOpsController, private final AppOpsManager mAppOps; private final AudioManager mAudioManager; + private final LocationManager mLocationManager; private H mBGHandler; private final List mCallbacks = new ArrayList<>(); private final ArrayMap> mCallbacksByCode = new ArrayMap<>(); @@ -106,6 +108,7 @@ public class AppOpsControllerImpl implements AppOpsController, mCallbacksByCode.put(OPS[i], new ArraySet<>()); } mAudioManager = audioManager; + mLocationManager = context.getSystemService(LocationManager.class); dumpManager.registerDumpable(TAG, this); } @@ -310,6 +313,11 @@ public class AppOpsControllerImpl implements AppOpsController, return true; } + if (appOpCode == AppOpsManager.OP_CAMERA && mLocationManager.isProviderPackage( + packageName)) { + return true; + } + return isUserSensitive(appOpCode, uid, packageName); } From c1dc1b8519397917796b59bfc8e28b47d1afedb5 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Wed, 19 Aug 2020 11:22:55 -0700 Subject: [PATCH 4/4] Cache location provider pkg name Bug: 162547999 Test: Accessed camera from location provider and saw camera indicator Change-Id: Id273b7d42c6ebb60219b515e2ebd4bd44961c2e0 --- .../systemui/appops/AppOpsControllerImpl.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index b70142826c1e7..64b35caeeef2b 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -68,6 +68,12 @@ public class AppOpsControllerImpl implements AppOpsController, private final AppOpsManager mAppOps; private final AudioManager mAudioManager; private final LocationManager mLocationManager; + + // mLocationProviderPackages are cached and updated only occasionally + private static final long LOCATION_PROVIDER_UPDATE_FREQUENCY_MS = 30000; + private long mLastLocationProviderPackageUpdate; + private List mLocationProviderPackages; + private H mBGHandler; private final List mCallbacks = new ArrayList<>(); private final ArrayMap> mCallbacksByCode = new ArrayMap<>(); @@ -292,6 +298,26 @@ public class AppOpsControllerImpl implements AppOpsController, return isUserVisible(item.getCode(), item.getUid(), item.getPackageName()); } + /** + * Checks if a package is the current location provider. + * + *

Data is cached to avoid too many calls into system server + * + * @param packageName The package that might be the location provider + * + * @return {@code true} iff the package is the location provider. + */ + private boolean isLocationProvider(String packageName) { + long now = System.currentTimeMillis(); + + if (mLastLocationProviderPackageUpdate + LOCATION_PROVIDER_UPDATE_FREQUENCY_MS < now) { + mLastLocationProviderPackageUpdate = now; + mLocationProviderPackages = mLocationManager.getProviderPackages( + LocationManager.FUSED_PROVIDER); + } + + return mLocationProviderPackages.contains(packageName); + } /** * Does the app-op, uid and package name, refer to an operation that should be shown to the @@ -313,8 +339,7 @@ public class AppOpsControllerImpl implements AppOpsController, return true; } - if (appOpCode == AppOpsManager.OP_CAMERA && mLocationManager.isProviderPackage( - packageName)) { + if (appOpCode == AppOpsManager.OP_CAMERA && isLocationProvider(packageName)) { return true; }