blob: 4465f31cb45b763905841ca9283f2caa155884ce [file] [log] [blame]
/*
* 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() {}
}