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 23d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.ComponentName; 24d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Context; 25d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ActivityInfo; 268aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.content.pm.ApplicationInfo; 27d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.PackageManager; 28d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ResolveInfo; 2920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException; 3020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources; 31d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.TypedArray; 32d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.res.XmlResourceParser; 338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.content.res.Resources.NotFoundException; 34d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.graphics.drawable.Drawable; 35d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcel; 36d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Parcelable; 37d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.AttributeSet; 388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.Log; 39d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Printer; 408aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport android.util.SparseArray; 41d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Xml; 42d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 43d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport java.io.IOException; 448aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport java.util.ArrayList; 458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackbornimport java.util.HashMap; 46d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 47d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/** 48d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * This class is used to specify meta information of a device administrator 49d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * component. 50d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 51d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornpublic final class DeviceAdminInfo implements Parcelable { 52d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn static final String TAG = "DeviceAdminInfo"; 53b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 54d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 558aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * A type of policy that this device admin can use: limit the passwords 569327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * that the user can select, via {@link DevicePolicyManager#setPasswordQuality} 57254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * and {@link DevicePolicyManager#setPasswordMinimumLength}. 58b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 598aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>To control this policy, the device admin must have a "limit-password" 608aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * tag in the "uses-policies" section of its meta-data. 618aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 628aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public static final int USES_POLICY_LIMIT_PASSWORD = 0; 63b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 648aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * A type of policy that this device admin can use: able to watch login 66ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * attempts from the user, via {@link DeviceAdminReceiver#ACTION_PASSWORD_FAILED}, 67ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * {@link DeviceAdminReceiver#ACTION_PASSWORD_SUCCEEDED}, and 688aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DevicePolicyManager#getCurrentFailedPasswordAttempts}. 69b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 708aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>To control this policy, the device admin must have a "watch-login" 718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * tag in the "uses-policies" section of its meta-data. 728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public static final int USES_POLICY_WATCH_LOGIN = 1; 748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 758aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 768aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * A type of policy that this device admin can use: able to reset the 778aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * user's password via 788aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DevicePolicyManager#resetPassword}. 79b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 808aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>To control this policy, the device admin must have a "reset-password" 818aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * tag in the "uses-policies" section of its meta-data. 828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 838aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public static final int USES_POLICY_RESET_PASSWORD = 2; 848aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 858aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 86315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn * A type of policy that this device admin can use: able to force the device 87315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn * to lock via{@link DevicePolicyManager#lockNow} or limit the 888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * maximum lock timeout for the device via 898aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DevicePolicyManager#setMaximumTimeToLock}. 90b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>To control this policy, the device admin must have a "force-lock" 928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * tag in the "uses-policies" section of its meta-data. 938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 94315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn public static final int USES_POLICY_FORCE_LOCK = 3; 958aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 968aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 978aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * A type of policy that this device admin can use: able to factory 988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * reset the device, erasing all of the user's data, via 998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DevicePolicyManager#wipeData}. 100b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 1018aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>To control this policy, the device admin must have a "wipe-data" 1028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * tag in the "uses-policies" section of its meta-data. 1038aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 104315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn public static final int USES_POLICY_WIPE_DATA = 4; 1058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 10669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor /** 10769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * A type of policy that this device admin can use: able to specify the 10869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * device Global Proxy, via {@link DevicePolicyManager#setGlobalProxy}. 10969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * 11069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * <p>To control this policy, the device admin must have a "set-global-proxy" 11169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * tag in the "uses-policies" section of its meta-data. 112d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler * @hide 11369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor */ 11469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor public static final int USES_POLICY_SETS_GLOBAL_PROXY = 5; 11569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 116a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 117a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * A type of policy that this device admin can use: force the user to 118a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * change their password after an administrator-defined time limit. 119a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 120a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>To control this policy, the device admin must have an "expire-password" 121a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * tag in the "uses-policies" section of its meta-data. 122a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 123a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public static final int USES_POLICY_EXPIRE_PASSWORD = 6; 124a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 1257b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 1267b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * A type of policy that this device admin can use: require encryption of stored data. 1277b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 1287b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>To control this policy, the device admin must have a "encrypted-storage" 1297b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * tag in the "uses-policies" section of its meta-data. 1307b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 1317b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final int USES_ENCRYPTED_STORAGE = 7; 1327b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 1332447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo /** 1342447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * A type of policy that this device admin can use: disables use of all device cameras. 1352447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * 1362447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * <p>To control this policy, the device admin must have a "disable-camera" 1372447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * tag in the "uses-policies" section of its meta-data. 1382447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo */ 1392447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo public static final int USES_POLICY_DISABLE_CAMERA = 8; 1402447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo 141b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller /** 1427ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy * A type of policy that this device admin can use: disables use of keyguard features. 143b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 1447ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy * <p>To control this policy, the device admin must have a "disable-keyguard-features" 145b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * tag in the "uses-policies" section of its meta-data. 146b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller */ 14748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller public static final int USES_POLICY_DISABLE_KEYGUARD_FEATURES = 9; 148b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** @hide */ 1508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public static class PolicyInfo { 1518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public final int ident; 1528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final public String tag; 1538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final public int label; 1548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final public int description; 155b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1568ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public PolicyInfo(int identIn, String tagIn, int labelIn, int descriptionIn) { 1578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn ident = identIn; 1588aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn tag = tagIn; 1598aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn label = labelIn; 1608aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn description = descriptionIn; 1618aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 1628aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 163b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn static ArrayList<PolicyInfo> sPoliciesDisplayOrder = new ArrayList<PolicyInfo>(); 1658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn static HashMap<String, Integer> sKnownPolicies = new HashMap<String, Integer>(); 1668aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn static SparseArray<PolicyInfo> sRevKnownPolicies = new SparseArray<PolicyInfo>(); 167b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1688aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn static { 1698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WIPE_DATA, "wipe-data", 1708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policylab_wipeData, 1718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policydesc_wipeData)); 1728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_RESET_PASSWORD, "reset-password", 1738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policylab_resetPassword, 1748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policydesc_resetPassword)); 1758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_LIMIT_PASSWORD, "limit-password", 1768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policylab_limitPassword, 1778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policydesc_limitPassword)); 1788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_WATCH_LOGIN, "watch-login", 1798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policylab_watchLogin, 1808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policydesc_watchLogin)); 1818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_FORCE_LOCK, "force-lock", 1828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policylab_forceLock, 1838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn com.android.internal.R.string.policydesc_forceLock)); 18469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_SETS_GLOBAL_PROXY, "set-global-proxy", 18569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor com.android.internal.R.string.policylab_setGlobalProxy, 18669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor com.android.internal.R.string.policydesc_setGlobalProxy)); 187a4e28d181942018ba8759989799a28fa88764ce3Jim Miller sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_EXPIRE_PASSWORD, "expire-password", 188a4e28d181942018ba8759989799a28fa88764ce3Jim Miller com.android.internal.R.string.policylab_expirePassword, 189a4e28d181942018ba8759989799a28fa88764ce3Jim Miller com.android.internal.R.string.policydesc_expirePassword)); 1907b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler sPoliciesDisplayOrder.add(new PolicyInfo(USES_ENCRYPTED_STORAGE, "encrypted-storage", 1917b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler com.android.internal.R.string.policylab_encryptedStorage, 1927b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler com.android.internal.R.string.policydesc_encryptedStorage)); 1932447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo sPoliciesDisplayOrder.add(new PolicyInfo(USES_POLICY_DISABLE_CAMERA, "disable-camera", 1942447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo com.android.internal.R.string.policylab_disableCamera, 1952447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo com.android.internal.R.string.policydesc_disableCamera)); 196b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller sPoliciesDisplayOrder.add(new PolicyInfo( 19748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller USES_POLICY_DISABLE_KEYGUARD_FEATURES, "disable-keyguard-features", 19848b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller com.android.internal.R.string.policylab_disableKeyguardFeatures, 19948b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller com.android.internal.R.string.policydesc_disableKeyguardFeatures)); 200a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 2018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn for (int i=0; i<sPoliciesDisplayOrder.size(); i++) { 2028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn PolicyInfo pi = sPoliciesDisplayOrder.get(i); 2038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sRevKnownPolicies.put(pi.ident, pi); 2048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn sKnownPolicies.put(pi.tag, pi.ident); 2058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 207b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 2088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 209d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * The BroadcastReceiver that implements this device admin component. 210d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 211d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn final ResolveInfo mReceiver; 212b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 213d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 21487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * Whether this should be visible to the user. 21587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn */ 21687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn boolean mVisible; 217b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 21887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** 2198aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * The policies this administrator needs access to. 2208aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 2218aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int mUsesPolicies; 222b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 2238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 224d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Constructor. 225b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 226d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The Context in which we are parsing the device admin. 227d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param receiver The ResolveInfo returned from the package manager about 228d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * this device admin's component. 229d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 230d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public DeviceAdminInfo(Context context, ResolveInfo receiver) 231d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn throws XmlPullParserException, IOException { 232d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mReceiver = receiver; 233d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ActivityInfo ai = receiver.activityInfo; 234b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 235d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn PackageManager pm = context.getPackageManager(); 236b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 237d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn XmlResourceParser parser = null; 238d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 239ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn parser = ai.loadXmlMetaData(pm, DeviceAdminReceiver.DEVICE_ADMIN_META_DATA); 240d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (parser == null) { 241d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn throw new XmlPullParserException("No " 242ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn + DeviceAdminReceiver.DEVICE_ADMIN_META_DATA + " meta-data"); 243d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 244b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 24520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Resources res = pm.getResourcesForApplication(ai.applicationInfo); 246b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 247d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn AttributeSet attrs = Xml.asAttributeSet(parser); 248b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 249d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn int type; 250d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 251d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn && type != XmlPullParser.START_TAG) { 252d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 253b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 254d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn String nodeName = parser.getName(); 255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (!"device-admin".equals(nodeName)) { 256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn throw new XmlPullParserException( 257d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn "Meta-data does not start with device-admin tag"); 258d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 259b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 26020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 26187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn com.android.internal.R.styleable.DeviceAdmin); 262d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 26387bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn mVisible = sa.getBoolean( 26487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn com.android.internal.R.styleable.DeviceAdmin_visible, true); 265b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 266d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn sa.recycle(); 267b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 2688aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int outerDepth = parser.getDepth(); 2698aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 2708aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn continue; 2738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String tagName = parser.getName(); 2758aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (tagName.equals("uses-policies")) { 2768aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int innerDepth = parser.getDepth(); 2778aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 2788aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { 2798aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2808aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn continue; 2818aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String policyName = parser.getName(); 2838aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn Integer val = sKnownPolicies.get(policyName); 2848aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (val != null) { 2858aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn mUsesPolicies |= 1 << val.intValue(); 2868aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } else { 2878aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn Log.w(TAG, "Unknown tag under uses-policies of " 2888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn + getComponent() + ": " + policyName); 2898aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 2928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 29320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } catch (NameNotFoundException e) { 29420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn throw new XmlPullParserException( 29520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Unable to create context for: " + ai.packageName); 296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } finally { 297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (parser != null) parser.close(); 298d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn DeviceAdminInfo(Parcel source) { 302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mReceiver = ResolveInfo.CREATOR.createFromParcel(source); 3038aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn mUsesPolicies = source.readInt(); 304d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 305b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return the .apk package that implements this device admin. 308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 309d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public String getPackageName() { 310d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mReceiver.activityInfo.packageName; 311d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 312b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 313d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return the class name of the receiver component that implements 315d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * this device admin. 316d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public String getReceiverName() { 318d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mReceiver.activityInfo.name; 319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 321d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 322d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return the raw information about the receiver implementing this 323d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * device admin. Do not modify the returned object. 324d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 325d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public ActivityInfo getActivityInfo() { 326d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mReceiver.activityInfo; 327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 328d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 329d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 330d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return the component of the receiver that implements this device admin. 331d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 332d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public ComponentName getComponent() { 333d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return new ComponentName(mReceiver.activityInfo.packageName, 334d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mReceiver.activityInfo.name); 335d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 336b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 337d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 338d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Load the user-displayed label for this device admin. 339b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 340d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param pm Supply a PackageManager used to load the device admin's 341d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * resources. 342d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 343d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public CharSequence loadLabel(PackageManager pm) { 344d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mReceiver.loadLabel(pm); 345d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 346b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 347d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 3488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Load user-visible description associated with this device admin. 349b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 3508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * @param pm Supply a PackageManager used to load the device admin's 3518aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * resources. 3528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 3538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public CharSequence loadDescription(PackageManager pm) throws NotFoundException { 3548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (mReceiver.activityInfo.descriptionRes != 0) { 3558aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String packageName = mReceiver.resolvePackageName; 3568aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn ApplicationInfo applicationInfo = null; 3578aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (packageName == null) { 3588aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn packageName = mReceiver.activityInfo.packageName; 3598aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn applicationInfo = mReceiver.activityInfo.applicationInfo; 3608aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 3618aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn return pm.getText(packageName, 3628aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn mReceiver.activityInfo.descriptionRes, applicationInfo); 3638aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 3648aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn throw new NotFoundException(); 3658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 366b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 3678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 368d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Load the user-displayed icon for this device admin. 369b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 370d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param pm Supply a PackageManager used to load the device admin's 371d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * resources. 372d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 373d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public Drawable loadIcon(PackageManager pm) { 374d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mReceiver.loadIcon(pm); 375d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 376b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 3778aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 37887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * Returns whether this device admin would like to be visible to the 37987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * user, even when it is not enabled. 38087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn */ 38187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public boolean isVisible() { 38287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn return mVisible; 38387bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn } 384b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 38587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** 3868aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Return true if the device admin has requested that it be able to use 3878aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * the given policy control. The possible policy identifier inputs are: 3888aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link #USES_POLICY_LIMIT_PASSWORD}, {@link #USES_POLICY_WATCH_LOGIN}, 389dc2df328b3c854c7b787bf5298df0c686584125dRaphael * {@link #USES_POLICY_RESET_PASSWORD}, {@link #USES_POLICY_FORCE_LOCK}, 390d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler * {@link #USES_POLICY_WIPE_DATA}, 3912447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * {@link #USES_POLICY_EXPIRE_PASSWORD}, {@link #USES_ENCRYPTED_STORAGE}, 3922447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * {@link #USES_POLICY_DISABLE_CAMERA}. 3938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 3948aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public boolean usesPolicy(int policyIdent) { 3958aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn return (mUsesPolicies & (1<<policyIdent)) != 0; 3968aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 397b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 3988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** 3998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Return the XML tag name for the given policy identifier. Valid identifiers 4008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * are as per {@link #usesPolicy(int)}. If the given identifier is not 4018aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * known, null is returned. 4028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */ 4038aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public String getTagForPolicy(int policyIdent) { 4048aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn return sRevKnownPolicies.get(policyIdent).tag; 4058aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 406b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 4078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn /** @hide */ 4088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn public ArrayList<PolicyInfo> getUsedPolicies() { 4098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn ArrayList<PolicyInfo> res = new ArrayList<PolicyInfo>(); 4108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn for (int i=0; i<sPoliciesDisplayOrder.size(); i++) { 4118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn PolicyInfo pi = sPoliciesDisplayOrder.get(i); 4128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (usesPolicy(pi.ident)) { 4138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn res.add(pi); 4148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 4158aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 4168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn return res; 4178aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 418b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 41921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** @hide */ 42021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public void writePoliciesToXml(XmlSerializer out) 42121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn throws IllegalArgumentException, IllegalStateException, IOException { 42221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn out.attribute(null, "flags", Integer.toString(mUsesPolicies)); 42321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 424b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 42521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** @hide */ 42621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public void readPoliciesFromXml(XmlPullParser parser) 42721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn throws XmlPullParserException, IOException { 42821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn mUsesPolicies = Integer.parseInt( 42921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn parser.getAttributeValue(null, "flags")); 43021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 431b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 432d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void dump(Printer pw, String prefix) { 433d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn pw.println(prefix + "Receiver:"); 434d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mReceiver.dump(pw, prefix + " "); 435d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 436b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 437d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @Override 438d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public String toString() { 439d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return "DeviceAdminInfo{" + mReceiver.activityInfo.name + "}"; 440d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 441d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 442d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 443d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Used to package this object into a {@link Parcel}. 444b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 445d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param dest The {@link Parcel} to be written. 446d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param flags The flags used for parceling. 447d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 448d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 449d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mReceiver.writeToParcel(dest, flags); 4508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn dest.writeInt(mUsesPolicies); 451d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 452d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 453d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 454d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Used to make this class parcelable. 455d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 456d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final Parcelable.Creator<DeviceAdminInfo> CREATOR = 457d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn new Parcelable.Creator<DeviceAdminInfo>() { 458d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public DeviceAdminInfo createFromParcel(Parcel source) { 459d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return new DeviceAdminInfo(source); 460d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 461d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 462d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public DeviceAdminInfo[] newArray(int size) { 463d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return new DeviceAdminInfo[size]; 464d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 465d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn }; 466d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 467d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public int describeContents() { 468d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return 0; 469d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 470d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn} 471