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 /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The group this permission is a part of, as per 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#permissionGroup}. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String group; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A string resource identifier (in the package's resources) of this 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permission's description. From the "description" attribute or, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if not set, 0. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int descriptionRes; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description string provided in the AndroidManifest file, if any. You 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably don't want to use this, since it will be null if the description 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in a resource. You probably want 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PermissionInfo#loadDescription} instead. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedDescription; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The level of access this permission is protecting, as per 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#protectionLevel}. Values may be 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PROTECTION_NORMAL}, {@link #PROTECTION_DANGEROUS}, or 106e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * {@link #PROTECTION_SIGNATURE}. May also include the additional 107e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * flags {@link #PROTECTION_FLAG_SYSTEM} or {@link #PROTECTION_FLAG_DEVELOPMENT} 108e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn * (which only make sense in combination with the base 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PROTECTION_SIGNATURE}. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int protectionLevel; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 114e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static int fixProtectionLevel(int level) { 115e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { 116e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn level = PROTECTION_SIGNATURE | PROTECTION_FLAG_SYSTEM; 117e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 118e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return level; 119e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 120e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 121e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn /** @hide */ 122e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn public static String protectionToString(int level) { 123e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String protLevel = "????"; 124e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn switch (level&PROTECTION_MASK_BASE) { 125e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_DANGEROUS: 126e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "dangerous"; 127e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 128e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_NORMAL: 129e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "normal"; 130e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 131e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE: 132e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signature"; 133e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 134e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 135e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel = "signatureOrSystem"; 136e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn break; 137e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 138e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) { 139e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|system"; 140e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 141e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { 142e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn protLevel += "|development"; 143e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 144e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return protLevel; 145e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 146e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo() { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo(PermissionInfo orig) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(orig); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = orig.group; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = orig.descriptionRes; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protectionLevel = orig.protectionLevel; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = orig.nonLocalizedDescription; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the textual description of this permission. This 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will call back on the given PackageManager to load the description from 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the label can be loaded; usually 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a CharSequence containing the permission's description. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there is no description, null is returned. 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence loadDescription(PackageManager pm) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalizedDescription != null) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalizedDescription; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descriptionRes != 0) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence label = pm.getText(packageName, descriptionRes, null); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (label != null) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return label; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionInfo{" 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + name + "}"; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int parcelableFlags) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, parcelableFlags); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(group); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(descriptionRes); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(protectionLevel); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<PermissionInfo> CREATOR = 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<PermissionInfo>() { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo createFromParcel(Parcel source) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo(source); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo[] newArray(int size) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PermissionInfo[size]; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionInfo(Parcel source) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = source.readString(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptionRes = source.readInt(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protectionLevel = source.readInt(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 218