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 /** 7233f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn * Additional flag for {@link #protectionLevel}, corresponding 73e9b78fdbbef558f5e84f88397daf990dcc2e29cbJeff Sharkey * to the <code>appop</code> value of 7433f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn * {@link android.R.attr#protectionLevel}. 7533f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn */ 7633f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn public static final int PROTECTION_FLAG_APPOP = 0x40; 7733f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn 7833f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn /** 79e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: the basic protection type. 80e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 81e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_MASK_BASE = 0xf; 82e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 83e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 84e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * Mask for {@link #protectionLevel}: additional flag bits. 85e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn */ 86e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static final int PROTECTION_MASK_FLAGS = 0xf0; 87e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 88e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** 892ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * The level of access this permission is protecting, as per 902ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#protectionLevel}. Values may be 912ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_NORMAL}, {@link #PROTECTION_DANGEROUS}, or 922ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. May also include the additional 932ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * flags {@link #PROTECTION_FLAG_SYSTEM} or {@link #PROTECTION_FLAG_DEVELOPMENT} 942ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * (which only make sense in combination with the base 952ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. 962ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 972ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int protectionLevel; 982ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 992ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The group this permission is a part of, as per 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#permissionGroup}. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String group; 1042ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1052ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1062ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Flag for {@link #flags}, corresponding to <code>costsMoney</code> 1072ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * value of {@link android.R.attr#permissionFlags}. 1082ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1092ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public static final int FLAG_COSTS_MONEY = 1<<0; 1102ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1112ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn /** 1122ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * Additional flags about this permission as given by 1132ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn * {@link android.R.attr#permissionFlags}. 1142ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn */ 1152ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn public int flags; 1162ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A string resource identifier (in the package's resources) of this 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permission's description. From the "description" attribute or, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if not set, 0. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int descriptionRes; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description string provided in the AndroidManifest file, if any. You 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably don't want to use this, since it will be null if the description 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in a resource. You probably want 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PermissionInfo#loadDescription} instead. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedDescription; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 132e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 133e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static int fixProtectionLevel(int level) { 134e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { 135e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn level = PROTECTION_SIGNATURE | PROTECTION_FLAG_SYSTEM; 136e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 137e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return level; 138e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 139e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 140e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 141e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static String protectionToString(int level) { 142e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String protLevel = "????"; 143e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn switch (level&PROTECTION_MASK_BASE) { 144e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_DANGEROUS: 145e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "dangerous"; 146e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 147e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_NORMAL: 148e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "normal"; 149e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 150e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE: 151e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signature"; 152e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 153e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 154e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signatureOrSystem"; 155e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 156e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 157e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) { 158e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|system"; 159e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 160e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { 161e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|development"; 162e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 16333f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_APPOP) != 0) { 16433f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn protLevel += "|appop"; 16533f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn } 166e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return protLevel; 167e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 168e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo() { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo(PermissionInfo orig) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(orig); 1742ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = orig.protectionLevel; 1752ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = orig.flags; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = orig.group; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = orig.descriptionRes; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = orig.nonLocalizedDescription; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the textual description of this permission. This 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will call back on the given PackageManager to load the description from 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the label can be loaded; usually 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a CharSequence containing the permission's description. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there is no description, null is returned. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadDescription(PackageManager pm) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalizedDescription != null) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalizedDescription; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descriptionRes != 0) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label = pm.getText(packageName, descriptionRes, null); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (label != null) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return label; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionInfo{" 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + name + "}"; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int parcelableFlags) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, parcelableFlags); 2172ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(protectionLevel); 2182ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn dest.writeInt(flags); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(group); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(descriptionRes); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<PermissionInfo> CREATOR = 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<PermissionInfo>() { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo createFromParcel(Parcel source) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo(source); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo[] newArray(int size) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo[size]; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionInfo(Parcel source) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 2362ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn protectionLevel = source.readInt(); 2372ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn flags = source.readInt(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = source.readString(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = source.readInt(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 243