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 /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * System-level value for {@link #protectionLevel}, corresponding 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the <code>signatureOrSystem</code> value of 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#protectionLevel}. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 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 59e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * to the <code>system</code> value of 60e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * {@link android.R.attr#protectionLevel}. 61e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 62e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_FLAG_SYSTEM = 0x10; 63e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 64e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 65e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 66e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * to the <code>development</code> value of 67e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * {@link android.R.attr#protectionLevel}. 68e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 69e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_FLAG_DEVELOPMENT = 0x20; 70e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 71e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 72e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: the basic protection type. 73e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 74e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_MASK_BASE = 0xf; 75e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 76e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 77e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: additional flag bits. 78e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 79e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_MASK_FLAGS = 0xf0; 80e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 81e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 822ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * The level of access this permission is protecting, as per 832ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#protectionLevel}. Values may be 842ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_NORMAL}, {@link #PROTECTION_DANGEROUS}, or 852ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. May also include the additional 862ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * flags {@link #PROTECTION_FLAG_SYSTEM} or {@link #PROTECTION_FLAG_DEVELOPMENT} 872ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * (which only make sense in combination with the base 882ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. 892ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 902ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int protectionLevel; 912ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 922ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The group this permission is a part of, as per 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#permissionGroup}. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String group; 972ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 982ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 992ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Flag for {@link #flags}, corresponding to <code>costsMoney</code> 1002ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * value of {@link android.R.attr#permissionFlags}. 1012ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1022ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public static final int FLAG_COSTS_MONEY = 1<<0; 1032ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1042ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1052ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Additional flags about this permission as given by 1062ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#permissionFlags}. 1072ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1082ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int flags; 1092ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A string resource identifier (in the package's resources) of this 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permission's description. From the "description" attribute or, 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if not set, 0. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int descriptionRes; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description string provided in the AndroidManifest file, if any. You 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably don't want to use this, since it will be null if the description 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in a resource. You probably want 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PermissionInfo#loadDescription} instead. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedDescription; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 125e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 126e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static int fixProtectionLevel(int level) { 127e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { 128e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn level = PROTECTION_SIGNATURE | PROTECTION_FLAG_SYSTEM; 129e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 130e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return level; 131e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 132e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 133e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 134e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static String protectionToString(int level) { 135e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String protLevel = "????"; 136e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn switch (level&PROTECTION_MASK_BASE) { 137e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_DANGEROUS: 138e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "dangerous"; 139e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 140e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_NORMAL: 141e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "normal"; 142e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 143e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE: 144e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signature"; 145e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 146e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 147e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signatureOrSystem"; 148e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 149e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 150e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) { 151e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|system"; 152e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 153e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { 154e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|development"; 155e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 156e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return protLevel; 157e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 158e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo() { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo(PermissionInfo orig) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(orig); 1642ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = orig.protectionLevel; 1652ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = orig.flags; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = orig.group; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = orig.descriptionRes; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = orig.nonLocalizedDescription; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the textual description of this permission. This 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will call back on the given PackageManager to load the description from 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the label can be loaded; usually 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a CharSequence containing the permission's description. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there is no description, null is returned. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadDescription(PackageManager pm) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalizedDescription != null) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalizedDescription; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descriptionRes != 0) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label = pm.getText(packageName, descriptionRes, null); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (label != null) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return label; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionInfo{" 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + name + "}"; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int parcelableFlags) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, parcelableFlags); 2072ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(protectionLevel); 2082ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(flags); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(group); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(descriptionRes); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<PermissionInfo> CREATOR = 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<PermissionInfo>() { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo createFromParcel(Parcel source) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo(source); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo[] newArray(int size) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo[size]; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionInfo(Parcel source) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 2262ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = source.readInt(); 2272ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = source.readInt(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = source.readString(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = source.readInt(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 233