DeviceAdminReceiver.java revision 5669216e0d0aa86b2b82448c944b12b0382e0f90
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 /** 2275669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel * Do not use, replaced by {@link #ACTION_PROFILE_PROVISIONING_COMPLETE} 2285669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel */ 2295669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel private static final String LEGACY_ACTION_PROFILE_PROVISIONING_COMPLETE = 230f72078bdc54d1ecd286c21d8460e522582d64627Jessica Hummel "android.app.action.ACTION_PROFILE_PROVISIONING_COMPLETE"; 2318cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 232d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 233f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Name under which a DevicePolicy component publishes information 234d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * about itself. This meta-data must reference an XML resource containing 235d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * a device-admin tag. XXX TO DO: describe syntax. 236d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 237d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; 2388cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 239d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private DevicePolicyManager mManager; 240d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private ComponentName mWho; 2418cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 242d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 243d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the DevicePolicyManager interface for this administrator to work 244d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * with the system. 245d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 246d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public DevicePolicyManager getManager(Context context) { 247d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mManager != null) { 248d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mManager; 249d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 250d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mManager = (DevicePolicyManager)context.getSystemService( 251d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Context.DEVICE_POLICY_SERVICE); 252d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mManager; 253d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2548cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the ComponentName describing who this device administrator is, for 257d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * use in {@link DevicePolicyManager} APIs that require the administrator to 258d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * identify itself. 259d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 260d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public ComponentName getWho(Context context) { 261d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mWho != null) { 262d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mWho; 263d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 264d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mWho = new ComponentName(context, getClass()); 265d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mWho; 266d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2678cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 268d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 269d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the administrator is first enabled, as a result of 270d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_ENABLED}. At this point you 271d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager} to set your desired policies. 27203978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * 27303978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * <p> If the admin is activated by a device owner, then the intent 27403978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * may contain private extras that are relevant to user setup. 27503978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * {@see DevicePolicyManager#createAndInitializeUser(ComponentName, String, String, 27603978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * ComponentName, Intent)} 27703978a40b3a4c268329ae733eff8dfffd92f6e09Jason Monk * 278d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 279d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 280d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 281d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onEnabled(Context context, Intent intent) { 282d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2838cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 284d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Called when the user has asked to disable the administrator, as a result of 2868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_DISABLE_REQUESTED}, giving you 2878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * a chance to present a warning message to them. The message is returned 2888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * as the result; if null is returned (the default implementation), no 2898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * message will be displayed. 2908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param context The running context as per {@link #onReceive}. 2918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param intent The received intent as per {@link #onReceive}. 2928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @return Return the warning message to display to the user before 2938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * being disabled; if null is returned, no message is displayed. 2948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 2958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public CharSequence onDisableRequested(Context context, Intent intent) { 2968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return null; 2978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 2988cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 2998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called prior to the administrator being disabled, as a result of 301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_DEVICE_ADMIN_DISABLED}. Upon return, you 302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can no longer use the protected parts of the {@link DevicePolicyManager} 303d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * API. 304d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 305d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onDisabled(Context context, Intent intent) { 308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3098cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 310d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 311d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has changed their password, as a result of 312d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_PASSWORD_CHANGED}. At this point you 313d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager#getCurrentFailedPasswordAttempts() 314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * DevicePolicyManager.getCurrentFailedPasswordAttempts()} 315d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * to retrieve the active password characteristics. 316d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 318d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordChanged(Context context, Intent intent) { 320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3218cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 322d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 323d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has failed at entering their current password, as a result of 324d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * receiving {@link #ACTION_PASSWORD_FAILED}. At this point you 325d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * can use {@link DevicePolicyManager} to retrieve the number of failed 326d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password attempts. 327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 328d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 329d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 330d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordFailed(Context context, Intent intent) { 331d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3328cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 333d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 334d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called after the user has succeeded at entering their current password, 335d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * as a result of receiving {@link #ACTION_PASSWORD_SUCCEEDED}. This will 336d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * only be received the first time they succeed after having previously 337d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * failed. 338d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param context The running context as per {@link #onReceive}. 339d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param intent The received intent as per {@link #onReceive}. 340d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 341d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onPasswordSucceeded(Context context, Intent intent) { 342d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 343a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 344a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 345a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Called periodically when the password is about to expire or has expired. It will typically 3466b85768058b065cc682757a366abc828c9ca727aJim Miller * be called at these times: on device boot, once per day before the password expires, 3476b85768058b065cc682757a366abc828c9ca727aJim Miller * and at the time when the password expires. 348a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 349a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>If the password is not updated by the user, this method will continue to be called 350a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * once per day until the password is changed or the device admin disables password expiration. 351a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 352a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The admin will typically post a notification requesting the user to change their password 353a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * in response to this call. The actual password expiration time can be obtained by calling 354a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * {@link DevicePolicyManager#getPasswordExpiration(ComponentName) } 355a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 356a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The admin should be sure to take down any notifications it posted in response to this call 357a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * when it receives {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent) }. 358a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 359a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param context The running context as per {@link #onReceive}. 360a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param intent The received intent as per {@link #onReceive}. 361a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 362a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public void onPasswordExpiring(Context context, Intent intent) { 363a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 364a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 365d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 3669da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * Called when provisioning of a managed profile or managed device has completed successfully. 3679da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * 3689da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p> As a prerequisit for the execution of this callback the (@link DeviceAdminReceiver} has 3699da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * to declare an intent filter for {@link #ACTION_PROFILE_PROVISIONING_COMPLETE}. 3709da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * Its component must also be specified in the {@link DevicePolicyManager#EXTRA_DEVICE_ADMIN} 3719da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * of the {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} intent that started the 3729da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * managed provisioning. 3738cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3749da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p>When provisioning is complete, the managed profile is hidden until the profile owner 3759da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * calls {DevicePolicyManager#setProfileEnabled(ComponentName admin)}. Typically a profile 3769da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * owner will enable the profile when it has finished any additional setup such as adding an 3779da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * account by using the {@link AccountManager} and calling apis to bring the profile into the 3789da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * desired state. 3798cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3809da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * <p> Note that provisioning completes without waiting for any server interactions, so the 3819da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * profile owner needs to wait for data to be available if required (e.g android device ids or 3829da603973bcde2fb4566d6cc1bcb0f764fd383f4Jessica Hummel * other data that is set as a result of server interactions). 3838cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * 3848cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * @param context The running context as per {@link #onReceive}. 3858cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel * @param intent The received intent as per {@link #onReceive}. 3868cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel */ 3878cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel public void onProfileProvisioningComplete(Context context, Intent intent) { 3888cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel } 3898cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 3908cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel /** 39148aacba761527a529c2b668c8151c7f98ff70524Jason Monk * Called when a device is entering lock task mode by a package authorized 39248aacba761527a529c2b668c8151c7f98ff70524Jason Monk * by {@link DevicePolicyManager#isLockTaskPermitted(String)} 39335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * 39435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param context The running context as per {@link #onReceive}. 39535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param intent The received intent as per {@link #onReceive}. 39635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk * @param pkg If entering, the authorized package using lock task mode, otherwise null. 39735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk */ 39848aacba761527a529c2b668c8151c7f98ff70524Jason Monk public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 39948aacba761527a529c2b668c8151c7f98ff70524Jason Monk } 40048aacba761527a529c2b668c8151c7f98ff70524Jason Monk 40148aacba761527a529c2b668c8151c7f98ff70524Jason Monk /** 40248aacba761527a529c2b668c8151c7f98ff70524Jason Monk * Called when a device is exiting lock task mode by a package authorized 40348aacba761527a529c2b668c8151c7f98ff70524Jason Monk * by {@link DevicePolicyManager#isLockTaskPermitted(String)} 40448aacba761527a529c2b668c8151c7f98ff70524Jason Monk * 40548aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @param context The running context as per {@link #onReceive}. 40648aacba761527a529c2b668c8151c7f98ff70524Jason Monk * @param intent The received intent as per {@link #onReceive}. 40748aacba761527a529c2b668c8151c7f98ff70524Jason Monk */ 40848aacba761527a529c2b668c8151c7f98ff70524Jason Monk public void onLockTaskModeExiting(Context context, Intent intent) { 40935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 41035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 41135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk /** 412d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Intercept standard device administrator broadcasts. Implementations 413d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * should not override this method; it is better to implement the 414d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * convenience callbacks for each action. 415d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 416d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @Override 417d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void onReceive(Context context, Intent intent) { 418d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn String action = intent.getAction(); 4198cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel 420d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (ACTION_PASSWORD_CHANGED.equals(action)) { 421d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordChanged(context, intent); 422d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_PASSWORD_FAILED.equals(action)) { 423d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordFailed(context, intent); 424d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) { 425d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onPasswordSucceeded(context, intent); 426d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) { 427d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onEnabled(context, intent); 4288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) { 4298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn CharSequence res = onDisableRequested(context, intent); 4308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (res != null) { 4318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Bundle extras = getResultExtras(true); 4328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn extras.putCharSequence(EXTRA_DISABLE_WARNING, res); 4338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 434d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) { 435d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn onDisabled(context, intent); 436a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } else if (ACTION_PASSWORD_EXPIRING.equals(action)) { 437a4e28d181942018ba8759989799a28fa88764ce3Jim Miller onPasswordExpiring(context, intent); 4388cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel } else if (ACTION_PROFILE_PROVISIONING_COMPLETE.equals(action)) { 4398cdb6fcd9b6a53978cb2b2ad9ab668ae19392266Jessica Hummel onProfileProvisioningComplete(context, intent); 4405669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel // TODO: remove when nobody depends on this 4415669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel } else if (LEGACY_ACTION_PROFILE_PROVISIONING_COMPLETE.equals(action)) { 4425669216e0d0aa86b2b82448c944b12b0382e0f90Jessica Hummel onProfileProvisioningComplete(context, intent); 44348aacba761527a529c2b668c8151c7f98ff70524Jason Monk } else if (ACTION_LOCK_TASK_ENTERING.equals(action)) { 44435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk String pkg = intent.getStringExtra(EXTRA_LOCK_TASK_PACKAGE); 44548aacba761527a529c2b668c8151c7f98ff70524Jason Monk onLockTaskModeEntering(context, intent, pkg); 44648aacba761527a529c2b668c8151c7f98ff70524Jason Monk } else if (ACTION_LOCK_TASK_EXITING.equals(action)) { 44748aacba761527a529c2b668c8151c7f98ff70524Jason Monk onLockTaskModeExiting(context, intent); 448d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 449d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 450d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn} 451