/*
|
* Copyright (C) 2019 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
package com.android.server.location;
|
|
import android.content.Context;
|
import android.content.pm.PackageManager;
|
|
/**
|
* Encapsulates utility functions and classes related to location permission checking.
|
*/
|
public final class LocationPermissionUtil {
|
/**
|
* Returns true if the calling process identified by {@code callerIdentity} is enabled to
|
* report location to AppOps service before providing device location identifiable information
|
* to its clients. Packages with these permissions must report any reporting of location
|
* information to apps, via AppOps.
|
*
|
* <p>The calling package represented by {@code callerIdentity} is considered a part of the
|
* extended Location Manager Service if it has all of the permissions below.
|
* <ul>
|
* <li>{@link android.Manifest.permission#LOCATION_HARDWARE}
|
* <li>{@link android.Manifest.permission#UPDATE_APP_OPS_STATS}
|
* </ul>
|
*
|
* <p>Any package with these permissions, that passes along location information from Android
|
* framework to apps, must report to AppOps, similarly to Location Manager Service - i.e.
|
* whenever it reports device location or location identifiable information such as
|
* GNSS status, GNSS measurements, etc. to its clients.
|
*/
|
public static boolean doesCallerReportToAppOps(Context context, CallerIdentity callerIdentity) {
|
return hasPermissionLocationHardware(context, callerIdentity)
|
&& hasPermissionUpdateAppOpsStats(context, callerIdentity);
|
}
|
|
private static boolean hasPermissionLocationHardware(Context context,
|
CallerIdentity callerIdentity) {
|
return context.checkPermission(android.Manifest.permission.LOCATION_HARDWARE,
|
callerIdentity.mPid, callerIdentity.mUid) == PackageManager.PERMISSION_GRANTED;
|
}
|
|
private static boolean hasPermissionUpdateAppOpsStats(Context context,
|
CallerIdentity callerIdentity) {
|
return context.checkPermission(android.Manifest.permission.UPDATE_APP_OPS_STATS,
|
callerIdentity.mPid, callerIdentity.mUid) == PackageManager.PERMISSION_GRANTED;
|
}
|
|
private LocationPermissionUtil() {}
|
}
|