diff options
| author | 2022-05-12 03:50:34 -0700 | |
|---|---|---|
| committer | 2022-05-12 03:50:39 -0700 | |
| commit | 3a70f7b6e64042034f480ff246099b33fc1eda4c (patch) | |
| tree | fe61b87c897830d3747c5a7988ac0fe038fa2185 | |
| parent | dfada27e9f882954ec7cfba4441b202f3ccfb464 (diff) | |
Add always full location check to LocationAccessPolicy
Check whether the package is allowlisted to always have full location
data.
Test: atest LocationAccessPolicyTest
Bug: 231445403
Change-Id: I33c5088b639595c8e0f89f3f2a926dfc5d830fcf
| -rw-r--r-- | telephony/common/android/telephony/LocationAccessPolicy.java | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/telephony/common/android/telephony/LocationAccessPolicy.java b/telephony/common/android/telephony/LocationAccessPolicy.java index 9dfb0cc289ee..d4b6c91eb7a0 100644 --- a/telephony/common/android/telephony/LocationAccessPolicy.java +++ b/telephony/common/android/telephony/LocationAccessPolicy.java @@ -316,9 +316,11 @@ public final class LocationAccessPolicy { return LocationPermissionResult.ALLOWED; } - // Check the system-wide requirements. If the location main switch is off or - // the app's profile isn't in foreground, return a soft denial. - if (!checkSystemLocationAccess(context, query.callingUid, query.callingPid)) { + // Check the system-wide requirements. If the location main switch is off and the caller is + // not in the allowlist of apps that always have loation access or the app's profile + // isn't in the foreground, return a soft denial. + if (!checkSystemLocationAccess(context, query.callingUid, query.callingPid, + query.callingPackage)) { return LocationPermissionResult.DENIED_SOFT; } @@ -344,15 +346,16 @@ public final class LocationAccessPolicy { return LocationPermissionResult.ALLOWED; } - private static boolean checkManifestPermission(Context context, int pid, int uid, String permissionToCheck) { return context.checkPermission(permissionToCheck, pid, uid) == PackageManager.PERMISSION_GRANTED; } - private static boolean checkSystemLocationAccess(@NonNull Context context, int uid, int pid) { - if (!isLocationModeEnabled(context, UserHandle.getUserHandleForUid(uid).getIdentifier())) { + private static boolean checkSystemLocationAccess(@NonNull Context context, int uid, int pid, + @NonNull String callingPackage) { + if (!isLocationModeEnabled(context, UserHandle.getUserHandleForUid(uid).getIdentifier()) + && !isLocationBypassAllowed(context, callingPackage)) { if (DBG) Log.w(TAG, "Location disabled, failed, (" + uid + ")"); return false; } @@ -373,6 +376,16 @@ public final class LocationAccessPolicy { return locationManager.isLocationEnabledForUser(UserHandle.of(userId)); } + private static boolean isLocationBypassAllowed(@NonNull Context context, + @NonNull String callingPackage) { + for (String bypassPackage : getLocationBypassPackages(context)) { + if (callingPackage.equals(bypassPackage)) { + return true; + } + } + return false; + } + /** * @return An array of packages that are always allowed to access location. */ |