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