1d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/*
2d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn *
4d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * you may not use this file except in compliance with the License.
6d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * You may obtain a copy of the License at
7d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn *
8d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn *
10d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * See the License for the specific language governing permissions and
14d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * limitations under the License.
15d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */
16d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
1787bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornpackage android.app.admin;
18d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
19d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport org.xmlpull.v1.XmlPullParser;
20d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
2121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport org.xmlpull.v1.XmlSerializer;
22d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
23f85c97741485a53c1cca5d9d6192a9436d91a044Xiaohui Chenimport android.annotation.NonNull;
24d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.ComponentName;
25d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Context;
26d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ActivityInfo;
278aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.content.pm.ApplicationInfo;
28d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.PackageManager;
29d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ResolveInfo;
3020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
3120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources;
32d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.TypedArray;
33d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.XmlResourceParser;
348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.content.res.Resources.NotFoundException;
35d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.graphics.drawable.Drawable;
36d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcel;
37d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcelable;
38d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.AttributeSet;
398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.Log;
40d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Printer;
418aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.SparseArray;
42d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Xml;
43d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
44d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport java.io.IOException;
458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport java.util.ArrayList;
468aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport java.util.HashMap;
47d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
48d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/**
49d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * This class is used to specify meta information of a device administrator
50d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * component.
51d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */
52d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornpublic final class DeviceAdminInfo implements Parcelable {
53d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    static final String TAG = "DeviceAdminInfo";
54b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
55d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
565c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * A type of policy that this device admin can use: device owner meta-policy
575c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * for an admin that is designated as owner of the device.
585c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     *
595c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * @hide
605c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     */
615c921daa72c6915d036a03b3bda91725a3e30539Robin Lee    public static final int USES_POLICY_DEVICE_OWNER = -2;
625c921daa72c6915d036a03b3bda91725a3e30539Robin Lee
635c921daa72c6915d036a03b3bda91725a3e30539Robin Lee    /**
645c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * A type of policy that this device admin can use: profile owner meta-policy
655c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * for admins that have been installed as owner of some user profile.
665c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     *
675c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     * @hide
685c921daa72c6915d036a03b3bda91725a3e30539Robin Lee     */
695c921daa72c6915d036a03b3bda91725a3e30539Robin Lee    public static final int USES_POLICY_PROFILE_OWNER = -1;
705c921daa72c6915d036a03b3bda91725a3e30539Robin Lee
715c921daa72c6915d036a03b3bda91725a3e30539Robin Lee    /**
728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: limit the passwords
739327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn     * that the user can select, via {@link DevicePolicyManager#setPasswordQuality}
74254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn     * and {@link DevicePolicyManager#setPasswordMinimumLength}.
75b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
768aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "limit-password"
778aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
788aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
798aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_LIMIT_PASSWORD = 0;
80b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
818aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to watch login
83ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn     * attempts from the user, via {@link DeviceAdminReceiver#ACTION_PASSWORD_FAILED},
84ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn     * {@link DeviceAdminReceiver#ACTION_PASSWORD_SUCCEEDED}, and
858aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#getCurrentFailedPasswordAttempts}.
86b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
878aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "watch-login"
888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
898aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_WATCH_LOGIN = 1;
918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to reset the
948aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * user's password via
958aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#resetPassword}.
96b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
978aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "reset-password"
988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
1008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_RESET_PASSWORD = 2;
1018aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
1028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
103315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn     * A type of policy that this device admin can use: able to force the device
104315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn     * to lock via{@link DevicePolicyManager#lockNow} or limit the
1058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * maximum lock timeout for the device via
1068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#setMaximumTimeToLock}.
107b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "force-lock"
1098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
1108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
111315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn    public static final int USES_POLICY_FORCE_LOCK = 3;
1128aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
1138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
1148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to factory
1158aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * reset the device, erasing all of the user's data, via
1168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#wipeData}.
117b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1188aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "wipe-data"
1198aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
1208aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
121315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn    public static final int USES_POLICY_WIPE_DATA = 4;
1228aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
12369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor    /**
12469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * A type of policy that this device admin can use: able to specify the
12569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * device Global Proxy, via {@link DevicePolicyManager#setGlobalProxy}.
12669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     *
12769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * <p>To control this policy, the device admin must have a "set-global-proxy"
12869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * tag in the "uses-policies" section of its meta-data.
129d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler     * @hide
13069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     */
13169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor    public static final int USES_POLICY_SETS_GLOBAL_PROXY = 5;
13269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor
133a4e28d181942018ba8759989799a28fa88764ce3Jim Miller    /**
134a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * A type of policy that this device admin can use: force the user to
135a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * change their password after an administrator-defined time limit.
136a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     *
137a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * <p>To control this policy, the device admin must have an "expire-password"
138a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * tag in the "uses-policies" section of its meta-data.
139a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     */
140a4e28d181942018ba8759989799a28fa88764ce3Jim Miller    public static final int USES_POLICY_EXPIRE_PASSWORD = 6;
141a4e28d181942018ba8759989799a28fa88764ce3Jim Miller
1427b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler    /**
1437b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * A type of policy that this device admin can use: require encryption of stored data.
1447b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     *
1457b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * <p>To control this policy, the device admin must have a "encrypted-storage"
1467b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * tag in the "uses-policies" section of its meta-data.
1477b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     */
1487b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler    public static final int USES_ENCRYPTED_STORAGE = 7;
1497b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler
1502447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo    /**
1512447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * A type of policy that this device admin can use: disables use of all device cameras.
1522447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     *
1532447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * <p>To control this policy, the device admin must have a "disable-camera"
1542447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * tag in the "uses-policies" section of its meta-data.
1552447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     */
1562447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo    public static final int USES_POLICY_DISABLE_CAMERA = 8;
1572447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo
158b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller    /**
1597ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy     * A type of policy that this device admin can use: disables use of keyguard features.
160b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1617ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy     * <p>To control this policy, the device admin must have a "disable-keyguard-features"
162b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     * tag in the "uses-policies" section of its meta-data.
163b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     */
16448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller    public static final int USES_POLICY_DISABLE_KEYGUARD_FEATURES = 9;
165b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
1668aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /** @hide */
1678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static class PolicyInfo {
1688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        public final int ident;
169b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final String tag;
170b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int label;
171b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int description;
172b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int labelForSecondaryUsers;
173b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int descriptionForSecondaryUsers;
174b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov
175b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public PolicyInfo(int ident, String tag, int label, int description) {
176b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this(ident, tag, label, description, label, description);
177b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        }
178b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov
179b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public PolicyInfo(int ident, String tag, int label, int description,
180b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                int labelForSecondaryUsers, int descriptionForSecondaryUsers) {
181b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.ident = ident;
182b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.tag = tag;
183b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.label = label;
184b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.description = description;
185b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.labelForSecondaryUsers = labelForSecondaryUsers;
186b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.descriptionForSecondaryUsers = descriptionForSecondaryUsers;
1878aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
1888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
189b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
1908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    static ArrayList<PolicyInfo> sPoliciesDisplayOrder = new ArrayList<PolicyInfo>();
1918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static HashMap<String, Integer> sKnownPolicies = new HashMap<String, Integer>();
1928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static SparseArray<PolicyInfo> sRevKnownPolicies = new SparseArray<PolicyInfo>();
193b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
1948aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static {
1958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WIPE_DATA, "wipe-data",
1968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_wipeData,
197b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_wipeData,
198b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policylab_wipeData_secondaryUser,
199b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_wipeData_secondaryUser
200b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                ));
2018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_RESET_PASSWORD, "reset-password",
2028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_resetPassword,
2038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_resetPassword));
2048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_LIMIT_PASSWORD, "limit-password",
2058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_limitPassword,
2068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_limitPassword));
2078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WATCH_LOGIN, "watch-login",
2088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_watchLogin,
209b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_watchLogin,
210b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policylab_watchLogin,
211b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_watchLogin_secondaryUser
212b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        ));
2138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_FORCE_LOCK, "force-lock",
2148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_forceLock,
2158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_forceLock));
21669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_SETS_GLOBAL_PROXY, "set-global-proxy",
21769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor                com.android.internal.R.string.policylab_setGlobalProxy,
21869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor                com.android.internal.R.string.policydesc_setGlobalProxy));
219a4e28d181942018ba8759989799a28fa88764ce3Jim Miller        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_EXPIRE_PASSWORD, "expire-password",
220a4e28d181942018ba8759989799a28fa88764ce3Jim Miller                com.android.internal.R.string.policylab_expirePassword,
221a4e28d181942018ba8759989799a28fa88764ce3Jim Miller                com.android.internal.R.string.policydesc_expirePassword));
2227b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler        sPoliciesDisplayOrder.add(new PolicyInfo(USES_ENCRYPTED_STORAGE, "encrypted-storage",
2237b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler                com.android.internal.R.string.policylab_encryptedStorage,
2247b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler                com.android.internal.R.string.policydesc_encryptedStorage));
2252447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_DISABLE_CAMERA, "disable-camera",
2262447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo                com.android.internal.R.string.policylab_disableCamera,
2272447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo                com.android.internal.R.string.policydesc_disableCamera));
228b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller        sPoliciesDisplayOrder.add(new PolicyInfo(
22948b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                USES_POLICY_DISABLE_KEYGUARD_FEATURES, "disable-keyguard-features",
23048b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                com.android.internal.R.string.policylab_disableKeyguardFeatures,
23148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                com.android.internal.R.string.policydesc_disableKeyguardFeatures));
232a4e28d181942018ba8759989799a28fa88764ce3Jim Miller
2338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        for (int i=0; i<sPoliciesDisplayOrder.size(); i++) {
2348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            PolicyInfo pi = sPoliciesDisplayOrder.get(i);
2358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            sRevKnownPolicies.put(pi.ident, pi);
2368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            sKnownPolicies.put(pi.tag, pi.ident);
2378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
2388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
239b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
2408aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
241d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * The BroadcastReceiver that implements this device admin component.
242d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
243889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    final ActivityInfo mActivityInfo;
244b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
245d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
24687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * Whether this should be visible to the user.
24787bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     */
24887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    boolean mVisible;
249b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
25087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    /**
2518aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * The policies this administrator needs access to.
2528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
2538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    int mUsesPolicies;
254b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
255889c0880661bda16e3759995e03766ddf0350732Makoto Onuki
256889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    /**
257889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * Constructor.
258889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     *
259889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param context The Context in which we are parsing the device admin.
260889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param resolveInfo The ResolveInfo returned from the package manager about
261889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * this device admin's component.
262889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     */
263889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    public DeviceAdminInfo(Context context, ResolveInfo resolveInfo)
264889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            throws XmlPullParserException, IOException {
265889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        this(context, resolveInfo.activityInfo);
266889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    }
2678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
268d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Constructor.
269b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
270d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param context The Context in which we are parsing the device admin.
271889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param activityInfo The ActivityInfo returned from the package manager about
272d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * this device admin's component.
273889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     *
274889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @hide
275d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
276889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    public DeviceAdminInfo(Context context, ActivityInfo activityInfo)
277d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            throws XmlPullParserException, IOException {
278889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo = activityInfo;
279b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
280d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        PackageManager pm = context.getPackageManager();
281b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
282d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        XmlResourceParser parser = null;
283d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        try {
284889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            parser = mActivityInfo.loadXmlMetaData(pm, DeviceAdminReceiver.DEVICE_ADMIN_META_DATA);
285d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (parser == null) {
286d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                throw new XmlPullParserException("No "
287ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn                        + DeviceAdminReceiver.DEVICE_ADMIN_META_DATA + " meta-data");
288d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
289b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
290889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            Resources res = pm.getResourcesForApplication(mActivityInfo.applicationInfo);
291b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
292d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
293b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
294d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            int type;
295d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                    && type != XmlPullParser.START_TAG) {
297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
298b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            String nodeName = parser.getName();
300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (!"device-admin".equals(nodeName)) {
301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                throw new XmlPullParserException(
302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                        "Meta-data does not start with device-admin tag");
303d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
304b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
30520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            TypedArray sa = res.obtainAttributes(attrs,
30687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn                    com.android.internal.R.styleable.DeviceAdmin);
307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
30887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn            mVisible = sa.getBoolean(
30987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn                    com.android.internal.R.styleable.DeviceAdmin_visible, true);
310b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
311d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            sa.recycle();
312b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
3138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            int outerDepth = parser.getDepth();
3148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
3158aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                   && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3178aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    continue;
3188aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                }
3198aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String tagName = parser.getName();
3208aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                if (tagName.equals("uses-policies")) {
3218aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    int innerDepth = parser.getDepth();
3228aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
3238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                           && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
3248aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3258aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            continue;
3268aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        }
3278aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        String policyName = parser.getName();
3288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        Integer val = sKnownPolicies.get(policyName);
3298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        if (val != null) {
3308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            mUsesPolicies |= 1 << val.intValue();
3318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        } else {
3328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            Log.w(TAG, "Unknown tag under uses-policies of "
3338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                                    + getComponent() + ": " + policyName);
3348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        }
3358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    }
3368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                }
3378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
33820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        } catch (NameNotFoundException e) {
33920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            throw new XmlPullParserException(
340889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                    "Unable to create context for: " + mActivityInfo.packageName);
341d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        } finally {
342d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (parser != null) parser.close();
343d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
344d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
345d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
346d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    DeviceAdminInfo(Parcel source) {
347889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo = ActivityInfo.CREATOR.createFromParcel(source);
3488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        mUsesPolicies = source.readInt();
349d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
350b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
351d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
352d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the .apk package that implements this device admin.
353d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
354d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String getPackageName() {
355889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.packageName;
356d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
357b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
358d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
359d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the class name of the receiver component that implements
360d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * this device admin.
361d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
362d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String getReceiverName() {
363889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.name;
364d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
365d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
366d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
367d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the raw information about the receiver implementing this
368d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * device admin.  Do not modify the returned object.
369d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
370d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public ActivityInfo getActivityInfo() {
371889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo;
372d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
373d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
374d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
375d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the component of the receiver that implements this device admin.
376d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
377f85c97741485a53c1cca5d9d6192a9436d91a044Xiaohui Chen    @NonNull
378d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public ComponentName getComponent() {
379889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return new ComponentName(mActivityInfo.packageName,
380889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                mActivityInfo.name);
381d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
382b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
383d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
384d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Load the user-displayed label for this device admin.
385b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
386d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
387d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * resources.
388d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
389d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public CharSequence loadLabel(PackageManager pm) {
390889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.loadLabel(pm);
391d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
392b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
393d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
3948aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Load user-visible description associated with this device admin.
395b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
3968aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
3978aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * resources.
3988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
3998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public CharSequence loadDescription(PackageManager pm) throws NotFoundException {
400889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        if (mActivityInfo.descriptionRes != 0) {
401889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            return pm.getText(mActivityInfo.packageName,
402889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                    mActivityInfo.descriptionRes, mActivityInfo.applicationInfo);
4038aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
4048aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        throw new NotFoundException();
4058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
406b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
408d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Load the user-displayed icon for this device admin.
409b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
410d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
411d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * resources.
412d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
413d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public Drawable loadIcon(PackageManager pm) {
414889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.loadIcon(pm);
415d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
416b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4178aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
41887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * Returns whether this device admin would like to be visible to the
41987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * user, even when it is not enabled.
42087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     */
42187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    public boolean isVisible() {
42287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn        return mVisible;
42387bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    }
424b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
42587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    /**
4268aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Return true if the device admin has requested that it be able to use
4278aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * the given policy control.  The possible policy identifier inputs are:
4288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link #USES_POLICY_LIMIT_PASSWORD}, {@link #USES_POLICY_WATCH_LOGIN},
429dc2df328b3c854c7b787bf5298df0c686584125dRaphael     * {@link #USES_POLICY_RESET_PASSWORD}, {@link #USES_POLICY_FORCE_LOCK},
430d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler     * {@link #USES_POLICY_WIPE_DATA},
4312447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * {@link #USES_POLICY_EXPIRE_PASSWORD}, {@link #USES_ENCRYPTED_STORAGE},
4322447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * {@link #USES_POLICY_DISABLE_CAMERA}.
4338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
4348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public boolean usesPolicy(int policyIdent) {
4358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return (mUsesPolicies & (1<<policyIdent)) != 0;
4368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
437b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
4398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Return the XML tag name for the given policy identifier.  Valid identifiers
4408aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * are as per {@link #usesPolicy(int)}.  If the given identifier is not
4418aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * known, null is returned.
4428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
4438aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public String getTagForPolicy(int policyIdent) {
4448aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return sRevKnownPolicies.get(policyIdent).tag;
4458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
446b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4478aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /** @hide */
4488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public ArrayList<PolicyInfo> getUsedPolicies() {
4498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        ArrayList<PolicyInfo> res = new ArrayList<PolicyInfo>();
4508ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        for (int i=0; i<sPoliciesDisplayOrder.size(); i++) {
4518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            PolicyInfo pi = sPoliciesDisplayOrder.get(i);
4528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (usesPolicy(pi.ident)) {
4538ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                res.add(pi);
4548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
4558aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
4568aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return res;
4578aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
458b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
45921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /** @hide */
46021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public void writePoliciesToXml(XmlSerializer out)
46121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            throws IllegalArgumentException, IllegalStateException, IOException {
46221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        out.attribute(null, "flags", Integer.toString(mUsesPolicies));
46321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
464b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
46521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /** @hide */
46621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public void readPoliciesFromXml(XmlPullParser parser)
46721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            throws XmlPullParserException, IOException {
46821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mUsesPolicies = Integer.parseInt(
46921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                parser.getAttributeValue(null, "flags"));
47021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
471b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
472d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public void dump(Printer pw, String prefix) {
473d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        pw.println(prefix + "Receiver:");
474889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo.dump(pw, prefix + "  ");
475d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
476b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
477d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    @Override
478d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String toString() {
479889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return "DeviceAdminInfo{" + mActivityInfo.name + "}";
480d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
481d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
482d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
483d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Used to package this object into a {@link Parcel}.
484b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
485d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param dest The {@link Parcel} to be written.
486d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param flags The flags used for parceling.
487d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
488d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
489889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo.writeToParcel(dest, flags);
4908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        dest.writeInt(mUsesPolicies);
491d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
492d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
493d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
494d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Used to make this class parcelable.
495d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
496d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public static final Parcelable.Creator<DeviceAdminInfo> CREATOR =
497d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            new Parcelable.Creator<DeviceAdminInfo>() {
498d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        public DeviceAdminInfo createFromParcel(Parcel source) {
499d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return new DeviceAdminInfo(source);
500d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
501d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
502d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        public DeviceAdminInfo[] newArray(int size) {
503d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return new DeviceAdminInfo[size];
504d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
505d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    };
506d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
507d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public int describeContents() {
508d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        return 0;
509d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
510d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn}
511