PermissionInfo.java revision a90c8def2c6762bc6e5396b78c43e65e4b05079d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Information you can retrieve about a particular security permission 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * known to the system. This corresponds to information collected from the 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AndroidManifest.xml's <permission> tags. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PermissionInfo extends PackageItemInfo implements Parcelable { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A normal application value for {@link #protectionLevel}, corresponding 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the <code>normal</code> value of 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#protectionLevel}. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PROTECTION_NORMAL = 0; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dangerous value for {@link #protectionLevel}, corresponding 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the <code>dangerous</code> value of 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#protectionLevel}. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PROTECTION_DANGEROUS = 1; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * System-level value for {@link #protectionLevel}, corresponding 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the <code>signature</code> value of 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#protectionLevel}. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PROTECTION_SIGNATURE = 2; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * @deprecated Use {@link #PROTECTION_SIGNATURE}|{@link #PROTECTION_FLAG_PRIVILEGED} 52a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * instead. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn @Deprecated 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 59a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * to the <code>privileged</code> value of 60e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * {@link android.R.attr#protectionLevel}. 61e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 62a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn public static final int PROTECTION_FLAG_PRIVILEGED = 0x10; 63a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn 64a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn /** 65a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * @deprecated Old name for {@link #PROTECTION_FLAG_PRIVILEGED}, which 66a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * is now very confusing because it only applies to privileged apps, not all 67a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * apps on the system image. 68a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn */ 69a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn @Deprecated 70e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_FLAG_SYSTEM = 0x10; 71e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 72e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 73e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 74e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * to the <code>development</code> value of 75e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * {@link android.R.attr#protectionLevel}. 76e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 77e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_FLAG_DEVELOPMENT = 0x20; 78e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 79e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 8033f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 81e9b78fdbbef558f5e84f88397daf990dcc2e29cbJeff Sharkey * to the <code>appop</code> value of 8233f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn * {@link android.R.attr#protectionLevel}. 8333f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn */ 8433f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn public static final int PROTECTION_FLAG_APPOP = 0x40; 8533f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn 8633f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn /** 87de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 88de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn * to the <code>pre23</code> value of 89de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn * {@link android.R.attr#protectionLevel}. 90de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn */ 91de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn public static final int PROTECTION_FLAG_PRE23 = 0x80; 92de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn 93de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn /** 943e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * Additional flag for {@link #protectionLevel}, corresponding 953e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * to the <code>installer</code> value of 963e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * {@link android.R.attr#protectionLevel}. 973e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav */ 983e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav public static final int PROTECTION_FLAG_INSTALLER = 0x100; 993e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav 1003e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav /** 1013e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * Additional flag for {@link #protectionLevel}, corresponding 1023e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * to the <code>verifier</code> value of 1033e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav * {@link android.R.attr#protectionLevel}. 1043e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav */ 1053e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav public static final int PROTECTION_FLAG_VERIFIER = 0x200; 1063e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav 1073e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav /** 108a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 109a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * to the <code>preinstalled</code> value of 110a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn * {@link android.R.attr#protectionLevel}. 111a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn */ 112a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn public static final int PROTECTION_FLAG_PREINSTALLED = 0x400; 113a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn 114a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn /** 115e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: the basic protection type. 116e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 117e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_MASK_BASE = 0xf; 118e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 119e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 120e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: additional flag bits. 121e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 1223e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav public static final int PROTECTION_MASK_FLAGS = 0xff0; 123e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 124e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 1252ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * The level of access this permission is protecting, as per 1262ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#protectionLevel}. Values may be 1272ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_NORMAL}, {@link #PROTECTION_DANGEROUS}, or 1282ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. May also include the additional 1292ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * flags {@link #PROTECTION_FLAG_SYSTEM} or {@link #PROTECTION_FLAG_DEVELOPMENT} 1302ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * (which only make sense in combination with the base 1312ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. 1322ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1332ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int protectionLevel; 1342ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1352ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The group this permission is a part of, as per 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#permissionGroup}. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String group; 1402ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1412ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1422ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Flag for {@link #flags}, corresponding to <code>costsMoney</code> 1432ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * value of {@link android.R.attr#permissionFlags}. 1442ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1452ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public static final int FLAG_COSTS_MONEY = 1<<0; 1462ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1472ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1486d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov * Flag for {@link #protectionLevel}, corresponding 1496d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov * to the <code>hide</code> value of 1506d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov * {@link android.R.attr#permissionFlags}. 1516d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov * @hide 1526d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov */ 1536d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov public static final int PROTECTION_FLAG_HIDE = 1<<1; 1546d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov 1556d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov /** 1562ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Additional flags about this permission as given by 1572ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#permissionFlags}. 1582ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1592ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int flags; 1602ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A string resource identifier (in the package's resources) of this 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permission's description. From the "description" attribute or, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if not set, 0. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int descriptionRes; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description string provided in the AndroidManifest file, if any. You 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably don't want to use this, since it will be null if the description 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in a resource. You probably want 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PermissionInfo#loadDescription} instead. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedDescription; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 176e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 177e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static int fixProtectionLevel(int level) { 178e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { 179a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn level = PROTECTION_SIGNATURE | PROTECTION_FLAG_PRIVILEGED; 180e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 181e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return level; 182e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 183e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 184e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 185e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static String protectionToString(int level) { 186e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String protLevel = "????"; 187e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn switch (level&PROTECTION_MASK_BASE) { 188e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_DANGEROUS: 189e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "dangerous"; 190e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 191e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_NORMAL: 192e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "normal"; 193e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 194e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE: 195e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signature"; 196e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 197e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 198e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signatureOrSystem"; 199e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 200e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 201a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) { 202a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn protLevel += "|privileged"; 203e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 204e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { 205e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|development"; 206e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 20733f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_APPOP) != 0) { 20833f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn protLevel += "|appop"; 20933f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn } 210de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_PRE23) != 0) { 211de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn protLevel += "|pre23"; 212de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn } 213e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return protLevel; 214e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 215e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo() { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo(PermissionInfo orig) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(orig); 2212ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = orig.protectionLevel; 2222ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = orig.flags; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = orig.group; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = orig.descriptionRes; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = orig.nonLocalizedDescription; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the textual description of this permission. This 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will call back on the given PackageManager to load the description from 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the label can be loaded; usually 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a CharSequence containing the permission's description. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there is no description, null is returned. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadDescription(PackageManager pm) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalizedDescription != null) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalizedDescription; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descriptionRes != 0) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label = pm.getText(packageName, descriptionRes, null); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (label != null) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return label; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionInfo{" 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + name + "}"; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int parcelableFlags) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, parcelableFlags); 2642ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(protectionLevel); 2652ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(flags); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(group); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(descriptionRes); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<PermissionInfo> CREATOR = 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<PermissionInfo>() { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo createFromParcel(Parcel source) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo(source); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo[] newArray(int size) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo[size]; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionInfo(Parcel source) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 2832ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = source.readInt(); 2842ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = source.readInt(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = source.readString(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = source.readInt(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 290