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

This commit is contained in:
Sarah Chin
2022-05-13 18:27:40 +00:00
committed by Android (Google) Code Review

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