| /* |
| * 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() {} |
| } |