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 199da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummelimport android.accounts.AccountManager; 20d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant; 21d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant.SdkConstantType; 2287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.Service; 23d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.BroadcastReceiver; 24d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.ComponentName; 25d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Context; 26d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Intent; 278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackbornimport android.os.Bundle; 28d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 29d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/** 30d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Base class for implementing a device administration component. This 31d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * class provides a convenience for interpreting the raw intent actions 32d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * that are sent by the system. 338cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 34ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * <p>The callback methods, like the base 35ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * {@link BroadcastReceiver#onReceive(Context, Intent) BroadcastReceiver.onReceive()} 36ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * method, happen on the main thread of the process. Thus long running 37ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * operations must be done on another thread. Note that because a receiver 38ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * is done once returning from its receive function, such long-running operations 39ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * should probably be done in a {@link Service}. 408cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 41d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * <p>When publishing your DeviceAdmin subclass as a receiver, it must 42d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * handle {@link #ACTION_DEVICE_ADMIN_ENABLED} and require the 43d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link android.Manifest.permission#BIND_DEVICE_ADMIN} permission. A typical 44d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * manifest entry would look like:</p> 458cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 46ab8a8ed2eb068b696f6b5519c55a03546a5927efDianne Hackborn * {@sample development/samples/ApiDemos/AndroidManifest.xml device_admin_declaration} 478cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 48d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * <p>The meta-data referenced here provides addition information specific 49d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * to the device administrator, as parsed by the {@link DeviceAdminInfo} class. 50d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * A typical file would be:</p> 518cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 5288209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * {@sample development/samples/ApiDemos/res/xml/device_admin_sample.xml meta_data} 533aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 543aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 553aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 563aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about device administration, read the 573aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> 583aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p> 593aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 60d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 61ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackbornpublic class DeviceAdminReceiver extends BroadcastReceiver { 62d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private static String TAG = "DevicePolicy"; 6343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato private static boolean localLOGV = false; 64d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 65d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 66d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * This is the primary action that a device administrator must implement to be 67d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * allowed to manage a device. This will be set to the receiver 68d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * when the user enables it for administration. You will generally 69ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * handle this in {@link DeviceAdminReceiver#onEnabled(Context, Intent)}. To be 70d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * supported, the receiver must also require the 71d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link android.Manifest.permission#BIND_DEVICE_ADMIN} permission so 72d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * that other applications can not abuse it. 73d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 74d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 75d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_DEVICE_ADMIN_ENABLED 76d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.DEVICE_ADMIN_ENABLED"; 77d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 78d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Action sent to a device administrator when the user has requested to 808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * disable it, but before this has actually been done. This gives you 818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * a chance to supply a message to the user about the impact of 828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * disabling your admin, by setting the extra field 838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * {@link #EXTRA_DISABLE_WARNING} in the result Intent. If not set, 848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * no warning will be displayed. If set, the given text will be shown 858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * to the user before they disable your admin. 868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public static final String ACTION_DEVICE_ADMIN_DISABLE_REQUESTED 898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn = "android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED"; 908cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * A CharSequence that can be shown to the user informing them of the 938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * impact of disabling your admin. 948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @see #ACTION_DEVICE_ADMIN_DISABLE_REQUESTED 968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public static final String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; 988cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 100d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Action sent to a device administrator when the user has disabled 101d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * it. Upon return, the application no longer has access to the 102d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * protected device policy manager APIs. You will generally 103ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * handle this in {@link DeviceAdminReceiver#onDisabled(Context, Intent)}. Note 104d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * that this action will be 105d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * sent the receiver regardless of whether it is explicitly listed in 106d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * its intent filter. 107d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 108d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 109d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_DEVICE_ADMIN_DISABLED 110d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.DEVICE_ADMIN_DISABLED"; 1118cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 112d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 113d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Action sent to a device administrator when the user has changed the 114d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password of their device. You can at this point check the characteristics 115254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * of the new password with {@link DevicePolicyManager#isActivePasswordSufficient() 116254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * DevicePolicyManager.isActivePasswordSufficient()}. 117254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * You will generally 118ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * handle this in {@link DeviceAdminReceiver#onPasswordChanged}. 1198cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 1208aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 1218aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to receive 1228aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this broadcast. 123d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 124d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 125d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_PASSWORD_CHANGED 126d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.ACTION_PASSWORD_CHANGED"; 1278cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 128d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 129d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Action sent to a device administrator when the user has failed at 130d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * attempted to enter the password. You can at this point check the 131d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * number of failed password attempts there have been with 132254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * {@link DevicePolicyManager#getCurrentFailedPasswordAttempts 133d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * DevicePolicyManager.getCurrentFailedPasswordAttempts()}. You will generally 134ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * handle this in {@link DeviceAdminReceiver#onPasswordFailed}. 1358cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 1368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 1378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to receive 1388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this broadcast. 139d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 140d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 141d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_PASSWORD_FAILED 142d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.ACTION_PASSWORD_FAILED"; 1438cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 144d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 145d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Action sent to a device administrator when the user has successfully 146d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * entered their password, after failing one or more times. 1478cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 1488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 1498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to receive 1508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this broadcast. 151d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 152d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 153d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_PASSWORD_SUCCEEDED 154d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; 155a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 156a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 157a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Action periodically sent to a device administrator when the device password 1586b85768058b065cc682757a366abc828c9ca727aJim Miller * is expiring. 159a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 160a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The calling device admin must have requested 161a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to receive 162a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * this broadcast. 163a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 164a4e28d181942018ba8759989799a28fa88764ce3Jim Miller @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 165a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public static final String ACTION_PASSWORD_EXPIRING 166a4e28d181942018ba8759989799a28fa88764ce3Jim Miller = "android.app.action.ACTION_PASSWORD_EXPIRING"; 167a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 1688cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel /** 16935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * Action sent to a device administrator to notify that the device is entering 17048aacba761527a529c2b668c8151c7f98ff70524Jason Monk * lock task mode from an authorized package. The extra {@link #EXTRA_LOCK_TASK_PACKAGE} 17148aacba761527a529c2b668c8151c7f98ff70524Jason Monk * will describe the authorized package using lock task mode. 17235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 17348aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @see DevicePolicyManager#isLockTaskPermitted(String) 17435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 17535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * <p>The calling device admin must be the device owner or profile 17635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * owner to receive this broadcast. 17735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk */ 17835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 17948aacba761527a529c2b668c8151c7f98ff70524Jason Monk public static final String ACTION_LOCK_TASK_ENTERING 1805503a55c0b34f54076c319e03ef6a7b792e7950eJason Monk = "android.app.action.LOCK_TASK_ENTERING"; 18135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 18235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk /** 18348aacba761527a529c2b668c8151c7f98ff70524Jason Monk * Action sent to a device administrator to notify that the device is exiting 18448aacba761527a529c2b668c8151c7f98ff70524Jason Monk * lock task mode from an authorized package. 18535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 18648aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @see DevicePolicyManager#isLockTaskPermitted(String) 18748aacba761527a529c2b668c8151c7f98ff70524Jason Monk * 18848aacba761527a529c2b668c8151c7f98ff70524Jason Monk * <p>The calling device admin must be the device owner or profile 18948aacba761527a529c2b668c8151c7f98ff70524Jason Monk * owner to receive this broadcast. 19035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk */ 19148aacba761527a529c2b668c8151c7f98ff70524Jason Monk @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 19248aacba761527a529c2b668c8151c7f98ff70524Jason Monk public static final String ACTION_LOCK_TASK_EXITING 1935503a55c0b34f54076c319e03ef6a7b792e7950eJason Monk = "android.app.action.LOCK_TASK_EXITING"; 19435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 19535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk /** 19635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * A boolean describing whether the device is currently entering or exiting 19735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * lock task mode. 19835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 19935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @see #ACTION_LOCK_TASK_CHANGED 20035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk */ 20135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk public static final String EXTRA_LOCK_TASK_PACKAGE = 20235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk "android.app.extra.LOCK_TASK_PACKAGE"; 20335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 20435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk /** 2059da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * Broadcast Action: This broadcast is sent to indicate that provisioning of a managed profile 2069da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * or managed device has completed successfully. 207f72078bdc54d1ecd286c21d8460e522582d64627Jessica Hummel * 2089da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p>The broadcast is limited to the profile that will be managed by the application that 2099da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * requested provisioning. In the device owner case the profile is the primary user. 2109da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * The broadcast will also be limited to the {@link DeviceAdminReceiver} component 2119da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * specified in the original intent or NFC bump that started the provisioning process 2129da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * (@see DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE). 21307ac20bb2c763409cfc2f3b33ca692181fd1fb1aNicolas Prevot * 2141cc4ecc3e2c64ade5078581b039e1b068c6ed0edSander Alewijnse * <p>A device admin application which listens to this intent can find out if the device was 2151cc4ecc3e2c64ade5078581b039e1b068c6ed0edSander Alewijnse * provisioned for the device owner or profile owner case by calling respectively 2161cc4ecc3e2c64ade5078581b039e1b068c6ed0edSander Alewijnse * {@link android.app.admin.DevicePolicyManager#isDeviceOwnerApp} and 2171cc4ecc3e2c64ade5078581b039e1b068c6ed0edSander Alewijnse * {@link android.app.admin.DevicePolicyManager#isProfileOwnerApp}. 2181cc4ecc3e2c64ade5078581b039e1b068c6ed0edSander Alewijnse * 219f72078bdc54d1ecd286c21d8460e522582d64627Jessica Hummel * <p>Input: Nothing.</p> 220f72078bdc54d1ecd286c21d8460e522582d64627Jessica Hummel * <p>Output: Nothing</p> 2218cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel */ 2228cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 223f72078bdc54d1ecd286c21d8460e522582d64627Jessica Hummel public static final String ACTION_PROFILE_PROVISIONING_COMPLETE = 2245669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel "android.app.action.PROFILE_PROVISIONING_COMPLETE"; 2255669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel 2265669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel /** 227f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Name under which a DevicePolicy component publishes information 228d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * about itself. This meta-data must reference an XML resource containing 229d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * a device-admin tag. XXX TO DO: describe syntax. 230d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 231d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; 2328cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 233d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private DevicePolicyManager mManager; 234d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private ComponentName mWho; 2358cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 236d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 237d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the DevicePolicyManager interface for this administrator to work 238d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * with the system. 239d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 240d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public DevicePolicyManager getManager(Context context) { 241d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mManager != null) { 242d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mManager; 243d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 244d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mManager = (DevicePolicyManager)context.getSystemService( 245d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Context.DEVICE_POLICY_SERVICE); 246d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mManager; 247d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2488cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 249d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 250d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the ComponentName describing who this device administrator is, for 251d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * use in {@link DevicePolicyManager} APIs that require the administrator to 252d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * identify itself. 253d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 254d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public ComponentName getWho(Context context) { 255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mWho != null) { 256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mWho; 257d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 258d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mWho = new ComponentName(context, getClass()); 259d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mWho; 260d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2618cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 262d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 263d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the administrator is first enabled, as a result of 264d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_ENABLED}. At this point you 265d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager} to set your desired policies. 26603978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * 26703978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * <p> If the admin is activated by a device owner, then the intent 26803978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * may contain private extras that are relevant to user setup. 26903978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * {@see DevicePolicyManager#createAndInitializeUser(ComponentName, String, String, 27003978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * ComponentName, Intent)} 27103978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * 272d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 273d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 274d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 275d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onEnabled(Context context, Intent intent) { 276d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2778cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 278d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Called when the user has asked to disable the administrator, as a result of 2808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_DISABLE_REQUESTED}, giving you 2818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * a chance to present a warning message to them. The message is returned 2828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * as the result; if null is returned (the default implementation), no 2838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * message will be displayed. 2848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param context The running context as per {@link #onReceive}. 2858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param intent The received intent as per {@link #onReceive}. 2868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @return Return the warning message to display to the user before 2878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * being disabled; if null is returned, no message is displayed. 2888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 2898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public CharSequence onDisableRequested(Context context, Intent intent) { 2908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return null; 2918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 2928cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 2938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 294d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called prior to the administrator being disabled, as a result of 295d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_DISABLED}. Upon return, you 296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can no longer use the protected parts of the {@link DevicePolicyManager} 297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * API. 298d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onDisabled(Context context, Intent intent) { 302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3038cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 304d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 305d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has changed their password, as a result of 306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_PASSWORD_CHANGED}. At this point you 307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager#getCurrentFailedPasswordAttempts() 308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * DevicePolicyManager.getCurrentFailedPasswordAttempts()} 309d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * to retrieve the active password characteristics. 310d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 311d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 312d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 313d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordChanged(Context context, Intent intent) { 314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3158cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 316d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has failed at entering their current password, as a result of 318d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_PASSWORD_FAILED}. At this point you 319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager} to retrieve the number of failed 320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password attempts. 321d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 322d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 323d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 324d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordFailed(Context context, Intent intent) { 325d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3268cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 328d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has succeeded at entering their current password, 329d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * as a result of receiving {@link #ACTION_PASSWORD_SUCCEEDED}. This will 330d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * only be received the first time they succeed after having previously 331d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * failed. 332d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 333d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 334d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 335d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordSucceeded(Context context, Intent intent) { 336d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 337a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 338a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 339a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Called periodically when the password is about to expire or has expired. It will typically 3406b85768058b065cc682757a366abc828c9ca727aJim Miller * be called at these times: on device boot, once per day before the password expires, 3416b85768058b065cc682757a366abc828c9ca727aJim Miller * and at the time when the password expires. 342a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 343a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>If the password is not updated by the user, this method will continue to be called 344a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * once per day until the password is changed or the device admin disables password expiration. 345a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 346a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The admin will typically post a notification requesting the user to change their password 347a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * in response to this call. The actual password expiration time can be obtained by calling 348a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * {@link DevicePolicyManager#getPasswordExpiration(ComponentName) } 349a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 350a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The admin should be sure to take down any notifications it posted in response to this call 351a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * when it receives {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent) }. 352a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 353a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param context The running context as per {@link #onReceive}. 354a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param intent The received intent as per {@link #onReceive}. 355a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 356a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public void onPasswordExpiring(Context context, Intent intent) { 357a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 358a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 359d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 3609da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * Called when provisioning of a managed profile or managed device has completed successfully. 3619da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * 3629da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p> As a prerequisit for the execution of this callback the (@link DeviceAdminReceiver} has 3639da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * to declare an intent filter for {@link #ACTION_PROFILE_PROVISIONING_COMPLETE}. 3649da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * Its component must also be specified in the {@link DevicePolicyManager#EXTRA_DEVICE_ADMIN} 3659da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * of the {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} intent that started the 3669da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * managed provisioning. 3678cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3689da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p>When provisioning is complete, the managed profile is hidden until the profile owner 3699da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * calls {DevicePolicyManager#setProfileEnabled(ComponentName admin)}. Typically a profile 3709da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * owner will enable the profile when it has finished any additional setup such as adding an 3719da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * account by using the {@link AccountManager} and calling apis to bring the profile into the 3729da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * desired state. 3738cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3749da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p> Note that provisioning completes without waiting for any server interactions, so the 3759da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * profile owner needs to wait for data to be available if required (e.g android device ids or 3769da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * other data that is set as a result of server interactions). 3778cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3788cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * @param context The running context as per {@link #onReceive}. 3798cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * @param intent The received intent as per {@link #onReceive}. 3808cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel */ 3818cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel public void onProfileProvisioningComplete(Context context, Intent intent) { 3828cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel } 3838cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 3848cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel /** 38548aacba761527a529c2b668c8151c7f98ff70524Jason Monk * Called when a device is entering lock task mode by a package authorized 38648aacba761527a529c2b668c8151c7f98ff70524Jason Monk * by {@link DevicePolicyManager#isLockTaskPermitted(String)} 38735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 38835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param context The running context as per {@link #onReceive}. 38935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param intent The received intent as per {@link #onReceive}. 39035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param pkg If entering, the authorized package using lock task mode, otherwise null. 39135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk */ 39248aacba761527a529c2b668c8151c7f98ff70524Jason Monk public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 39348aacba761527a529c2b668c8151c7f98ff70524Jason Monk } 39448aacba761527a529c2b668c8151c7f98ff70524Jason Monk 39548aacba761527a529c2b668c8151c7f98ff70524Jason Monk /** 39648aacba761527a529c2b668c8151c7f98ff70524Jason Monk * Called when a device is exiting lock task mode by a package authorized 39748aacba761527a529c2b668c8151c7f98ff70524Jason Monk * by {@link DevicePolicyManager#isLockTaskPermitted(String)} 39848aacba761527a529c2b668c8151c7f98ff70524Jason Monk * 39948aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @param context The running context as per {@link #onReceive}. 40048aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @param intent The received intent as per {@link #onReceive}. 40148aacba761527a529c2b668c8151c7f98ff70524Jason Monk */ 40248aacba761527a529c2b668c8151c7f98ff70524Jason Monk public void onLockTaskModeExiting(Context context, Intent intent) { 40335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 40435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 40535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk /** 406d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Intercept standard device administrator broadcasts. Implementations 407d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * should not override this method; it is better to implement the 408d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * convenience callbacks for each action. 409d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 410d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @Override 411d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onReceive(Context context, Intent intent) { 412d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn String action = intent.getAction(); 4138cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 414d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (ACTION_PASSWORD_CHANGED.equals(action)) { 415d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordChanged(context, intent); 416d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_PASSWORD_FAILED.equals(action)) { 417d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordFailed(context, intent); 418d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) { 419d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordSucceeded(context, intent); 420d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) { 421d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onEnabled(context, intent); 4228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) { 4238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn CharSequence res = onDisableRequested(context, intent); 4248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (res != null) { 4258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Bundle extras = getResultExtras(true); 4268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn extras.putCharSequence(EXTRA_DISABLE_WARNING, res); 4278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 428d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) { 429d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onDisabled(context, intent); 430a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } else if (ACTION_PASSWORD_EXPIRING.equals(action)) { 431a4e28d181942018ba8759989799a28fa88764ce3Jim Miller onPasswordExpiring(context, intent); 4328cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel } else if (ACTION_PROFILE_PROVISIONING_COMPLETE.equals(action)) { 4338cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel onProfileProvisioningComplete(context, intent); 43448aacba761527a529c2b668c8151c7f98ff70524Jason Monk } else if (ACTION_LOCK_TASK_ENTERING.equals(action)) { 43535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk String pkg = intent.getStringExtra(EXTRA_LOCK_TASK_PACKAGE); 43648aacba761527a529c2b668c8151c7f98ff70524Jason Monk onLockTaskModeEntering(context, intent, pkg); 43748aacba761527a529c2b668c8151c7f98ff70524Jason Monk } else if (ACTION_LOCK_TASK_EXITING.equals(action)) { 43848aacba761527a529c2b668c8151c7f98ff70524Jason Monk onLockTaskModeExiting(context, intent); 439d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 440d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 441d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn} 442