diff options
| -rw-r--r-- | services/core/java/com/android/server/location/GnssVisibilityControl.java | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java index 8391f9d1609a..c3626d2373ea 100644 --- a/services/core/java/com/android/server/location/GnssVisibilityControl.java +++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java @@ -22,6 +22,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; @@ -135,6 +136,7 @@ class GnssVisibilityControl { intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED); + intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); intentFilter.addDataScheme("package"); mContext.registerReceiverAsUser(new BroadcastReceiver() { @Override @@ -148,6 +150,7 @@ class GnssVisibilityControl { case Intent.ACTION_PACKAGE_ADDED: case Intent.ACTION_PACKAGE_REMOVED: case Intent.ACTION_PACKAGE_REPLACED: + case Intent.ACTION_PACKAGE_CHANGED: String pkgName = intent.getData().getEncodedSchemeSpecificPart(); handleProxyAppPackageUpdate(pkgName, action); break; @@ -162,10 +165,12 @@ class GnssVisibilityControl { return; // ignore, pkgName is not one of the proxy apps in our list. } - Log.i(TAG, "Proxy app " + pkgName + " package changed: " + action); - final boolean updatedLocationPermission = hasLocationPermission(pkgName); + if (DEBUG) Log.d(TAG, "Proxy app " + pkgName + " package changed: " + action); + final boolean updatedLocationPermission = shouldEnableLocationPermissionInGnssHal(pkgName); if (locationPermission != updatedLocationPermission) { // Permission changed. So, update the GNSS HAL with the updated list. + Log.i(TAG, "Proxy app " + pkgName + " location permission changed." + + " IsLocationPermissionEnabled: " + updatedLocationPermission); mProxyAppToLocationPermissions.put(pkgName, updatedLocationPermission); updateNfwLocationAccessProxyAppsInGnssHal(); } @@ -192,8 +197,9 @@ class GnssVisibilityControl { mProxyAppToLocationPermissions.clear(); } - for (String proxApp : nfwLocationAccessProxyApps) { - mProxyAppToLocationPermissions.put(proxApp, hasLocationPermission(proxApp)); + for (String proxyAppPkgName : nfwLocationAccessProxyApps) { + mProxyAppToLocationPermissions.put(proxyAppPkgName, + shouldEnableLocationPermissionInGnssHal(proxyAppPkgName)); } updateNfwLocationAccessProxyAppsInGnssHal(); @@ -308,37 +314,42 @@ class GnssVisibilityControl { } for (Map.Entry<String, Boolean> entry : mProxyAppToLocationPermissions.entrySet()) { - // Cannot cache uid since the application could be uninstalled and reinstalled. - final String proxyApp = entry.getKey(); - final Integer nfwProxyAppUid = getApplicationUid(proxyApp); - if (nfwProxyAppUid == null || nfwProxyAppUid != uid) { + final String proxyAppPkgName = entry.getKey(); + final ApplicationInfo proxyAppInfo = getProxyAppInfo(proxyAppPkgName); + if (proxyAppInfo == null || proxyAppInfo.uid != uid) { continue; } - final boolean isLocationPermissionEnabled = hasLocationPermission(proxyApp); + final boolean isLocationPermissionEnabled = shouldEnableLocationPermissionInGnssHal( + proxyAppPkgName); if (isLocationPermissionEnabled != entry.getValue()) { - Log.i(TAG, "Location permission setting is changed to " - + (isLocationPermissionEnabled ? "enabled" : "disabled") - + " for non-framework location access proxy app " - + proxyApp); + Log.i(TAG, "Proxy app " + proxyAppPkgName + " location permission changed." + + " IsLocationPermissionEnabled: " + isLocationPermissionEnabled); entry.setValue(isLocationPermissionEnabled); updateNfwLocationAccessProxyAppsInGnssHal(); - return; } + return; } } - private Integer getApplicationUid(String pkgName) { + private ApplicationInfo getProxyAppInfo(String proxyAppPkgName) { try { - return mPackageManager.getApplicationInfo(pkgName, 0).uid; + return mPackageManager.getApplicationInfo(proxyAppPkgName, 0); } catch (PackageManager.NameNotFoundException e) { - if (DEBUG) { - Log.d(TAG, "Non-framework location access proxy app " + pkgName + " is not found."); - } + if (DEBUG) Log.d(TAG, "Proxy app " + proxyAppPkgName + " is not found."); return null; } } + private boolean shouldEnableLocationPermissionInGnssHal(String proxyAppPkgName) { + return isProxyAppInstalled(proxyAppPkgName) && hasLocationPermission(proxyAppPkgName); + } + + private boolean isProxyAppInstalled(String pkgName) { + ApplicationInfo proxyAppInfo = getProxyAppInfo(pkgName); + return (proxyAppInfo != null) && proxyAppInfo.enabled; + } + private boolean hasLocationPermission(String pkgName) { return mPackageManager.checkPermission(LOCATION_PERMISSION_NAME, pkgName) == PackageManager.PERMISSION_GRANTED; @@ -393,9 +404,9 @@ class GnssVisibilityControl { return; } - final String proxyAppPackageName = nfwNotification.mProxyAppPackageName; + final String proxyAppPkgName = nfwNotification.mProxyAppPackageName; final Boolean isLocationPermissionEnabled = mProxyAppToLocationPermissions.get( - proxyAppPackageName); + proxyAppPkgName); final boolean isLocationRequestAccepted = nfwNotification.isRequestAccepted(); final boolean isPermissionMismatched = (isLocationPermissionEnabled == null) ? isLocationRequestAccepted @@ -425,7 +436,7 @@ class GnssVisibilityControl { } if (isLocationPermissionEnabled == null) { - Log.w(TAG, "Could not find proxy app with name: " + proxyAppPackageName + " in the " + Log.w(TAG, "Could not find proxy app with name: " + proxyAppPkgName + " in the " + "value specified for config parameter: " + GnssConfiguration.CONFIG_NFW_PROXY_APPS + ". AppOps service not notified " + "for non-framework location access notification: " + nfwNotification); @@ -433,18 +444,19 @@ class GnssVisibilityControl { } // Display location icon attributed to this proxy app. - final Integer clsAppUid = getApplicationUid(proxyAppPackageName); - if (clsAppUid == null) { - Log.e(TAG, "Proxy app " + proxyAppPackageName + " is not found. AppOps service not " + final ApplicationInfo proxyAppInfo = getProxyAppInfo(proxyAppPkgName); + if (proxyAppInfo == null) { + Log.e(TAG, "Proxy app " + proxyAppPkgName + " is not found. AppOps service not " + "notified for non-framework location access notification: " + nfwNotification); return; } - mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, clsAppUid, proxyAppPackageName); + + mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, proxyAppInfo.uid, proxyAppPkgName); // Log proxy app permission mismatch between framework and GNSS HAL. if (isPermissionMismatched) { - Log.w(TAG, "Permission mismatch. Framework proxy app " + proxyAppPackageName + Log.w(TAG, "Permission mismatch. Framework proxy app " + proxyAppPkgName + " location permission is set to " + isLocationPermissionEnabled + " but GNSS non-framework location access response type is " + nfwNotification.getResponseTypeAsString() + " for notification: " |