| /* |
| * Copyright 2018 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 androidx.core.content.pm; |
| |
| import android.annotation.SuppressLint; |
| import android.content.pm.PermissionInfo; |
| import android.os.Build; |
| |
| import androidx.annotation.IntDef; |
| import androidx.annotation.NonNull; |
| import androidx.annotation.RestrictTo; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| /** |
| * Helper for accessing features in {@link PermissionInfo}. |
| */ |
| public final class PermissionInfoCompat { |
| private PermissionInfoCompat() { |
| } |
| |
| /** @hide */ |
| @IntDef(flag = false, value = { |
| PermissionInfo.PROTECTION_NORMAL, |
| PermissionInfo.PROTECTION_DANGEROUS, |
| PermissionInfo.PROTECTION_SIGNATURE, |
| PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM, |
| }) |
| @RestrictTo(RestrictTo.Scope.LIBRARY) |
| @Retention(RetentionPolicy.SOURCE) |
| public @interface Protection {} |
| |
| /** @hide */ |
| @SuppressLint("UniqueConstants") // because _SYSTEM and _PRIVILEGED are aliases. |
| @IntDef(flag = true, value = { |
| PermissionInfo.PROTECTION_FLAG_PRIVILEGED, |
| PermissionInfo.PROTECTION_FLAG_SYSTEM, |
| PermissionInfo.PROTECTION_FLAG_DEVELOPMENT, |
| PermissionInfo.PROTECTION_FLAG_APPOP, |
| PermissionInfo.PROTECTION_FLAG_PRE23, |
| PermissionInfo.PROTECTION_FLAG_INSTALLER, |
| PermissionInfo.PROTECTION_FLAG_VERIFIER, |
| PermissionInfo.PROTECTION_FLAG_PREINSTALLED, |
| PermissionInfo.PROTECTION_FLAG_SETUP, |
| PermissionInfo.PROTECTION_FLAG_INSTANT, |
| PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY, |
| }) |
| @RestrictTo(RestrictTo.Scope.LIBRARY) |
| @Retention(RetentionPolicy.SOURCE) |
| public @interface ProtectionFlags {} |
| |
| /** |
| * Return the base permission type of a {@link PermissionInfo}. |
| */ |
| @SuppressWarnings("deprecation") |
| @SuppressLint("WrongConstant") // for "PermissionInfo.PROTECTION_MASK_BASE" |
| @Protection |
| public static int getProtection(@NonNull PermissionInfo permissionInfo) { |
| if (Build.VERSION.SDK_INT >= 28) { |
| return permissionInfo.getProtection(); |
| } else { |
| return permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; |
| } |
| } |
| |
| /** |
| * Return the additional protection flags of a {@link PermissionInfo}. |
| */ |
| @SuppressWarnings("deprecation") |
| @SuppressLint("WrongConstant") // for "~PermissionInfo.PROTECTION_MASK_BASE" |
| @ProtectionFlags |
| public static int getProtectionFlags(@NonNull PermissionInfo permissionInfo) { |
| if (Build.VERSION.SDK_INT >= 28) { |
| return permissionInfo.getProtectionFlags(); |
| } else { |
| return permissionInfo.protectionLevel & ~PermissionInfo.PROTECTION_MASK_BASE; |
| } |
| } |
| } |