Merge "Add always full location check to LocationAccessPolicy" into tm-dev am: a9235c3208

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18342389

Change-Id: I23666ab5e5aa284639193670ae93c5c12cc13f25
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Sarah Chin
2022-05-13 18:31:37 +00:00
committed by Automerger Merge Worker

View File

@@ -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.
*/