From c1dc1b8519397917796b59bfc8e28b47d1afedb5 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Wed, 19 Aug 2020 11:22:55 -0700 Subject: [PATCH] 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; }