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
19700feef8a60e06784d28d1db9502e650df854cadMakoto Onukiimport android.annotation.IntDef;
202a1376d9dfb362a18ba110d8e172f96021f1d879Svet Ganovimport android.annotation.SystemApi;
212f24f039c38e3f83fe9f7d8a68ae096e6df6ccaaJiyong Parkimport android.annotation.TestApi;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26700feef8a60e06784d28d1db9502e650df854cadMakoto Onukiimport java.lang.annotation.Retention;
27700feef8a60e06784d28d1db9502e650df854cadMakoto Onukiimport java.lang.annotation.RetentionPolicy;
28700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Information you can retrieve about a particular security permission
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * known to the system.  This corresponds to information collected from the
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AndroidManifest.xml's <permission> tags.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PermissionInfo extends PackageItemInfo implements Parcelable {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A normal application value for {@link #protectionLevel}, corresponding
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the <code>normal</code> value of
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#protectionLevel}.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROTECTION_NORMAL = 0;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dangerous value for {@link #protectionLevel}, corresponding
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the <code>dangerous</code> value of
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#protectionLevel}.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROTECTION_DANGEROUS = 1;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * System-level value for {@link #protectionLevel}, corresponding
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the <code>signature</code> value of
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#protectionLevel}.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROTECTION_SIGNATURE = 2;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * @deprecated Use {@link #PROTECTION_SIGNATURE}|{@link #PROTECTION_FLAG_PRIVILEGED}
58a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * instead.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    @Deprecated
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    /** @hide */
64700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @IntDef(flag = false, prefix = { "PROTECTION_" }, value = {
65700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_NORMAL,
66700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_DANGEROUS,
67700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_SIGNATURE,
68700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_SIGNATURE_OR_SYSTEM,
69700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    })
70700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Retention(RetentionPolicy.SOURCE)
71700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    public @interface Protection {}
72700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
74e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * Additional flag for {@link #protectionLevel}, corresponding
75a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * to the <code>privileged</code> value of
76e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * {@link android.R.attr#protectionLevel}.
77e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     */
78a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    public static final int PROTECTION_FLAG_PRIVILEGED = 0x10;
79a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn
80a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    /**
81a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * @deprecated Old name for {@link #PROTECTION_FLAG_PRIVILEGED}, which
82a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * is now very confusing because it only applies to privileged apps, not all
83a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * apps on the system image.
84a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     */
85a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    @Deprecated
86e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    public static final int PROTECTION_FLAG_SYSTEM = 0x10;
87e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
88e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /**
89e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * Additional flag for {@link #protectionLevel}, corresponding
90e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * to the <code>development</code> value of
91e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * {@link android.R.attr#protectionLevel}.
92e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     */
93e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    public static final int PROTECTION_FLAG_DEVELOPMENT = 0x20;
94e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
95e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /**
9633f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn     * Additional flag for {@link #protectionLevel}, corresponding
97e9b78fdbbef558f5e84f88397daf990dcc2e29cbJeff Sharkey     * to the <code>appop</code> value of
9833f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn     * {@link android.R.attr#protectionLevel}.
9933f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn     */
10033f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn    public static final int PROTECTION_FLAG_APPOP = 0x40;
10133f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn
10233f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn    /**
103de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn     * Additional flag for {@link #protectionLevel}, corresponding
104de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn     * to the <code>pre23</code> value of
105de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn     * {@link android.R.attr#protectionLevel}.
106de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn     */
107de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn    public static final int PROTECTION_FLAG_PRE23 = 0x80;
108de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn
109de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn    /**
1103e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * Additional flag for {@link #protectionLevel}, corresponding
1113e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * to the <code>installer</code> value of
1123e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * {@link android.R.attr#protectionLevel}.
1133e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     */
1143e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav    public static final int PROTECTION_FLAG_INSTALLER = 0x100;
1153e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav
1163e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav    /**
1173e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * Additional flag for {@link #protectionLevel}, corresponding
1183e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * to the <code>verifier</code> value of
1193e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     * {@link android.R.attr#protectionLevel}.
1203e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav     */
1213e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav    public static final int PROTECTION_FLAG_VERIFIER = 0x200;
1223e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav
1233e7d977ff7c743713f0ad6336a039d7760ba47d1Svetoslav    /**
124a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * Additional flag for {@link #protectionLevel}, corresponding
125a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * to the <code>preinstalled</code> value of
126a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     * {@link android.R.attr#protectionLevel}.
127a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn     */
128a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    public static final int PROTECTION_FLAG_PREINSTALLED = 0x400;
129a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn
130a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn    /**
131b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner     * Additional flag for {@link #protectionLevel}, corresponding
132b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner     * to the <code>setup</code> value of
133b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner     * {@link android.R.attr#protectionLevel}.
134b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner     */
135b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner    public static final int PROTECTION_FLAG_SETUP = 0x800;
136b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner
137c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker    /**
138c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker     * Additional flag for {@link #protectionLevel}, corresponding
139c247fa136639dd07278b1954e5fba78ade60614cTodd Kennedy     * to the <code>instant</code> value of
140c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker     * {@link android.R.attr#protectionLevel}.
141c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker     */
142c247fa136639dd07278b1954e5fba78ade60614cTodd Kennedy    public static final int PROTECTION_FLAG_INSTANT = 0x1000;
143c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker
144b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner    /**
145a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker     * Additional flag for {@link #protectionLevel}, corresponding
146a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker     * to the <code>runtime</code> value of
147a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker     * {@link android.R.attr#protectionLevel}.
148a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker     */
149a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker    public static final int PROTECTION_FLAG_RUNTIME_ONLY = 0x2000;
150a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker
151a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker    /**
152087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     * Additional flag for {@link #protectionLevel}, corresponding
153087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     * to the <code>oem</code> value of
154087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     * {@link android.R.attr#protectionLevel}.
155087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     *
156087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     * @hide
157087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov     */
158087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov    @SystemApi
159087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov    public static final int PROTECTION_FLAG_OEM = 0x4000;
160087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov
161087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov    /**
162002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     * Additional flag for {${link #protectionLevel}, corresponding
163002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     * to the <code>vendorPrivileged</code> value of
164002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     * {@link android.R.attr#protectionLevel}.
165002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     *
166002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     * @hide
167002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park     */
1682f24f039c38e3f83fe9f7d8a68ae096e6df6ccaaJiyong Park    @TestApi
169002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park    public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 0x8000;
170002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park
171002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park    /**
172700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * Additional flag for {@link #protectionLevel}, corresponding
173700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * to the <code>text_classifier</code> value of
174700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * {@link android.R.attr#protectionLevel}.
175700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     *
176700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * @hide
177700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     */
178700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @SystemApi
179700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @TestApi
180700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000;
181700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
182700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    /** @hide */
183700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = {
184700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_PRIVILEGED,
185700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_SYSTEM,
186700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_DEVELOPMENT,
187700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_APPOP,
188700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_PRE23,
189700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_INSTALLER,
190700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_VERIFIER,
191700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_PREINSTALLED,
192700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_SETUP,
193700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_INSTANT,
194700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_RUNTIME_ONLY,
195700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_OEM,
196700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_VENDOR_PRIVILEGED,
197700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER,
198700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    })
199700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Retention(RetentionPolicy.SOURCE)
200700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    public @interface ProtectionFlags {}
201700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
202700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    /**
203e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * Mask for {@link #protectionLevel}: the basic protection type.
204700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     *
205700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * @deprecated Use #getProtection() instead.
206e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     */
207700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Deprecated
208e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    public static final int PROTECTION_MASK_BASE = 0xf;
209e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
210e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /**
211e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     * Mask for {@link #protectionLevel}: additional flag bits.
212700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     *
213700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * @deprecated Use #getProtectionFlags() instead.
214e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn     */
215700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Deprecated
216c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker    public static final int PROTECTION_MASK_FLAGS = 0xfff0;
217e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
218e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /**
2192ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     * The level of access this permission is protecting, as per
22051fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * {@link android.R.attr#protectionLevel}. Consists of
221700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * a base permission type and zero or more flags. Use the following functions
222700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * to extract them.
22351fbad5a7664812554491a89b604c10c00f84367Peter Visontay     *
22451fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * <pre>
225700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * int basePermissionType = permissionInfo.getProtection();
226700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * int permissionFlags = permissionInfo.getProtectionFlags();
22751fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * </pre>
22851fbad5a7664812554491a89b604c10c00f84367Peter Visontay     *
22951fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * <p></p>Base permission types are {@link #PROTECTION_NORMAL},
23051fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * {@link #PROTECTION_DANGEROUS}, {@link #PROTECTION_SIGNATURE}
23151fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * and the deprecated {@link #PROTECTION_SIGNATURE_OR_SYSTEM}.
23251fbad5a7664812554491a89b604c10c00f84367Peter Visontay     * Flags are listed under {@link android.R.attr#protectionLevel}.
233700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     *
234700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * @deprecated Use #getProtection() and #getProtectionFlags() instead.
2352ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     */
236700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Deprecated
2372ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    public int protectionLevel;
2382ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn
2392ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The group this permission is a part of, as per
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#permissionGroup}.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String group;
2442ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn
2452ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    /**
2462ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     * Flag for {@link #flags}, corresponding to <code>costsMoney</code>
2472ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     * value of {@link android.R.attr#permissionFlags}.
2482ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     */
2492ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    public static final int FLAG_COSTS_MONEY = 1<<0;
2502ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn
2512ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    /**
2522a1376d9dfb362a18ba110d8e172f96021f1d879Svet Ganov     * Flag for {@link #flags}, corresponding to <code>removed</code>
2533e0be7440bf40f5d81581077bc4f5f47e57b88b7Svet Ganov     * value of {@link android.R.attr#permissionFlags}.
2543e0be7440bf40f5d81581077bc4f5f47e57b88b7Svet Ganov     * @hide
2553e0be7440bf40f5d81581077bc4f5f47e57b88b7Svet Ganov     */
2562a1376d9dfb362a18ba110d8e172f96021f1d879Svet Ganov    @SystemApi
2572a1376d9dfb362a18ba110d8e172f96021f1d879Svet Ganov    public static final int FLAG_REMOVED = 1<<1;
2583e0be7440bf40f5d81581077bc4f5f47e57b88b7Svet Ganov
2593e0be7440bf40f5d81581077bc4f5f47e57b88b7Svet Ganov    /**
260cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn     * Flag for {@link #flags}, indicating that this permission has been
261cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn     * installed into the system's globally defined permissions.
2626d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov     */
263cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn    public static final int FLAG_INSTALLED = 1<<30;
2646d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov
2656d2c0e5ee2f717d4a5c00df08aca21c76eea8278Svetoslav Ganov    /**
2662ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     * Additional flags about this permission as given by
2672ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     * {@link android.R.attr#permissionFlags}.
2682ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn     */
2692ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn    public int flags;
2702ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A string resource identifier (in the package's resources) of this
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * permission's description.  From the "description" attribute or,
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if not set, 0.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int descriptionRes;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27927ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann     * A string resource identifier (in the package's resources) used to request the permissions.
28027ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann     * From the "request" attribute or, if not set, 0.
28127ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann     *
28227ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann     * @hide
28327ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann     */
28427ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann    @SystemApi
28527ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann    public int requestRes;
28627ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann
28727ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann    /**
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The description string provided in the AndroidManifest file, if any.  You
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * probably don't want to use this, since it will be null if the description
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is in a resource.  You probably want
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PermissionInfo#loadDescription} instead.
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence nonLocalizedDescription;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
295e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /** @hide */
296e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    public static int fixProtectionLevel(int level) {
297e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        if (level == PROTECTION_SIGNATURE_OR_SYSTEM) {
298a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn            level = PROTECTION_SIGNATURE | PROTECTION_FLAG_PRIVILEGED;
299e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
300002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park        if ((level & PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0
301002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park                && (level & PROTECTION_FLAG_PRIVILEGED) == 0) {
302002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park            // 'vendorPrivileged' must be 'privileged'. If not,
303002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park            // drop the vendorPrivileged.
304002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park            level = level & ~PROTECTION_FLAG_VENDOR_PRIVILEGED;
305002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park        }
306e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        return level;
307e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    }
308e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
309e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    /** @hide */
310e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    public static String protectionToString(int level) {
311e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        String protLevel = "????";
312087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        switch (level & PROTECTION_MASK_BASE) {
313e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            case PermissionInfo.PROTECTION_DANGEROUS:
314e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                protLevel = "dangerous";
315e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                break;
316e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            case PermissionInfo.PROTECTION_NORMAL:
317e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                protLevel = "normal";
318e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                break;
319e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            case PermissionInfo.PROTECTION_SIGNATURE:
320e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                protLevel = "signature";
321e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                break;
322e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM:
323e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                protLevel = "signatureOrSystem";
324e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                break;
325e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
326087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) {
327a90c8def2c6762bc6e5396b78c43e65e4b05079dDianne Hackborn            protLevel += "|privileged";
328e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
329087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
330e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            protLevel += "|development";
331e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
332087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_APPOP) != 0) {
33333f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn            protLevel += "|appop";
33433f5ddd1bea21296938f2cba196f95d223aa247cDianne Hackborn        }
335087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_PRE23) != 0) {
336de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn            protLevel += "|pre23";
337de15edaa9bf486a4050bb067317d313fd807bb10Dianne Hackborn        }
338087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0) {
339cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn            protLevel += "|installer";
340cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn        }
341087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0) {
342cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn            protLevel += "|verifier";
343cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn        }
344087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) {
345cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn            protLevel += "|preinstalled";
346cfbfafe1b9ca2fd135a4fb6b528b3829830803bfDianne Hackborn        }
347087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_SETUP) != 0) {
348b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner            protLevel += "|setup";
349b23346639b66783c1662fd8ffa5345ef5cef336cRussell Brenner        }
350087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0) {
351c247fa136639dd07278b1954e5fba78ade60614cTodd Kennedy            protLevel += "|instant";
352c19706a937abc5d025a59b354b3a0d89e7d62805Chad Brubaker        }
353087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0) {
354a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker            protLevel += "|runtime";
355a5d70a17ebd1b3ffe026879c5d9d96f04d10d4f2Chad Brubaker        }
356087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        if ((level & PermissionInfo.PROTECTION_FLAG_OEM) != 0) {
357087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov            protLevel += "|oem";
358087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        }
359002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park        if ((level & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0) {
360002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park            protLevel += "|vendorPrivileged";
361002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park        }
362700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki        if ((level & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0) {
363700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki            protLevel += "|textClassifier";
364700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki        }
365e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        return protLevel;
366e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    }
367e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PermissionInfo() {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PermissionInfo(PermissionInfo orig) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(orig);
3732ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        protectionLevel = orig.protectionLevel;
3742ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        flags = orig.flags;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = orig.group;
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        descriptionRes = orig.descriptionRes;
37727ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann        requestRes = orig.requestRes;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedDescription = orig.nonLocalizedDescription;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the textual description of this permission.  This
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the description from
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the label can be loaded; usually
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a CharSequence containing the permission's description.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If there is no description, null is returned.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence loadDescription(PackageManager pm) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalizedDescription != null) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalizedDescription;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (descriptionRes != 0) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence label = pm.getText(packageName, descriptionRes, null);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return label;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
405700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    /**
406700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * Return the base permission type.
407700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     */
408700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @Protection
409700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    public int getProtection() {
410700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki        return protectionLevel & PROTECTION_MASK_BASE;
411700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    }
412700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
413700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    /**
414700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     * Return the additional flags in {@link #protectionLevel}.
415700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki     */
416700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    @ProtectionFlags
417700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    public int getProtectionFlags() {
418700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki        return protectionLevel & ~PROTECTION_MASK_BASE;
419700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki    }
420700feef8a60e06784d28d1db9502e650df854cadMakoto Onuki
42191a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    @Override
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "PermissionInfo{"
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(this))
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " " + name + "}";
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42891a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    @Override
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43391a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    @Override
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int parcelableFlags) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.writeToParcel(dest, parcelableFlags);
4362ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        dest.writeInt(protectionLevel);
4372ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        dest.writeInt(flags);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(group);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(descriptionRes);
44027ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann        dest.writeInt(requestRes);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44491a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    /** @hide */
44591a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    public int calculateFootprint() {
44691a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        int size = name.length();
44791a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        if (nonLocalizedLabel != null) {
44891a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy            size += nonLocalizedLabel.length();
44991a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        }
45091a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        if (nonLocalizedDescription != null) {
45191a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy            size += nonLocalizedDescription.length();
45291a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        }
45391a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        return size;
45491a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    }
45591a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy
456c842393bc55509b094d3a71f164fcdbadf5c7997Todd Kennedy    /** @hide */
457c842393bc55509b094d3a71f164fcdbadf5c7997Todd Kennedy    public boolean isAppOp() {
458c842393bc55509b094d3a71f164fcdbadf5c7997Todd Kennedy        return (protectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0;
459c842393bc55509b094d3a71f164fcdbadf5c7997Todd Kennedy    }
460c842393bc55509b094d3a71f164fcdbadf5c7997Todd Kennedy
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<PermissionInfo> CREATOR =
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<PermissionInfo>() {
46391a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        @Override
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionInfo createFromParcel(Parcel source) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new PermissionInfo(source);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46791a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy        @Override
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionInfo[] newArray(int size) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new PermissionInfo[size];
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionInfo(Parcel source) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(source);
4752ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        protectionLevel = source.readInt();
4762ca2c8787130506d350d997c18bbc274faf88e37Dianne Hackborn        flags = source.readInt();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = source.readString();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        descriptionRes = source.readInt();
47927ffeb33fb60d4ee6a4c2dfd9391c8a6127dfc7cPhilip P. Moltmann        requestRes = source.readInt();
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
483