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
19f85c97741485a53c1cca5d9d6192a9436d91a044Xiaohui Chenimport android.annotation.NonNull;
20d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.ComponentName;
21d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Context;
22d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ActivityInfo;
23d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.PackageManager;
2420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
25c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport android.content.pm.ResolveInfo;
2620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources;
27c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport android.content.res.Resources.NotFoundException;
28d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.TypedArray;
29d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.XmlResourceParser;
30d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.graphics.drawable.Drawable;
31d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcel;
32d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcelable;
33c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport android.os.PersistableBundle;
34d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.AttributeSet;
358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.Log;
36d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Printer;
378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.SparseArray;
38d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Xml;
39d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
40c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport org.xmlpull.v1.XmlPullParser;
41c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport org.xmlpull.v1.XmlPullParserException;
42c8ee263d6ef37dae334e83dbe18654cff50d6153arangelovimport org.xmlpull.v1.XmlSerializer;
43c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov
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.
7817accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     *
7917accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * <p>This policy is deprecated for use by a device admin.  In future releases, it will
8017accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * only be possible for a device owner or profile owner to enforce constraints on user
8117accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * passwords.
828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
838aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_LIMIT_PASSWORD = 0;
84b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
858aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
868aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to watch login
87ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn     * attempts from the user, via {@link DeviceAdminReceiver#ACTION_PASSWORD_FAILED},
88ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn     * {@link DeviceAdminReceiver#ACTION_PASSWORD_SUCCEEDED}, and
898aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#getCurrentFailedPasswordAttempts}.
90b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "watch-login"
928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
948aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_WATCH_LOGIN = 1;
958aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
968aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
978aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to reset the
988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * user's password via
998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#resetPassword}.
100b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1018aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "reset-password"
1028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
1038aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
1048aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static final int USES_POLICY_RESET_PASSWORD = 2;
1058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
1068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
107315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn     * A type of policy that this device admin can use: able to force the device
108315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn     * to lock via{@link DevicePolicyManager#lockNow} or limit the
1098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * maximum lock timeout for the device via
1108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#setMaximumTimeToLock}.
111b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1128aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "force-lock"
1138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
1148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
115315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn    public static final int USES_POLICY_FORCE_LOCK = 3;
1168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
1178aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
1188aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A type of policy that this device admin can use: able to factory
1198aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * reset the device, erasing all of the user's data, via
1208aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link DevicePolicyManager#wipeData}.
121b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1228aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * <p>To control this policy, the device admin must have a "wipe-data"
1238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * tag in the "uses-policies" section of its meta-data.
1248aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
125315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn    public static final int USES_POLICY_WIPE_DATA = 4;
1268aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
12769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor    /**
12869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * A type of policy that this device admin can use: able to specify the
12969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * device Global Proxy, via {@link DevicePolicyManager#setGlobalProxy}.
13069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     *
13169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * <p>To control this policy, the device admin must have a "set-global-proxy"
13269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     * tag in the "uses-policies" section of its meta-data.
133d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler     * @hide
13469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor     */
13569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor    public static final int USES_POLICY_SETS_GLOBAL_PROXY = 5;
13669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor
137a4e28d181942018ba8759989799a28fa88764ce3Jim Miller    /**
138a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * A type of policy that this device admin can use: force the user to
139a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * change their password after an administrator-defined time limit.
140a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     *
141a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * <p>To control this policy, the device admin must have an "expire-password"
142a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     * tag in the "uses-policies" section of its meta-data.
14317accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     *
14417accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * <p>This policy is deprecated for use by a device admin.  In future releases, it will
14517accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * only be possible for a device owner or profile owner to enforce password expiry.
146a4e28d181942018ba8759989799a28fa88764ce3Jim Miller     */
147a4e28d181942018ba8759989799a28fa88764ce3Jim Miller    public static final int USES_POLICY_EXPIRE_PASSWORD = 6;
148a4e28d181942018ba8759989799a28fa88764ce3Jim Miller
1497b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler    /**
1507b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * A type of policy that this device admin can use: require encryption of stored data.
1517b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     *
1527b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * <p>To control this policy, the device admin must have a "encrypted-storage"
1537b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     * tag in the "uses-policies" section of its meta-data.
1547b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler     */
1557b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler    public static final int USES_ENCRYPTED_STORAGE = 7;
1567b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler
1572447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo    /**
1582447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * A type of policy that this device admin can use: disables use of all device cameras.
1592447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     *
1602447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * <p>To control this policy, the device admin must have a "disable-camera"
1612447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * tag in the "uses-policies" section of its meta-data.
16217accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     *
16317accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * <p>This policy is deprecated for use by a device admin.  In future releases, it will
16417accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * only be possible for a device owner or profile owner to disable use of the camera.
1652447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     */
1662447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo    public static final int USES_POLICY_DISABLE_CAMERA = 8;
1672447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo
168b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller    /**
1697ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy     * A type of policy that this device admin can use: disables use of keyguard features.
170b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
1717ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy     * <p>To control this policy, the device admin must have a "disable-keyguard-features"
172b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     * tag in the "uses-policies" section of its meta-data.
17317accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     *
17417accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * <p>This policy is deprecated for use by a device admin.  In future releases, it will
17517accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * only be possible for a device owner or profile owner to disable use of keyguard
17617accc16ee6c6c06050f0147b9af948ae7b011aaEric Sandness     * features.
177b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     */
17848b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller    public static final int USES_POLICY_DISABLE_KEYGUARD_FEATURES = 9;
179b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
1808aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /** @hide */
1818aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public static class PolicyInfo {
1828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        public final int ident;
183b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final String tag;
184b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int label;
185b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int description;
186b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int labelForSecondaryUsers;
187b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public final int descriptionForSecondaryUsers;
188b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov
189b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public PolicyInfo(int ident, String tag, int label, int description) {
190b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this(ident, tag, label, description, label, description);
191b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        }
192b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov
193b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        public PolicyInfo(int ident, String tag, int label, int description,
194b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                int labelForSecondaryUsers, int descriptionForSecondaryUsers) {
195b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.ident = ident;
196b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.tag = tag;
197b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.label = label;
198b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.description = description;
199b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.labelForSecondaryUsers = labelForSecondaryUsers;
200b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov            this.descriptionForSecondaryUsers = descriptionForSecondaryUsers;
2018aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
2028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
203b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
2048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    static ArrayList<PolicyInfo> sPoliciesDisplayOrder = new ArrayList<PolicyInfo>();
2058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static HashMap<String, Integer> sKnownPolicies = new HashMap<String, Integer>();
2068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static SparseArray<PolicyInfo> sRevKnownPolicies = new SparseArray<PolicyInfo>();
207b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
2088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    static {
2098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WIPE_DATA, "wipe-data",
2108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_wipeData,
211b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_wipeData,
212b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policylab_wipeData_secondaryUser,
213b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_wipeData_secondaryUser
214b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                ));
2158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_RESET_PASSWORD, "reset-password",
2168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_resetPassword,
2178ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_resetPassword));
2188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_LIMIT_PASSWORD, "limit-password",
2198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_limitPassword,
2208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_limitPassword));
2218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WATCH_LOGIN, "watch-login",
2228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_watchLogin,
223b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_watchLogin,
224b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policylab_watchLogin,
225b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov                com.android.internal.R.string.policydesc_watchLogin_secondaryUser
226b343d6db289fc9b8f5e0e36e707f01fb49cc49faFyodor Kupolov        ));
2278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_FORCE_LOCK, "force-lock",
2288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policylab_forceLock,
2298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                com.android.internal.R.string.policydesc_forceLock));
23069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_SETS_GLOBAL_PROXY, "set-global-proxy",
23169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor                com.android.internal.R.string.policylab_setGlobalProxy,
23269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor                com.android.internal.R.string.policydesc_setGlobalProxy));
233a4e28d181942018ba8759989799a28fa88764ce3Jim Miller        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_EXPIRE_PASSWORD, "expire-password",
234a4e28d181942018ba8759989799a28fa88764ce3Jim Miller                com.android.internal.R.string.policylab_expirePassword,
235a4e28d181942018ba8759989799a28fa88764ce3Jim Miller                com.android.internal.R.string.policydesc_expirePassword));
2367b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler        sPoliciesDisplayOrder.add(new PolicyInfo(USES_ENCRYPTED_STORAGE, "encrypted-storage",
2377b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler                com.android.internal.R.string.policylab_encryptedStorage,
2387b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler                com.android.internal.R.string.policydesc_encryptedStorage));
2392447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo        sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_DISABLE_CAMERA, "disable-camera",
2402447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo                com.android.internal.R.string.policylab_disableCamera,
2412447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo                com.android.internal.R.string.policydesc_disableCamera));
242b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller        sPoliciesDisplayOrder.add(new PolicyInfo(
24348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                USES_POLICY_DISABLE_KEYGUARD_FEATURES, "disable-keyguard-features",
24448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                com.android.internal.R.string.policylab_disableKeyguardFeatures,
24548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                com.android.internal.R.string.policydesc_disableKeyguardFeatures));
246a4e28d181942018ba8759989799a28fa88764ce3Jim Miller
2478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        for (int i=0; i<sPoliciesDisplayOrder.size(); i++) {
2488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            PolicyInfo pi = sPoliciesDisplayOrder.get(i);
2498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            sRevKnownPolicies.put(pi.ident, pi);
2508ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            sKnownPolicies.put(pi.tag, pi.ident);
2518aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
2528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
253b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
2548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * The BroadcastReceiver that implements this device admin component.
256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
257889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    final ActivityInfo mActivityInfo;
258b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
259d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
26087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * Whether this should be visible to the user.
26187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     */
26287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    boolean mVisible;
263b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
26487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    /**
2658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * The policies this administrator needs access to.
2668aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
2678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    int mUsesPolicies;
268b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
269c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov    /**
270c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     * Whether this administrator can be a target in an ownership transfer.
271c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     *
272c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     * @see DevicePolicyManager#transferOwnership(ComponentName, ComponentName, PersistableBundle)
273c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     */
274c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov    boolean mSupportsTransferOwnership;
275889c0880661bda16e3759995e03766ddf0350732Makoto Onuki
276889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    /**
277889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * Constructor.
278889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     *
279889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param context The Context in which we are parsing the device admin.
280889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param resolveInfo The ResolveInfo returned from the package manager about
281889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * this device admin's component.
282889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     */
283889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    public DeviceAdminInfo(Context context, ResolveInfo resolveInfo)
284889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            throws XmlPullParserException, IOException {
285889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        this(context, resolveInfo.activityInfo);
286889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    }
2878aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
288d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Constructor.
289b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
290d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param context The Context in which we are parsing the device admin.
291889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @param activityInfo The ActivityInfo returned from the package manager about
292d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * this device admin's component.
293889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     *
294889c0880661bda16e3759995e03766ddf0350732Makoto Onuki     * @hide
295d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
296889c0880661bda16e3759995e03766ddf0350732Makoto Onuki    public DeviceAdminInfo(Context context, ActivityInfo activityInfo)
297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            throws XmlPullParserException, IOException {
298889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo = activityInfo;
299b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        PackageManager pm = context.getPackageManager();
301b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        XmlResourceParser parser = null;
303d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        try {
304889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            parser = mActivityInfo.loadXmlMetaData(pm, DeviceAdminReceiver.DEVICE_ADMIN_META_DATA);
305d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (parser == null) {
306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                throw new XmlPullParserException("No "
307ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn                        + DeviceAdminReceiver.DEVICE_ADMIN_META_DATA + " meta-data");
308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
309b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
310889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            Resources res = pm.getResourcesForApplication(mActivityInfo.applicationInfo);
311b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
312d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
313b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            int type;
315d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
316d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                    && type != XmlPullParser.START_TAG) {
317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
318b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            String nodeName = parser.getName();
320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (!"device-admin".equals(nodeName)) {
321d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                throw new XmlPullParserException(
322d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                        "Meta-data does not start with device-admin tag");
323d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
324b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
32520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            TypedArray sa = res.obtainAttributes(attrs,
32687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn                    com.android.internal.R.styleable.DeviceAdmin);
327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
32887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn            mVisible = sa.getBoolean(
32987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn                    com.android.internal.R.styleable.DeviceAdmin_visible, true);
330b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
331d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            sa.recycle();
332b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
3338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            int outerDepth = parser.getDepth();
3348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
3358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                   && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    continue;
3388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                }
3398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String tagName = parser.getName();
3408aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                if (tagName.equals("uses-policies")) {
3418aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    int innerDepth = parser.getDepth();
3428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
3438aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                           && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
3448aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            continue;
3468aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        }
3478aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        String policyName = parser.getName();
3488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        Integer val = sKnownPolicies.get(policyName);
3498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        if (val != null) {
3508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            mUsesPolicies |= 1 << val.intValue();
3518aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        } else {
3528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                            Log.w(TAG, "Unknown tag under uses-policies of "
3538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                                    + getComponent() + ": " + policyName);
3548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                        }
3558aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    }
356c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                } else if (tagName.equals("support-transfer-ownership")) {
357c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                    if (parser.next() != XmlPullParser.END_TAG) {
358c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                        throw new XmlPullParserException(
359c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                                "support-transfer-ownership tag must be empty.");
360c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                    }
361c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov                    mSupportsTransferOwnership = true;
3628aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                }
3638aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
36420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        } catch (NameNotFoundException e) {
36520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            throw new XmlPullParserException(
366889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                    "Unable to create context for: " + mActivityInfo.packageName);
367d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        } finally {
368d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (parser != null) parser.close();
369d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
370d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
371d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
372d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    DeviceAdminInfo(Parcel source) {
373889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo = ActivityInfo.CREATOR.createFromParcel(source);
3748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        mUsesPolicies = source.readInt();
375c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov        mSupportsTransferOwnership = source.readBoolean();
376d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
377b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
378d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
379d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the .apk package that implements this device admin.
380d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
381d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String getPackageName() {
382889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.packageName;
383d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
384b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
385d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
386d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the class name of the receiver component that implements
387d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * this device admin.
388d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
389d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String getReceiverName() {
390889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.name;
391d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
392d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
393d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
394d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the raw information about the receiver implementing this
395d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * device admin.  Do not modify the returned object.
396d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
397d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public ActivityInfo getActivityInfo() {
398889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo;
399d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
400d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
401d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
402d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Return the component of the receiver that implements this device admin.
403d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
404f85c97741485a53c1cca5d9d6192a9436d91a044Xiaohui Chen    @NonNull
405d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public ComponentName getComponent() {
406889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return new ComponentName(mActivityInfo.packageName,
407889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                mActivityInfo.name);
408d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
409b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
410d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
411d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Load the user-displayed label for this device admin.
412b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
413d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
414d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * resources.
415d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
416d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public CharSequence loadLabel(PackageManager pm) {
417889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.loadLabel(pm);
418d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
419b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
420d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
4218aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Load user-visible description associated with this device admin.
422b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
4238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
4248aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * resources.
4258aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
4268aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public CharSequence loadDescription(PackageManager pm) throws NotFoundException {
427889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        if (mActivityInfo.descriptionRes != 0) {
428889c0880661bda16e3759995e03766ddf0350732Makoto Onuki            return pm.getText(mActivityInfo.packageName,
429889c0880661bda16e3759995e03766ddf0350732Makoto Onuki                    mActivityInfo.descriptionRes, mActivityInfo.applicationInfo);
4308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
4318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        throw new NotFoundException();
4328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
433b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
435d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Load the user-displayed icon for this device admin.
436b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
437d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param pm Supply a PackageManager used to load the device admin's
438d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * resources.
439d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
440d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public Drawable loadIcon(PackageManager pm) {
441889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return mActivityInfo.loadIcon(pm);
442d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
443b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4448aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
44587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * Returns whether this device admin would like to be visible to the
44687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     * user, even when it is not enabled.
44787bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn     */
44887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    public boolean isVisible() {
44987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn        return mVisible;
45087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    }
451b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
45287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn    /**
4538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Return true if the device admin has requested that it be able to use
4548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * the given policy control.  The possible policy identifier inputs are:
4558aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * {@link #USES_POLICY_LIMIT_PASSWORD}, {@link #USES_POLICY_WATCH_LOGIN},
456dc2df328b3c854c7b787bf5298df0c686584125dRaphael     * {@link #USES_POLICY_RESET_PASSWORD}, {@link #USES_POLICY_FORCE_LOCK},
457d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler     * {@link #USES_POLICY_WIPE_DATA},
4582447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * {@link #USES_POLICY_EXPIRE_PASSWORD}, {@link #USES_ENCRYPTED_STORAGE},
4592447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo     * {@link #USES_POLICY_DISABLE_CAMERA}.
4608aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
4618aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public boolean usesPolicy(int policyIdent) {
4628aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return (mUsesPolicies & (1<<policyIdent)) != 0;
4638aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
464b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
4658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
4668aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * Return the XML tag name for the given policy identifier.  Valid identifiers
4678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * are as per {@link #usesPolicy(int)}.  If the given identifier is not
4688aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * known, null is returned.
4698aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
4708aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public String getTagForPolicy(int policyIdent) {
4718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return sRevKnownPolicies.get(policyIdent).tag;
4728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
473b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
474c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov    /**
475c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     * Return true if this administrator can be a target in an ownership transfer.
476c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov     */
477c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov    public boolean supportsTransferOwnership() {
478c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov        return mSupportsTransferOwnership;
479c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov    }
480c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov
4818aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /** @hide */
4828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public ArrayList<PolicyInfo> getUsedPolicies() {
4838aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        ArrayList<PolicyInfo> res = new ArrayList<PolicyInfo>();
4848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        for (int i=0; i<sPoliciesDisplayOrder.size(); i++) {
4858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            PolicyInfo pi = sPoliciesDisplayOrder.get(i);
4868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            if (usesPolicy(pi.ident)) {
4878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn                res.add(pi);
4888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
4898aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
4908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        return res;
4918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    }
492b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
49321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /** @hide */
49421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public void writePoliciesToXml(XmlSerializer out)
49521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            throws IllegalArgumentException, IllegalStateException, IOException {
49621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        out.attribute(null, "flags", Integer.toString(mUsesPolicies));
49721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
498b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
49921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /** @hide */
50021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public void readPoliciesFromXml(XmlPullParser parser)
50121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            throws XmlPullParserException, IOException {
50221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mUsesPolicies = Integer.parseInt(
50321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                parser.getAttributeValue(null, "flags"));
50421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
505b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
506d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public void dump(Printer pw, String prefix) {
507d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        pw.println(prefix + "Receiver:");
508889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo.dump(pw, prefix + "  ");
509d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
510b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller
511d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    @Override
512d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public String toString() {
513889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        return "DeviceAdminInfo{" + mActivityInfo.name + "}";
514d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
515d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
516d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
517d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Used to package this object into a {@link Parcel}.
518b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller     *
519d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param dest The {@link Parcel} to be written.
520d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * @param flags The flags used for parceling.
521d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
522d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
523889c0880661bda16e3759995e03766ddf0350732Makoto Onuki        mActivityInfo.writeToParcel(dest, flags);
5248aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        dest.writeInt(mUsesPolicies);
525c8ee263d6ef37dae334e83dbe18654cff50d6153arangelov        dest.writeBoolean(mSupportsTransferOwnership);
526d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
527d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
528d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    /**
529d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * Used to make this class parcelable.
530d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     */
531d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public static final Parcelable.Creator<DeviceAdminInfo> CREATOR =
532d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            new Parcelable.Creator<DeviceAdminInfo>() {
533d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        public DeviceAdminInfo createFromParcel(Parcel source) {
534d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return new DeviceAdminInfo(source);
535d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
536d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
537d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        public DeviceAdminInfo[] newArray(int size) {
538d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return new DeviceAdminInfo[size];
539d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
540d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    };
541d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
542d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    public int describeContents() {
543d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        return 0;
544d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
545d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn}
546