DevicePolicyManager.java revision aa604694450539b4c99901b0714efaa79db3c87d
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app.admin;
18
19import android.annotation.ColorInt;
20import android.annotation.IntDef;
21import android.annotation.NonNull;
22import android.annotation.Nullable;
23import android.annotation.SdkConstant;
24import android.annotation.SdkConstant.SdkConstantType;
25import android.annotation.SystemApi;
26import android.annotation.UserIdInt;
27import android.app.Activity;
28import android.app.admin.SecurityLog.SecurityEvent;
29import android.content.ComponentName;
30import android.content.Context;
31import android.content.Intent;
32import android.content.IntentFilter;
33import android.content.pm.PackageManager;
34import android.content.pm.PackageManager.NameNotFoundException;
35import android.content.pm.ParceledListSlice;
36import android.content.pm.UserInfo;
37import android.graphics.Bitmap;
38import android.net.ProxyInfo;
39import android.net.Uri;
40import android.os.Bundle;
41import android.os.PersistableBundle;
42import android.os.Process;
43import android.os.RemoteCallback;
44import android.os.RemoteException;
45import android.os.ServiceManager;
46import android.os.UserHandle;
47import android.os.UserManager;
48import android.provider.ContactsContract.Directory;
49import android.provider.Settings;
50import android.security.Credentials;
51import android.service.restrictions.RestrictionsReceiver;
52import android.telephony.TelephonyManager;
53import android.util.Log;
54
55import com.android.internal.annotations.VisibleForTesting;
56import com.android.org.conscrypt.TrustedCertificateStore;
57
58import java.io.ByteArrayInputStream;
59import java.io.IOException;
60import java.lang.annotation.Retention;
61import java.lang.annotation.RetentionPolicy;
62import java.net.InetSocketAddress;
63import java.net.Proxy;
64import java.security.KeyFactory;
65import java.security.NoSuchAlgorithmException;
66import java.security.PrivateKey;
67import java.security.cert.Certificate;
68import java.security.cert.CertificateException;
69import java.security.cert.CertificateFactory;
70import java.security.cert.X509Certificate;
71import java.security.spec.InvalidKeySpecException;
72import java.security.spec.PKCS8EncodedKeySpec;
73import java.util.ArrayList;
74import java.util.Arrays;
75import java.util.Collections;
76import java.util.List;
77import java.util.Set;
78
79/**
80 * Public interface for managing policies enforced on a device. Most clients of this class must be
81 * registered with the system as a <a href="{@docRoot}guide/topics/admin/device-admin.html">device
82 * administrator</a>. Additionally, a device administrator may be registered as either a profile or
83 * device owner. A given method is accessible to all device administrators unless the documentation
84 * for that method specifies that it is restricted to either device or profile owners. Any
85 * application calling an api may only pass as an argument a device administrator component it
86 * owns. Otherwise, a {@link SecurityException} will be thrown.
87 * <div class="special reference">
88 * <h3>Developer Guides</h3>
89 * <p>
90 * For more information about managing policies for device administration, read the <a href=
91 * "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> developer
92 * guide. </div>
93 */
94public class DevicePolicyManager {
95    private static String TAG = "DevicePolicyManager";
96
97    private final Context mContext;
98    private final IDevicePolicyManager mService;
99    private final boolean mParentInstance;
100
101    private DevicePolicyManager(Context context, boolean parentInstance) {
102        this(context,
103                IDevicePolicyManager.Stub.asInterface(
104                        ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)),
105                parentInstance);
106    }
107
108    /** @hide */
109    @VisibleForTesting
110    protected DevicePolicyManager(
111            Context context, IDevicePolicyManager service, boolean parentInstance) {
112        mContext = context;
113        mService = service;
114        mParentInstance = parentInstance;
115    }
116
117    /** @hide */
118    public static DevicePolicyManager create(Context context) {
119        DevicePolicyManager me = new DevicePolicyManager(context, false);
120        return me.mService != null ? me : null;
121    }
122
123    /** @hide test will override it. */
124    @VisibleForTesting
125    protected int myUserId() {
126        return UserHandle.myUserId();
127    }
128
129    /**
130     * Activity action: Starts the provisioning flow which sets up a managed profile.
131     *
132     * <p>A managed profile allows data separation for example for the usage of a
133     * device as a personal and corporate device. The user which provisioning is started from and
134     * the managed profile share a launcher.
135     *
136     * <p>This intent will typically be sent by a mobile device management application (MDM).
137     * Provisioning adds a managed profile and sets the MDM as the profile owner who has full
138     * control over the profile.
139     *
140     * <p>It is possible to check if provisioning is allowed or not by querying the method
141     * {@link #isProvisioningAllowed(String)}.
142     *
143     * <p>In version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this intent must contain the
144     * extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}.
145     * As of {@link android.os.Build.VERSION_CODES#M}, it should contain the extra
146     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead, although specifying only
147     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported.
148     *
149     * <p>The intent may also contain the following extras:
150     * <ul>
151     * <li>{@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}, optional </li>
152     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional, supported from
153     * {@link android.os.Build.VERSION_CODES#N}</li>
154     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
155     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
156     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
157     * </ul>
158     *
159     * <p>When managed provisioning has completed, broadcasts are sent to the application specified
160     * in the provisioning intent. The
161     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast is sent in the
162     * managed profile and the {@link #ACTION_MANAGED_PROFILE_PROVISIONED} broadcast is sent in
163     * the primary profile.
164     *
165     * <p>If provisioning fails, the managedProfile is removed so the device returns to its
166     * previous state.
167     *
168     * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a
169     * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of
170     * the provisioning flow was successful, although this doesn't guarantee the full flow will
171     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
172     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
173     */
174    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
175    public static final String ACTION_PROVISION_MANAGED_PROFILE
176        = "android.app.action.PROVISION_MANAGED_PROFILE";
177
178    /**
179     * Activity action: Starts the provisioning flow which sets up a managed user.
180     *
181     * <p>This intent will typically be sent by a mobile device management application (MDM).
182     * Provisioning configures the user as managed user and sets the MDM as the profile
183     * owner who has full control over the user. Provisioning can only happen before user setup has
184     * been completed. Use {@link #isProvisioningAllowed(String)} to check if provisioning is
185     * allowed.
186     *
187     * <p>The intent contains the following extras:
188     * <ul>
189     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
190     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
191     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
192     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
193     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
194     * </ul>
195     *
196     * <p>If provisioning fails, the device returns to its previous state.
197     *
198     * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a
199     * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of
200     * the provisioning flow was successful, although this doesn't guarantee the full flow will
201     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
202     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
203     *
204     * @hide
205     */
206    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
207    public static final String ACTION_PROVISION_MANAGED_USER
208        = "android.app.action.PROVISION_MANAGED_USER";
209
210    /**
211     * Activity action: Starts the provisioning flow which sets up a managed device.
212     * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}.
213     *
214     * <p> During device owner provisioning a device admin app is set as the owner of the device.
215     * A device owner has full control over the device. The device owner can not be modified by the
216     * user.
217     *
218     * <p> A typical use case would be a device that is owned by a company, but used by either an
219     * employee or client.
220     *
221     * <p> An intent with this action can be sent only on an unprovisioned device.
222     * It is possible to check if provisioning is allowed or not by querying the method
223     * {@link #isProvisioningAllowed(String)}.
224     *
225     * <p>The intent contains the following extras:
226     * <ul>
227     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
228     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
229     * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li>
230     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
231     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
232     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
233     * </ul>
234     *
235     * <p>When device owner provisioning has completed, an intent of the type
236     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the
237     * device owner.
238     *
239     * <p>If provisioning fails, the device is factory reset.
240     *
241     * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part
242     * of the provisioning flow was successful, although this doesn't guarantee the full flow will
243     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
244     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
245     */
246    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
247    public static final String ACTION_PROVISION_MANAGED_DEVICE
248        = "android.app.action.PROVISION_MANAGED_DEVICE";
249
250    /**
251     * Activity action: Starts the provisioning flow which sets up a managed device.
252     *
253     * <p>During device owner provisioning, a device admin app is downloaded and set as the owner of
254     * the device. A device owner has full control over the device. The device owner can not be
255     * modified by the user and the only way of resetting the device is via factory reset.
256     *
257     * <p>A typical use case would be a device that is owned by a company, but used by either an
258     * employee or client.
259     *
260     * <p>The provisioning message should be sent to an unprovisioned device.
261     *
262     * <p>Unlike {@link #ACTION_PROVISION_MANAGED_DEVICE}, the provisioning message can only be sent
263     * by a privileged app with the permission
264     * {@link android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE}.
265     *
266     * <p>The provisioning intent contains the following properties:
267     * <ul>
268     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
269     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li>
270     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
271     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li>
272     * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
273     * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
274     * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li>
275     * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li>
276     * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li>
277     * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li>
278     * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li>
279     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li>
280     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li>
281     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li>
282     * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li>
283     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li></ul>
284     *
285     * @hide
286     */
287    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
288    @SystemApi
289    public static final String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE =
290            "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE";
291
292    /**
293     * Activity action: Starts the provisioning flow which sets up a managed device.
294     * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}.
295     *
296     * <p>NOTE: This is only supported on split system user devices, and puts the device into a
297     * management state that is distinct from that reached by
298     * {@link #ACTION_PROVISION_MANAGED_DEVICE} - specifically the device owner runs on the system
299     * user, and only has control over device-wide policies, not individual users and their data.
300     * The primary benefit is that multiple non-system users are supported when provisioning using
301     * this form of device management.
302     *
303     * <p>During device owner provisioning a device admin app is set as the owner of the device.
304     * A device owner has full control over the device. The device owner can not be modified by the
305     * user.
306     *
307     * <p>A typical use case would be a device that is owned by a company, but used by either an
308     * employee or client.
309     *
310     * <p>An intent with this action can be sent only on an unprovisioned device.
311     * It is possible to check if provisioning is allowed or not by querying the method
312     * {@link #isProvisioningAllowed(String)}.
313     *
314     * <p>The intent contains the following extras:
315     * <ul>
316     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
317     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
318     * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li>
319     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
320     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
321     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
322     * </ul>
323     *
324     * <p>When device owner provisioning has completed, an intent of the type
325     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the
326     * device owner.
327     *
328     * <p>If provisioning fails, the device is factory reset.
329     *
330     * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part
331     * of the provisioning flow was successful, although this doesn't guarantee the full flow will
332     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
333     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
334     *
335     * @hide
336     */
337    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
338    public static final String ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE
339        = "android.app.action.PROVISION_MANAGED_SHAREABLE_DEVICE";
340
341    /**
342     * Activity action: Finalizes management provisioning, should be used after user-setup
343     * has been completed and {@link #getUserProvisioningState()} returns one of:
344     * <ul>
345     * <li>{@link #STATE_USER_SETUP_INCOMPLETE}</li>
346     * <li>{@link #STATE_USER_SETUP_COMPLETE}</li>
347     * <li>{@link #STATE_USER_PROFILE_COMPLETE}</li>
348     * </ul>
349     *
350     * @hide
351     */
352    @SystemApi
353    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
354    public static final String ACTION_PROVISION_FINALIZATION
355            = "android.app.action.PROVISION_FINALIZATION";
356
357    /**
358     * Action: Bugreport sharing with device owner has been accepted by the user.
359     *
360     * @hide
361     */
362    public static final String ACTION_BUGREPORT_SHARING_ACCEPTED =
363            "com.android.server.action.BUGREPORT_SHARING_ACCEPTED";
364
365    /**
366     * Action: Bugreport sharing with device owner has been declined by the user.
367     *
368     * @hide
369     */
370    public static final String ACTION_BUGREPORT_SHARING_DECLINED =
371            "com.android.server.action.BUGREPORT_SHARING_DECLINED";
372
373    /**
374     * Action: Bugreport has been collected and is dispatched to {@link DevicePolicyManagerService}.
375     *
376     * @hide
377     */
378    public static final String ACTION_REMOTE_BUGREPORT_DISPATCH =
379            "android.intent.action.REMOTE_BUGREPORT_DISPATCH";
380
381    /**
382     * Extra for shared bugreport's SHA-256 hash.
383     *
384     * @hide
385     */
386    public static final String EXTRA_REMOTE_BUGREPORT_HASH =
387            "android.intent.extra.REMOTE_BUGREPORT_HASH";
388
389    /**
390     * Extra for remote bugreport notification shown type.
391     *
392     * @hide
393     */
394    public static final String EXTRA_BUGREPORT_NOTIFICATION_TYPE =
395            "android.app.extra.bugreport_notification_type";
396
397    /**
398     * Notification type for a started remote bugreport flow.
399     *
400     * @hide
401     */
402    public static final int NOTIFICATION_BUGREPORT_STARTED = 1;
403
404    /**
405     * Notification type for a bugreport that has already been accepted to be shared, but is still
406     * being taken.
407     *
408     * @hide
409     */
410    public static final int NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED = 2;
411
412    /**
413     * Notification type for a bugreport that has been taken and can be shared or declined.
414     *
415     * @hide
416     */
417    public static final int NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED = 3;
418
419    /**
420     * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that
421     * allows a mobile device management application or NFC programmer application which starts
422     * managed provisioning to pass data to the management application instance after provisioning.
423     * <p>
424     * If used with {@link #ACTION_PROVISION_MANAGED_PROFILE} it can be used by the application that
425     * sends the intent to pass data to itself on the newly created profile.
426     * If used with {@link #ACTION_PROVISION_MANAGED_DEVICE} it allows passing data to the same
427     * instance of the app on the primary user.
428     * Starting from {@link android.os.Build.VERSION_CODES#M}, if used with
429     * {@link #MIME_TYPE_PROVISIONING_NFC} as part of NFC managed device provisioning, the NFC
430     * message should contain a stringified {@link java.util.Properties} instance, whose string
431     * properties will be converted into a {@link android.os.PersistableBundle} and passed to the
432     * management application after provisioning.
433     *
434     * <p>
435     * In both cases the application receives the data in
436     * {@link DeviceAdminReceiver#onProfileProvisioningComplete} via an intent with the action
437     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}. The bundle is not changed
438     * during the managed provisioning.
439     */
440    public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE =
441            "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
442
443    /**
444     * A String extra holding the package name of the mobile device management application that
445     * will be set as the profile owner or device owner.
446     *
447     * <p>If an application starts provisioning directly via an intent with action
448     * {@link #ACTION_PROVISION_MANAGED_PROFILE} this package has to match the package name of the
449     * application that started provisioning. The package will be set as profile owner in that case.
450     *
451     * <p>This package is set as device owner when device owner provisioning is started by an NFC
452     * message containing an NFC record with MIME type {@link #MIME_TYPE_PROVISIONING_NFC}.
453     *
454     * <p> When this extra is set, the application must have exactly one device admin receiver.
455     * This receiver will be set as the profile or device owner and active admin.
456     *
457     * @see DeviceAdminReceiver
458     * @deprecated Use {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}. This extra is still
459     * supported, but only if there is only one device admin receiver in the package that requires
460     * the permission {@link android.Manifest.permission#BIND_DEVICE_ADMIN}.
461     */
462    @Deprecated
463    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
464        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
465
466    /**
467     * A ComponentName extra indicating the device admin receiver of the mobile device management
468     * application that will be set as the profile owner or device owner and active admin.
469     *
470     * <p>If an application starts provisioning directly via an intent with action
471     * {@link #ACTION_PROVISION_MANAGED_PROFILE} or
472     * {@link #ACTION_PROVISION_MANAGED_DEVICE} the package name of this
473     * component has to match the package name of the application that started provisioning.
474     *
475     * <p>This component is set as device owner and active admin when device owner provisioning is
476     * started by an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or by an NFC
477     * message containing an NFC record with MIME type
478     * {@link #MIME_TYPE_PROVISIONING_NFC}. For the NFC record, the component name must be
479     * flattened to a string, via {@link ComponentName#flattenToShortString()}.
480     *
481     * @see DeviceAdminReceiver
482     */
483    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME
484        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
485
486    /**
487     * An {@link android.accounts.Account} extra holding the account to migrate during managed
488     * profile provisioning. If the account supplied is present in the primary user, it will be
489     * copied, along with its credentials to the managed profile and removed from the primary user.
490     *
491     * Use with {@link #ACTION_PROVISION_MANAGED_PROFILE}.
492     */
493
494    public static final String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
495        = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE";
496
497    /**
498     * A String extra that, holds the email address of the account which a managed profile is
499     * created for. Used with {@link #ACTION_PROVISION_MANAGED_PROFILE} and
500     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}.
501     *
502     * <p> This extra is part of the {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}.
503     *
504     * <p> If the {@link #ACTION_PROVISION_MANAGED_PROFILE} intent that starts managed provisioning
505     * contains this extra, it is forwarded in the
506     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} intent to the mobile
507     * device management application that was set as the profile owner during provisioning.
508     * It is usually used to avoid that the user has to enter their email address twice.
509     */
510    public static final String EXTRA_PROVISIONING_EMAIL_ADDRESS
511        = "android.app.extra.PROVISIONING_EMAIL_ADDRESS";
512
513    /**
514     * A integer extra indicating the predominant color to show during the provisioning.
515     * Refer to {@link android.graphics.Color} for how the color is represented.
516     *
517     * <p>Use with {@link #ACTION_PROVISION_MANAGED_PROFILE} or
518     * {@link #ACTION_PROVISION_MANAGED_DEVICE}.
519     */
520    public static final String EXTRA_PROVISIONING_MAIN_COLOR =
521             "android.app.extra.PROVISIONING_MAIN_COLOR";
522
523    /**
524     * A Boolean extra that can be used by the mobile device management application to skip the
525     * disabling of system apps during provisioning when set to {@code true}.
526     *
527     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action
528     * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning.
529     */
530    public static final String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED =
531            "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED";
532
533    /**
534     * A String extra holding the time zone {@link android.app.AlarmManager} that the device
535     * will be set to.
536     *
537     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
538     * provisioning via an NFC bump.
539     */
540    public static final String EXTRA_PROVISIONING_TIME_ZONE
541        = "android.app.extra.PROVISIONING_TIME_ZONE";
542
543    /**
544     * A Long extra holding the wall clock time (in milliseconds) to be set on the device's
545     * {@link android.app.AlarmManager}.
546     *
547     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
548     * provisioning via an NFC bump.
549     */
550    public static final String EXTRA_PROVISIONING_LOCAL_TIME
551        = "android.app.extra.PROVISIONING_LOCAL_TIME";
552
553    /**
554     * A String extra holding the {@link java.util.Locale} that the device will be set to.
555     * Format: xx_yy, where xx is the language code, and yy the country code.
556     *
557     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
558     * provisioning via an NFC bump.
559     */
560    public static final String EXTRA_PROVISIONING_LOCALE
561        = "android.app.extra.PROVISIONING_LOCALE";
562
563    /**
564     * A String extra holding the ssid of the wifi network that should be used during nfc device
565     * owner provisioning for downloading the mobile device management application.
566     *
567     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
568     * provisioning via an NFC bump.
569     */
570    public static final String EXTRA_PROVISIONING_WIFI_SSID
571        = "android.app.extra.PROVISIONING_WIFI_SSID";
572
573    /**
574     * A boolean extra indicating whether the wifi network in {@link #EXTRA_PROVISIONING_WIFI_SSID}
575     * is hidden or not.
576     *
577     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
578     * provisioning via an NFC bump.
579     */
580    public static final String EXTRA_PROVISIONING_WIFI_HIDDEN
581        = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
582
583    /**
584     * A String extra indicating the security type of the wifi network in
585     * {@link #EXTRA_PROVISIONING_WIFI_SSID} and could be one of {@code NONE}, {@code WPA} or
586     * {@code WEP}.
587     *
588     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
589     * provisioning via an NFC bump.
590     */
591    public static final String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
592        = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
593
594    /**
595     * A String extra holding the password of the wifi network in
596     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
597     *
598     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
599     * provisioning via an NFC bump.
600     */
601    public static final String EXTRA_PROVISIONING_WIFI_PASSWORD
602        = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
603
604    /**
605     * A String extra holding the proxy host for the wifi network in
606     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
607     *
608     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
609     * provisioning via an NFC bump.
610     */
611    public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST
612        = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
613
614    /**
615     * An int extra holding the proxy port for the wifi network in
616     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
617     *
618     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
619     * provisioning via an NFC bump.
620     */
621    public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT
622        = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
623
624    /**
625     * A String extra holding the proxy bypass for the wifi network in
626     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
627     *
628     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
629     * provisioning via an NFC bump.
630     */
631    public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
632        = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
633
634    /**
635     * A String extra holding the proxy auto-config (PAC) URL for the wifi network in
636     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
637     *
638     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
639     * provisioning via an NFC bump.
640     */
641    public static final String EXTRA_PROVISIONING_WIFI_PAC_URL
642        = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
643
644    /**
645     * A String extra holding a url that specifies the download location of the device admin
646     * package. When not provided it is assumed that the device admin package is already installed.
647     *
648     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
649     * provisioning via an NFC bump.
650     */
651    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION
652        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
653
654    /**
655     * An int extra holding a minimum required version code for the device admin package. If the
656     * device admin is already installed on the device, it will only be re-downloaded from
657     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION} if the version of the
658     * installed package is less than this version code.
659     *
660     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
661     * provisioning via an NFC bump.
662     */
663    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE
664        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
665
666    /**
667     * A String extra holding a http cookie header which should be used in the http request to the
668     * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
669     *
670     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
671     * provisioning via an NFC bump.
672     */
673    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
674        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
675
676    /**
677     * A String extra holding the URL-safe base64 encoded SHA-256 or SHA-1 hash (see notes below) of
678     * the file at download location specified in
679     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
680     *
681     * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM} must be
682     * present. The provided checksum must match the checksum of the file at the download
683     * location. If the checksum doesn't match an error will be shown to the user and the user will
684     * be asked to factory reset the device.
685     *
686     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
687     * provisioning via an NFC bump.
688     *
689     * <p><strong>Note:</strong> for devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP}
690     * and {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} only SHA-1 hash is supported.
691     * Starting from {@link android.os.Build.VERSION_CODES#M}, this parameter accepts SHA-256 in
692     * addition to SHA-1. Support for SHA-1 is likely to be removed in future OS releases.
693     */
694    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
695        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
696
697    /**
698     * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the
699     * android package archive at the download location specified in {@link
700     * #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
701     *
702     * <p>The signatures of an android package archive can be obtained using
703     * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag
704     * {@link android.content.pm.PackageManager#GET_SIGNATURES}.
705     *
706     * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} must be
707     * present. The provided checksum must match the checksum of any signature of the file at
708     * the download location. If the checksum does not match an error will be shown to the user and
709     * the user will be asked to factory reset the device.
710     *
711     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
712     * provisioning via an NFC bump.
713     */
714    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
715        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM";
716
717    /**
718     * Broadcast Action: This broadcast is sent to indicate that provisioning of a managed profile
719     * has completed successfully.
720     *
721     * <p>The broadcast is limited to the primary profile, to the app specified in the provisioning
722     * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}.
723     *
724     * <p>This intent will contain the extra {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE} which
725     * corresponds to the account requested to be migrated at provisioning time, if any.
726     */
727    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
728    public static final String ACTION_MANAGED_PROFILE_PROVISIONED
729        = "android.app.action.MANAGED_PROFILE_PROVISIONED";
730
731    /**
732     * A boolean extra indicating whether device encryption can be skipped as part of device owner
733     * or managed profile provisioning.
734     *
735     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action
736     * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning.
737     *
738     * <p>From {@link android.os.Build.VERSION_CODES#N} onwards, this is also supported for an
739     * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}.
740     */
741    public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION =
742             "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
743
744    /**
745     * A {@link Uri} extra pointing to a logo image. This image will be shown during the
746     * provisioning. If this extra is not passed, a default image will be shown.
747     * <h5>The following URI schemes are accepted:</h5>
748     * <ul>
749     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
750     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
751     * </ul>
752     *
753     * <p> It is the responsability of the caller to provide an image with a reasonable
754     * pixed density for the device.
755     *
756     * <p> If a content: URI is passed, the intent should have the flag
757     * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and the uri should be added to the
758     * {@link android.content.ClipData} of the intent too.
759     *
760     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE} or
761     * {@link #ACTION_PROVISION_MANAGED_DEVICE}
762     */
763    public static final String EXTRA_PROVISIONING_LOGO_URI =
764            "android.app.extra.PROVISIONING_LOGO_URI";
765
766    /**
767     * A boolean extra indicating if user setup should be skipped, for when provisioning is started
768     * during setup-wizard.
769     *
770     * <p>If unspecified, defaults to {@code true} to match the behavior in
771     * {@link android.os.Build.VERSION_CODES#M} and earlier.
772     *
773     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or
774     * {@link #ACTION_PROVISION_MANAGED_USER}.
775     *
776     * @hide
777     */
778    public static final String EXTRA_PROVISIONING_SKIP_USER_SETUP =
779            "android.app.extra.PROVISIONING_SKIP_USER_SETUP";
780
781    /**
782     * This MIME type is used for starting the device owner provisioning.
783     *
784     * <p>During device owner provisioning a device admin app is set as the owner of the device.
785     * A device owner has full control over the device. The device owner can not be modified by the
786     * user and the only way of resetting the device is if the device owner app calls a factory
787     * reset.
788     *
789     * <p> A typical use case would be a device that is owned by a company, but used by either an
790     * employee or client.
791     *
792     * <p> The NFC message must be sent to an unprovisioned device.
793     *
794     * <p>The NFC record must contain a serialized {@link java.util.Properties} object which
795     * contains the following properties:
796     * <ul>
797     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}</li>
798     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li>
799     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
800     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li>
801     * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
802     * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
803     * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li>
804     * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li>
805     * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li>
806     * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li>
807     * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li>
808     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li>
809     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li>
810     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li>
811     * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li>
812     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional, supported from
813     * {@link android.os.Build.VERSION_CODES#M} </li></ul>
814     *
815     * <p>
816     * As of {@link android.os.Build.VERSION_CODES#M}, the properties should contain
817     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead of
818     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}, (although specifying only
819     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported).
820     */
821    public static final String MIME_TYPE_PROVISIONING_NFC
822        = "application/com.android.managedprovisioning";
823
824    /**
825     * Activity action: ask the user to add a new device administrator to the system.
826     * The desired policy is the ComponentName of the policy in the
827     * {@link #EXTRA_DEVICE_ADMIN} extra field.  This will invoke a UI to
828     * bring the user through adding the device administrator to the system (or
829     * allowing them to reject it).
830     *
831     * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
832     * field to provide the user with additional explanation (in addition
833     * to your component's description) about what is being added.
834     *
835     * <p>If your administrator is already active, this will ordinarily return immediately (without
836     * user intervention).  However, if your administrator has been updated and is requesting
837     * additional uses-policy flags, the user will be presented with the new list.  New policies
838     * will not be available to the updated administrator until the user has accepted the new list.
839     */
840    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
841    public static final String ACTION_ADD_DEVICE_ADMIN
842            = "android.app.action.ADD_DEVICE_ADMIN";
843
844    /**
845     * @hide
846     * Activity action: ask the user to add a new device administrator as the profile owner
847     * for this user. Only system apps can launch this intent.
848     *
849     * <p>The ComponentName of the profile owner admin is passed in the {@link #EXTRA_DEVICE_ADMIN}
850     * extra field. This will invoke a UI to bring the user through adding the profile owner admin
851     * to remotely control restrictions on the user.
852     *
853     * <p>The intent must be invoked via {@link Activity#startActivityForResult} to receive the
854     * result of whether or not the user approved the action. If approved, the result will
855     * be {@link Activity#RESULT_OK} and the component will be set as an active admin as well
856     * as a profile owner.
857     *
858     * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
859     * field to provide the user with additional explanation (in addition
860     * to your component's description) about what is being added.
861     *
862     * <p>If there is already a profile owner active or the caller is not a system app, the
863     * operation will return a failure result.
864     */
865    @SystemApi
866    public static final String ACTION_SET_PROFILE_OWNER
867            = "android.app.action.SET_PROFILE_OWNER";
868
869    /**
870     * @hide
871     * Name of the profile owner admin that controls the user.
872     */
873    @SystemApi
874    public static final String EXTRA_PROFILE_OWNER_NAME
875            = "android.app.extra.PROFILE_OWNER_NAME";
876
877    /**
878     * Broadcast action: send when any policy admin changes a policy.
879     * This is generally used to find out when a new policy is in effect.
880     *
881     * @hide
882     */
883    public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
884            = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED";
885
886    /**
887     * Broadcast action: sent when the device owner is set or changed.
888     *
889     * This broadcast is sent only to the primary user.
890     * @see #ACTION_PROVISION_MANAGED_DEVICE
891     */
892    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
893    public static final String ACTION_DEVICE_OWNER_CHANGED
894            = "android.app.action.DEVICE_OWNER_CHANGED";
895
896    /**
897     * The ComponentName of the administrator component.
898     *
899     * @see #ACTION_ADD_DEVICE_ADMIN
900     */
901    public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
902
903    /**
904     * An optional CharSequence providing additional explanation for why the
905     * admin is being added.
906     *
907     * @see #ACTION_ADD_DEVICE_ADMIN
908     */
909    public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
910
911    /**
912     * Activity action: have the user enter a new password. This activity should
913     * be launched after using {@link #setPasswordQuality(ComponentName, int)},
914     * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user
915     * enter a new password that meets the current requirements. You can use
916     * {@link #isActivePasswordSufficient()} to determine whether you need to
917     * have the user select a new password in order to meet the current
918     * constraints. Upon being resumed from this activity, you can check the new
919     * password characteristics to see if they are sufficient.
920     *
921     * If the intent is launched from within a managed profile with a profile
922     * owner built against {@link android.os.Build.VERSION_CODES#M} or before,
923     * this will trigger entering a new password for the parent of the profile.
924     * For all other cases it will trigger entering a new password for the user
925     * or profile it is launched from.
926     *
927     * @see #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
928     */
929    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
930    public static final String ACTION_SET_NEW_PASSWORD
931            = "android.app.action.SET_NEW_PASSWORD";
932
933    /**
934     * Activity action: have the user enter a new password for the parent profile.
935     * If the intent is launched from within a managed profile, this will trigger
936     * entering a new password for the parent of the profile. In all other cases
937     * the behaviour is identical to {@link #ACTION_SET_NEW_PASSWORD}.
938     */
939    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
940    public static final String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
941            = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD";
942
943    /**
944     * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in
945     * the parent profile to access intents sent from the managed profile.
946     * That is, when an app in the managed profile calls
947     * {@link Activity#startActivity(Intent)}, the intent can be resolved by a
948     * matching activity in the parent profile.
949     */
950    public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 0x0001;
951
952    /**
953     * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in
954     * the managed profile to access intents sent from the parent profile.
955     * That is, when an app in the parent profile calls
956     * {@link Activity#startActivity(Intent)}, the intent can be resolved by a
957     * matching activity in the managed profile.
958     */
959    public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 0x0002;
960
961    /**
962     * Broadcast action: notify that a new local system update policy has been set by the device
963     * owner. The new policy can be retrieved by {@link #getSystemUpdatePolicy()}.
964     */
965    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
966    public static final String ACTION_SYSTEM_UPDATE_POLICY_CHANGED
967            = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
968
969    /**
970     * Permission policy to prompt user for new permission requests for runtime permissions.
971     * Already granted or denied permissions are not affected by this.
972     */
973    public static final int PERMISSION_POLICY_PROMPT = 0;
974
975    /**
976     * Permission policy to always grant new permission requests for runtime permissions.
977     * Already granted or denied permissions are not affected by this.
978     */
979    public static final int PERMISSION_POLICY_AUTO_GRANT = 1;
980
981    /**
982     * Permission policy to always deny new permission requests for runtime permissions.
983     * Already granted or denied permissions are not affected by this.
984     */
985    public static final int PERMISSION_POLICY_AUTO_DENY = 2;
986
987    /**
988     * Runtime permission state: The user can manage the permission
989     * through the UI.
990     */
991    public static final int PERMISSION_GRANT_STATE_DEFAULT = 0;
992
993    /**
994     * Runtime permission state: The permission is granted to the app
995     * and the user cannot manage the permission through the UI.
996     */
997    public static final int PERMISSION_GRANT_STATE_GRANTED = 1;
998
999    /**
1000     * Runtime permission state: The permission is denied to the app
1001     * and the user cannot manage the permission through the UI.
1002     */
1003    public static final int PERMISSION_GRANT_STATE_DENIED = 2;
1004
1005    /**
1006     * No management for current user in-effect. This is the default.
1007     * @hide
1008     */
1009    @SystemApi
1010    public static final int STATE_USER_UNMANAGED = 0;
1011
1012    /**
1013     * Management partially setup, user setup needs to be completed.
1014     * @hide
1015     */
1016    @SystemApi
1017    public static final int STATE_USER_SETUP_INCOMPLETE = 1;
1018
1019    /**
1020     * Management partially setup, user setup completed.
1021     * @hide
1022     */
1023    @SystemApi
1024    public static final int STATE_USER_SETUP_COMPLETE = 2;
1025
1026    /**
1027     * Management setup and active on current user.
1028     * @hide
1029     */
1030    @SystemApi
1031    public static final int STATE_USER_SETUP_FINALIZED = 3;
1032
1033    /**
1034     * Management partially setup on a managed profile.
1035     * @hide
1036     */
1037    @SystemApi
1038    public static final int STATE_USER_PROFILE_COMPLETE = 4;
1039
1040    /**
1041     * @hide
1042     */
1043    @IntDef({STATE_USER_UNMANAGED, STATE_USER_SETUP_INCOMPLETE, STATE_USER_SETUP_COMPLETE,
1044            STATE_USER_SETUP_FINALIZED, STATE_USER_PROFILE_COMPLETE})
1045    @Retention(RetentionPolicy.SOURCE)
1046    public @interface UserProvisioningState {}
1047
1048    /**
1049     * Return true if the given administrator component is currently active (enabled) in the system.
1050     *
1051     * @param admin The administrator component to check for.
1052     * @return {@code true} if {@code admin} is currently enabled in the system, {@code false}
1053     *         otherwise
1054     */
1055    public boolean isAdminActive(@NonNull ComponentName admin) {
1056        return isAdminActiveAsUser(admin, myUserId());
1057    }
1058
1059    /**
1060     * @see #isAdminActive(ComponentName)
1061     * @hide
1062     */
1063    public boolean isAdminActiveAsUser(@NonNull ComponentName admin, int userId) {
1064        if (mService != null) {
1065            try {
1066                return mService.isAdminActive(admin, userId);
1067            } catch (RemoteException e) {
1068                throw e.rethrowFromSystemServer();
1069            }
1070        }
1071        return false;
1072    }
1073    /**
1074     * Return true if the given administrator component is currently being removed
1075     * for the user.
1076     * @hide
1077     */
1078    public boolean isRemovingAdmin(@NonNull ComponentName admin, int userId) {
1079        if (mService != null) {
1080            try {
1081                return mService.isRemovingAdmin(admin, userId);
1082            } catch (RemoteException e) {
1083                throw e.rethrowFromSystemServer();
1084            }
1085        }
1086        return false;
1087    }
1088
1089
1090    /**
1091     * Return a list of all currently active device administrators' component
1092     * names.  If there are no administrators {@code null} may be
1093     * returned.
1094     */
1095    public List<ComponentName> getActiveAdmins() {
1096        return getActiveAdminsAsUser(myUserId());
1097    }
1098
1099    /**
1100     * @see #getActiveAdmins()
1101     * @hide
1102     */
1103    public List<ComponentName> getActiveAdminsAsUser(int userId) {
1104        if (mService != null) {
1105            try {
1106                return mService.getActiveAdmins(userId);
1107            } catch (RemoteException e) {
1108                throw e.rethrowFromSystemServer();
1109            }
1110        }
1111        return null;
1112    }
1113
1114    /**
1115     * Used by package administration code to determine if a package can be stopped
1116     * or uninstalled.
1117     * @hide
1118     */
1119    public boolean packageHasActiveAdmins(String packageName) {
1120        return packageHasActiveAdmins(packageName, myUserId());
1121    }
1122
1123    /**
1124     * Used by package administration code to determine if a package can be stopped
1125     * or uninstalled.
1126     * @hide
1127     */
1128    public boolean packageHasActiveAdmins(String packageName, int userId) {
1129        if (mService != null) {
1130            try {
1131                return mService.packageHasActiveAdmins(packageName, userId);
1132            } catch (RemoteException e) {
1133                throw e.rethrowFromSystemServer();
1134            }
1135        }
1136        return false;
1137    }
1138
1139    /**
1140     * Remove a current administration component.  This can only be called
1141     * by the application that owns the administration component; if you
1142     * try to remove someone else's component, a security exception will be
1143     * thrown.
1144     *
1145     * <p>Note that the operation is not synchronous and the admin might still be active (as
1146     * indicated by {@link #getActiveAdmins()}) by the time this method returns.
1147     *
1148     * @param admin The administration compononent to remove.
1149     * @throws SecurityException if the caller is not in the owner application of {@code admin}.
1150     */
1151    public void removeActiveAdmin(@NonNull ComponentName admin) {
1152        if (mService != null) {
1153            try {
1154                mService.removeActiveAdmin(admin, myUserId());
1155            } catch (RemoteException e) {
1156                throw e.rethrowFromSystemServer();
1157            }
1158        }
1159    }
1160
1161    /**
1162     * Returns true if an administrator has been granted a particular device policy. This can be
1163     * used to check whether the administrator was activated under an earlier set of policies, but
1164     * requires additional policies after an upgrade.
1165     *
1166     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be an
1167     *            active administrator, or an exception will be thrown.
1168     * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}.
1169     * @throws SecurityException if {@code admin} is not an active administrator.
1170     */
1171    public boolean hasGrantedPolicy(@NonNull ComponentName admin, int usesPolicy) {
1172        if (mService != null) {
1173            try {
1174                return mService.hasGrantedPolicy(admin, usesPolicy, myUserId());
1175            } catch (RemoteException e) {
1176                throw e.rethrowFromSystemServer();
1177            }
1178        }
1179        return false;
1180    }
1181
1182    /**
1183     * Returns true if the Profile Challenge is available to use for the given profile user.
1184     *
1185     * @hide
1186     */
1187    public boolean isSeparateProfileChallengeAllowed(int userHandle) {
1188        if (mService != null) {
1189            try {
1190                return mService.isSeparateProfileChallengeAllowed(userHandle);
1191            } catch (RemoteException e) {
1192                throw e.rethrowFromSystemServer();
1193            }
1194        }
1195        return false;
1196    }
1197
1198    /**
1199     * Constant for {@link #setPasswordQuality}: the policy has no requirements
1200     * for the password.  Note that quality constants are ordered so that higher
1201     * values are more restrictive.
1202     */
1203    public static final int PASSWORD_QUALITY_UNSPECIFIED = 0;
1204
1205    /**
1206     * Constant for {@link #setPasswordQuality}: the policy allows for low-security biometric
1207     * recognition technology.  This implies technologies that can recognize the identity of
1208     * an individual to about a 3 digit PIN (false detection is less than 1 in 1,000).
1209     * Note that quality constants are ordered so that higher values are more restrictive.
1210     */
1211    public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 0x8000;
1212
1213    /**
1214     * Constant for {@link #setPasswordQuality}: the policy requires some kind
1215     * of password or pattern, but doesn't care what it is. Note that quality constants
1216     * are ordered so that higher values are more restrictive.
1217     */
1218    public static final int PASSWORD_QUALITY_SOMETHING = 0x10000;
1219
1220    /**
1221     * Constant for {@link #setPasswordQuality}: the user must have entered a
1222     * password containing at least numeric characters.  Note that quality
1223     * constants are ordered so that higher values are more restrictive.
1224     */
1225    public static final int PASSWORD_QUALITY_NUMERIC = 0x20000;
1226
1227    /**
1228     * Constant for {@link #setPasswordQuality}: the user must have entered a
1229     * password containing at least numeric characters with no repeating (4444)
1230     * or ordered (1234, 4321, 2468) sequences.  Note that quality
1231     * constants are ordered so that higher values are more restrictive.
1232     */
1233    public static final int PASSWORD_QUALITY_NUMERIC_COMPLEX = 0x30000;
1234
1235    /**
1236     * Constant for {@link #setPasswordQuality}: the user must have entered a
1237     * password containing at least alphabetic (or other symbol) characters.
1238     * Note that quality constants are ordered so that higher values are more
1239     * restrictive.
1240     */
1241    public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000;
1242
1243    /**
1244     * Constant for {@link #setPasswordQuality}: the user must have entered a
1245     * password containing at least <em>both></em> numeric <em>and</em>
1246     * alphabetic (or other symbol) characters.  Note that quality constants are
1247     * ordered so that higher values are more restrictive.
1248     */
1249    public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000;
1250
1251    /**
1252     * Constant for {@link #setPasswordQuality}: the user must have entered a
1253     * password containing at least a letter, a numerical digit and a special
1254     * symbol, by default. With this password quality, passwords can be
1255     * restricted to contain various sets of characters, like at least an
1256     * uppercase letter, etc. These are specified using various methods,
1257     * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note
1258     * that quality constants are ordered so that higher values are more
1259     * restrictive.
1260     */
1261    public static final int PASSWORD_QUALITY_COMPLEX = 0x60000;
1262
1263    /**
1264     * Constant for {@link #setPasswordQuality}: the user is not allowed to
1265     * modify password. In case this password quality is set, the password is
1266     * managed by a profile owner. The profile owner can set any password,
1267     * as if {@link #PASSWORD_QUALITY_UNSPECIFIED} is used. Note
1268     * that quality constants are ordered so that higher values are more
1269     * restrictive. The value of {@link #PASSWORD_QUALITY_MANAGED} is
1270     * the highest.
1271     * @hide
1272     */
1273    public static final int PASSWORD_QUALITY_MANAGED = 0x80000;
1274
1275    /**
1276     * Called by an application that is administering the device to set the password restrictions it
1277     * is imposing. After setting this, the user will not be able to enter a new password that is
1278     * not at least as restrictive as what has been set. Note that the current password will remain
1279     * until the user has set a new one, so the change does not take place immediately. To prompt
1280     * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1281     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after calling this method.
1282     * <p>
1283     * Quality constants are ordered so that higher values are more restrictive; thus the highest
1284     * requested quality constant (between the policy set here, the user's preference, and any other
1285     * considerations) is the one that is in effect.
1286     * <p>
1287     * The calling device admin must have requested
1288     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1289     * not, a security exception will be thrown.
1290     * <p>
1291     * This method can be called on the {@link DevicePolicyManager} instance returned by
1292     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1293     * profile.
1294     *
1295     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1296     * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED},
1297     *            {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC},
1298     *            {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC},
1299     *            {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}.
1300     * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin}
1301     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1302     */
1303    public void setPasswordQuality(@NonNull ComponentName admin, int quality) {
1304        if (mService != null) {
1305            try {
1306                mService.setPasswordQuality(admin, quality, mParentInstance);
1307            } catch (RemoteException e) {
1308                throw e.rethrowFromSystemServer();
1309            }
1310        }
1311    }
1312
1313    /**
1314     * Retrieve the current minimum password quality for a particular admin or all admins that set
1315     * retrictions on this user and its participating profiles. Restrictions on profiles that have
1316     * a separate challenge are not taken into account.
1317     *
1318     * <p>This method can be called on the {@link DevicePolicyManager} instance
1319     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1320     * restrictions on the parent profile.
1321     *
1322     * @param admin The name of the admin component to check, or {@code null} to aggregate
1323     * all admins.
1324     */
1325    public int getPasswordQuality(@Nullable ComponentName admin) {
1326        return getPasswordQuality(admin, myUserId());
1327    }
1328
1329    /** @hide per-user version */
1330    public int getPasswordQuality(@Nullable ComponentName admin, int userHandle) {
1331        if (mService != null) {
1332            try {
1333                return mService.getPasswordQuality(admin, userHandle, mParentInstance);
1334            } catch (RemoteException e) {
1335                throw e.rethrowFromSystemServer();
1336            }
1337        }
1338        return PASSWORD_QUALITY_UNSPECIFIED;
1339    }
1340
1341    /**
1342     * Called by an application that is administering the device to set the minimum allowed password
1343     * length. After setting this, the user will not be able to enter a new password that is not at
1344     * least as restrictive as what has been set. Note that the current password will remain until
1345     * the user has set a new one, so the change does not take place immediately. To prompt the user
1346     * for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1347     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
1348     * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC}
1349     * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC},
1350     * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} with
1351     * {@link #setPasswordQuality}.
1352     * <p>
1353     * The calling device admin must have requested
1354     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1355     * not, a security exception will be thrown.
1356     * <p>
1357     * This method can be called on the {@link DevicePolicyManager} instance returned by
1358     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1359     * profile.
1360     *
1361     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1362     * @param length The new desired minimum password length. A value of 0 means there is no
1363     *            restriction.
1364     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1365     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1366     */
1367    public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) {
1368        if (mService != null) {
1369            try {
1370                mService.setPasswordMinimumLength(admin, length, mParentInstance);
1371            } catch (RemoteException e) {
1372                throw e.rethrowFromSystemServer();
1373            }
1374        }
1375    }
1376
1377    /**
1378     * Retrieve the current minimum password length for a particular admin or all admins that set
1379     * retrictions on this user and its participating profiles. Restrictions on profiles that have
1380     * a separate challenge are not taken into account.
1381     *
1382     * <p>This method can be called on the {@link DevicePolicyManager} instance
1383     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1384     * restrictions on the parent profile.
1385     *
1386     * user and its profiles or a particular one.
1387     * @param admin The name of the admin component to check, or {@code null} to aggregate
1388     * all admins.
1389     */
1390    public int getPasswordMinimumLength(@Nullable ComponentName admin) {
1391        return getPasswordMinimumLength(admin, myUserId());
1392    }
1393
1394    /** @hide per-user version */
1395    public int getPasswordMinimumLength(@Nullable ComponentName admin, int userHandle) {
1396        if (mService != null) {
1397            try {
1398                return mService.getPasswordMinimumLength(admin, userHandle, mParentInstance);
1399            } catch (RemoteException e) {
1400                throw e.rethrowFromSystemServer();
1401            }
1402        }
1403        return 0;
1404    }
1405
1406    /**
1407     * Called by an application that is administering the device to set the minimum number of upper
1408     * case letters required in the password. After setting this, the user will not be able to enter
1409     * a new password that is not at least as restrictive as what has been set. Note that the
1410     * current password will remain until the user has set a new one, so the change does not take
1411     * place immediately. To prompt the user for a new password, use
1412     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
1413     * setting this value. This constraint is only imposed if the administrator has also requested
1414     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
1415     * <p>
1416     * The calling device admin must have requested
1417     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1418     * not, a security exception will be thrown.
1419     * <p>
1420     * This method can be called on the {@link DevicePolicyManager} instance returned by
1421     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1422     * profile.
1423     *
1424     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1425     * @param length The new desired minimum number of upper case letters required in the password.
1426     *            A value of 0 means there is no restriction.
1427     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1428     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1429     */
1430    public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) {
1431        if (mService != null) {
1432            try {
1433                mService.setPasswordMinimumUpperCase(admin, length, mParentInstance);
1434            } catch (RemoteException e) {
1435                throw e.rethrowFromSystemServer();
1436            }
1437        }
1438    }
1439
1440    /**
1441     * Retrieve the current number of upper case letters required in the password
1442     * for a particular admin or all admins that set retrictions on this user and
1443     * its participating profiles. Restrictions on profiles that have a separate challenge
1444     * are not taken into account.
1445     * This is the same value as set by
1446     * {@link #setPasswordMinimumUpperCase(ComponentName, int)}
1447     * and only applies when the password quality is
1448     * {@link #PASSWORD_QUALITY_COMPLEX}.
1449     *
1450     * <p>This method can be called on the {@link DevicePolicyManager} instance
1451     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1452     * restrictions on the parent profile.
1453     *
1454     * @param admin The name of the admin component to check, or {@code null} to
1455     *            aggregate all admins.
1456     * @return The minimum number of upper case letters required in the
1457     *         password.
1458     */
1459    public int getPasswordMinimumUpperCase(@Nullable ComponentName admin) {
1460        return getPasswordMinimumUpperCase(admin, myUserId());
1461    }
1462
1463    /** @hide per-user version */
1464    public int getPasswordMinimumUpperCase(@Nullable ComponentName admin, int userHandle) {
1465        if (mService != null) {
1466            try {
1467                return mService.getPasswordMinimumUpperCase(admin, userHandle, mParentInstance);
1468            } catch (RemoteException e) {
1469                throw e.rethrowFromSystemServer();
1470            }
1471        }
1472        return 0;
1473    }
1474
1475    /**
1476     * Called by an application that is administering the device to set the minimum number of lower
1477     * case letters required in the password. After setting this, the user will not be able to enter
1478     * a new password that is not at least as restrictive as what has been set. Note that the
1479     * current password will remain until the user has set a new one, so the change does not take
1480     * place immediately. To prompt the user for a new password, use
1481     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
1482     * setting this value. This constraint is only imposed if the administrator has also requested
1483     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
1484     * <p>
1485     * The calling device admin must have requested
1486     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1487     * not, a security exception will be thrown.
1488     * <p>
1489     * This method can be called on the {@link DevicePolicyManager} instance returned by
1490     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1491     * profile.
1492     *
1493     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1494     * @param length The new desired minimum number of lower case letters required in the password.
1495     *            A value of 0 means there is no restriction.
1496     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1497     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1498     */
1499    public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) {
1500        if (mService != null) {
1501            try {
1502                mService.setPasswordMinimumLowerCase(admin, length, mParentInstance);
1503            } catch (RemoteException e) {
1504                throw e.rethrowFromSystemServer();
1505            }
1506        }
1507    }
1508
1509    /**
1510     * Retrieve the current number of lower case letters required in the password
1511     * for a particular admin or all admins that set retrictions on this user
1512     * and its participating profiles. Restrictions on profiles that have
1513     * a separate challenge are not taken into account.
1514     * This is the same value as set by
1515     * {@link #setPasswordMinimumLowerCase(ComponentName, int)}
1516     * and only applies when the password quality is
1517     * {@link #PASSWORD_QUALITY_COMPLEX}.
1518     *
1519     * <p>This method can be called on the {@link DevicePolicyManager} instance
1520     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1521     * restrictions on the parent profile.
1522     *
1523     * @param admin The name of the admin component to check, or {@code null} to
1524     *            aggregate all admins.
1525     * @return The minimum number of lower case letters required in the
1526     *         password.
1527     */
1528    public int getPasswordMinimumLowerCase(@Nullable ComponentName admin) {
1529        return getPasswordMinimumLowerCase(admin, myUserId());
1530    }
1531
1532    /** @hide per-user version */
1533    public int getPasswordMinimumLowerCase(@Nullable ComponentName admin, int userHandle) {
1534        if (mService != null) {
1535            try {
1536                return mService.getPasswordMinimumLowerCase(admin, userHandle, mParentInstance);
1537            } catch (RemoteException e) {
1538                throw e.rethrowFromSystemServer();
1539            }
1540        }
1541        return 0;
1542    }
1543
1544    /**
1545     * Called by an application that is administering the device to set the minimum number of
1546     * letters required in the password. After setting this, the user will not be able to enter a
1547     * new password that is not at least as restrictive as what has been set. Note that the current
1548     * password will remain until the user has set a new one, so the change does not take place
1549     * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1550     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
1551     * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with
1552     * {@link #setPasswordQuality}. The default value is 1.
1553     * <p>
1554     * The calling device admin must have requested
1555     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1556     * not, a security exception will be thrown.
1557     * <p>
1558     * This method can be called on the {@link DevicePolicyManager} instance returned by
1559     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1560     * profile.
1561     *
1562     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1563     * @param length The new desired minimum number of letters required in the password. A value of
1564     *            0 means there is no restriction.
1565     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1566     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1567     */
1568    public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) {
1569        if (mService != null) {
1570            try {
1571                mService.setPasswordMinimumLetters(admin, length, mParentInstance);
1572            } catch (RemoteException e) {
1573                throw e.rethrowFromSystemServer();
1574            }
1575        }
1576    }
1577
1578    /**
1579     * Retrieve the current number of letters required in the password
1580     * for a particular admin or all admins that set retrictions on this user
1581     * and its participating profiles. Restrictions on profiles that have
1582     * a separate challenge are not taken into account.
1583     * This is the same value as set by
1584     * {@link #setPasswordMinimumLetters(ComponentName, int)}
1585     * and only applies when the password quality is
1586     * {@link #PASSWORD_QUALITY_COMPLEX}.
1587     *
1588     * <p>This method can be called on the {@link DevicePolicyManager} instance
1589     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1590     * restrictions on the parent profile.
1591     *
1592     * @param admin The name of the admin component to check, or {@code null} to
1593     *            aggregate all admins.
1594     * @return The minimum number of letters required in the password.
1595     */
1596    public int getPasswordMinimumLetters(@Nullable ComponentName admin) {
1597        return getPasswordMinimumLetters(admin, myUserId());
1598    }
1599
1600    /** @hide per-user version */
1601    public int getPasswordMinimumLetters(@Nullable ComponentName admin, int userHandle) {
1602        if (mService != null) {
1603            try {
1604                return mService.getPasswordMinimumLetters(admin, userHandle, mParentInstance);
1605            } catch (RemoteException e) {
1606                throw e.rethrowFromSystemServer();
1607            }
1608        }
1609        return 0;
1610    }
1611
1612    /**
1613     * Called by an application that is administering the device to set the minimum number of
1614     * numerical digits required in the password. After setting this, the user will not be able to
1615     * enter a new password that is not at least as restrictive as what has been set. Note that the
1616     * current password will remain until the user has set a new one, so the change does not take
1617     * place immediately. To prompt the user for a new password, use
1618     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
1619     * setting this value. This constraint is only imposed if the administrator has also requested
1620     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 1.
1621     * <p>
1622     * The calling device admin must have requested
1623     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1624     * not, a security exception will be thrown.
1625     * <p>
1626     * This method can be called on the {@link DevicePolicyManager} instance returned by
1627     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1628     * profile.
1629     *
1630     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1631     * @param length The new desired minimum number of numerical digits required in the password. A
1632     *            value of 0 means there is no restriction.
1633     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1634     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1635     */
1636    public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) {
1637        if (mService != null) {
1638            try {
1639                mService.setPasswordMinimumNumeric(admin, length, mParentInstance);
1640            } catch (RemoteException e) {
1641                throw e.rethrowFromSystemServer();
1642            }
1643        }
1644    }
1645
1646    /**
1647     * Retrieve the current number of numerical digits required in the password
1648     * for a particular admin or all admins that set retrictions on this user
1649     * and its participating profiles. Restrictions on profiles that have
1650     * a separate challenge are not taken into account.
1651     * This is the same value as set by
1652     * {@link #setPasswordMinimumNumeric(ComponentName, int)}
1653     * and only applies when the password quality is
1654     * {@link #PASSWORD_QUALITY_COMPLEX}.
1655     *
1656     * <p>This method can be called on the {@link DevicePolicyManager} instance
1657     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1658     * restrictions on the parent profile.
1659     *
1660     * @param admin The name of the admin component to check, or {@code null} to
1661     *            aggregate all admins.
1662     * @return The minimum number of numerical digits required in the password.
1663     */
1664    public int getPasswordMinimumNumeric(@Nullable ComponentName admin) {
1665        return getPasswordMinimumNumeric(admin, myUserId());
1666    }
1667
1668    /** @hide per-user version */
1669    public int getPasswordMinimumNumeric(@Nullable ComponentName admin, int userHandle) {
1670        if (mService != null) {
1671            try {
1672                return mService.getPasswordMinimumNumeric(admin, userHandle, mParentInstance);
1673            } catch (RemoteException e) {
1674                throw e.rethrowFromSystemServer();
1675            }
1676        }
1677        return 0;
1678    }
1679
1680    /**
1681     * Called by an application that is administering the device to set the minimum number of
1682     * symbols required in the password. After setting this, the user will not be able to enter a
1683     * new password that is not at least as restrictive as what has been set. Note that the current
1684     * password will remain until the user has set a new one, so the change does not take place
1685     * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1686     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
1687     * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with
1688     * {@link #setPasswordQuality}. The default value is 1.
1689     * <p>
1690     * The calling device admin must have requested
1691     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1692     * not, a security exception will be thrown.
1693     * <p>
1694     * This method can be called on the {@link DevicePolicyManager} instance returned by
1695     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1696     * profile.
1697     *
1698     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1699     * @param length The new desired minimum number of symbols required in the password. A value of
1700     *            0 means there is no restriction.
1701     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1702     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1703     */
1704    public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) {
1705        if (mService != null) {
1706            try {
1707                mService.setPasswordMinimumSymbols(admin, length, mParentInstance);
1708            } catch (RemoteException e) {
1709                throw e.rethrowFromSystemServer();
1710            }
1711        }
1712    }
1713
1714    /**
1715     * Retrieve the current number of symbols required in the password
1716     * for a particular admin or all admins that set retrictions on this user
1717     * and its participating profiles. Restrictions on profiles that have
1718     * a separate challenge are not taken into account. This is the same value as
1719     * set by {@link #setPasswordMinimumSymbols(ComponentName, int)}
1720     * and only applies when the password quality is
1721     * {@link #PASSWORD_QUALITY_COMPLEX}.
1722     *
1723     * <p>This method can be called on the {@link DevicePolicyManager} instance
1724     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1725     * restrictions on the parent profile.
1726     *
1727     * @param admin The name of the admin component to check, or {@code null} to
1728     *            aggregate all admins.
1729     * @return The minimum number of symbols required in the password.
1730     */
1731    public int getPasswordMinimumSymbols(@Nullable ComponentName admin) {
1732        return getPasswordMinimumSymbols(admin, myUserId());
1733    }
1734
1735    /** @hide per-user version */
1736    public int getPasswordMinimumSymbols(@Nullable ComponentName admin, int userHandle) {
1737        if (mService != null) {
1738            try {
1739                return mService.getPasswordMinimumSymbols(admin, userHandle, mParentInstance);
1740            } catch (RemoteException e) {
1741                throw e.rethrowFromSystemServer();
1742            }
1743        }
1744        return 0;
1745    }
1746
1747    /**
1748     * Called by an application that is administering the device to set the minimum number of
1749     * non-letter characters (numerical digits or symbols) required in the password. After setting
1750     * this, the user will not be able to enter a new password that is not at least as restrictive
1751     * as what has been set. Note that the current password will remain until the user has set a new
1752     * one, so the change does not take place immediately. To prompt the user for a new password,
1753     * use {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
1754     * setting this value. This constraint is only imposed if the administrator has also requested
1755     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
1756     * <p>
1757     * The calling device admin must have requested
1758     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1759     * not, a security exception will be thrown.
1760     * <p>
1761     * This method can be called on the {@link DevicePolicyManager} instance returned by
1762     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1763     * profile.
1764     *
1765     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1766     * @param length The new desired minimum number of letters required in the password. A value of
1767     *            0 means there is no restriction.
1768     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1769     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1770     */
1771    public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) {
1772        if (mService != null) {
1773            try {
1774                mService.setPasswordMinimumNonLetter(admin, length, mParentInstance);
1775            } catch (RemoteException e) {
1776                throw e.rethrowFromSystemServer();
1777            }
1778        }
1779    }
1780
1781    /**
1782     * Retrieve the current number of non-letter characters required in the password
1783     * for a particular admin or all admins that set retrictions on this user
1784     * and its participating profiles. Restrictions on profiles that have
1785     * a separate challenge are not taken into account.
1786     * This is the same value as set by
1787     * {@link #setPasswordMinimumNonLetter(ComponentName, int)}
1788     * and only applies when the password quality is
1789     * {@link #PASSWORD_QUALITY_COMPLEX}.
1790     *
1791     * <p>This method can be called on the {@link DevicePolicyManager} instance
1792     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1793     * restrictions on the parent profile.
1794     *
1795     * @param admin The name of the admin component to check, or {@code null} to
1796     *            aggregate all admins.
1797     * @return The minimum number of letters required in the password.
1798     */
1799    public int getPasswordMinimumNonLetter(@Nullable ComponentName admin) {
1800        return getPasswordMinimumNonLetter(admin, myUserId());
1801    }
1802
1803    /** @hide per-user version */
1804    public int getPasswordMinimumNonLetter(@Nullable ComponentName admin, int userHandle) {
1805        if (mService != null) {
1806            try {
1807                return mService.getPasswordMinimumNonLetter(admin, userHandle, mParentInstance);
1808            } catch (RemoteException e) {
1809                throw e.rethrowFromSystemServer();
1810            }
1811        }
1812        return 0;
1813    }
1814
1815    /**
1816     * Called by an application that is administering the device to set the length of the password
1817     * history. After setting this, the user will not be able to enter a new password that is the
1818     * same as any password in the history. Note that the current password will remain until the
1819     * user has set a new one, so the change does not take place immediately. To prompt the user for
1820     * a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1821     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
1822     * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC}
1823     * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX} {@link #PASSWORD_QUALITY_ALPHABETIC}, or
1824     * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}.
1825     * <p>
1826     * The calling device admin must have requested
1827     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1828     * not, a security exception will be thrown.
1829     * <p>
1830     * This method can be called on the {@link DevicePolicyManager} instance returned by
1831     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1832     * profile.
1833     *
1834     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1835     * @param length The new desired length of password history. A value of 0 means there is no
1836     *            restriction.
1837     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1838     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1839     */
1840    public void setPasswordHistoryLength(@NonNull ComponentName admin, int length) {
1841        if (mService != null) {
1842            try {
1843                mService.setPasswordHistoryLength(admin, length, mParentInstance);
1844            } catch (RemoteException e) {
1845                throw e.rethrowFromSystemServer();
1846            }
1847        }
1848    }
1849
1850    /**
1851     * Called by a device admin to set the password expiration timeout. Calling this method will
1852     * restart the countdown for password expiration for the given admin, as will changing the
1853     * device password (for all admins).
1854     * <p>
1855     * The provided timeout is the time delta in ms and will be added to the current time. For
1856     * example, to have the password expire 5 days from now, timeout would be 5 * 86400 * 1000 =
1857     * 432000000 ms for timeout.
1858     * <p>
1859     * To disable password expiration, a value of 0 may be used for timeout.
1860     * <p>
1861     * The calling device admin must have requested
1862     * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this method; if it has
1863     * not, a security exception will be thrown.
1864     * <p>
1865     * Note that setting the password will automatically reset the expiration time for all active
1866     * admins. Active admins do not need to explicitly call this method in that case.
1867     * <p>
1868     * This method can be called on the {@link DevicePolicyManager} instance returned by
1869     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1870     * profile.
1871     *
1872     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1873     * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 means
1874     *            there is no restriction (unlimited).
1875     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1876     *             does not use {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD}
1877     */
1878    public void setPasswordExpirationTimeout(@NonNull ComponentName admin, long timeout) {
1879        if (mService != null) {
1880            try {
1881                mService.setPasswordExpirationTimeout(admin, timeout, mParentInstance);
1882            } catch (RemoteException e) {
1883                throw e.rethrowFromSystemServer();
1884            }
1885        }
1886    }
1887
1888    /**
1889     * Get the password expiration timeout for the given admin. The expiration timeout is the
1890     * recurring expiration timeout provided in the call to
1891     * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the
1892     * aggregate of all participating policy administrators if {@code admin} is null. Admins that
1893     * have set restrictions on profiles that have a separate challenge are not taken into account.
1894     *
1895     * <p>This method can be called on the {@link DevicePolicyManager} instance
1896     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1897     * restrictions on the parent profile.
1898     *
1899     * @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
1900     * @return The timeout for the given admin or the minimum of all timeouts
1901     */
1902    public long getPasswordExpirationTimeout(@Nullable ComponentName admin) {
1903        if (mService != null) {
1904            try {
1905                return mService.getPasswordExpirationTimeout(admin, myUserId(), mParentInstance);
1906            } catch (RemoteException e) {
1907                throw e.rethrowFromSystemServer();
1908            }
1909        }
1910        return 0;
1911    }
1912
1913    /**
1914     * Get the current password expiration time for a particular admin or all admins that set
1915     * retrictions on this user and its participating profiles. Restrictions on profiles that have
1916     * a separate challenge are not taken into account. If admin is {@code null}, then a composite
1917     * of all expiration times is returned - which will be the minimum of all of them.
1918     *
1919     * <p>This method can be called on the {@link DevicePolicyManager} instance
1920     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1921     * the password expiration for the parent profile.
1922     *
1923     * @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
1924     * @return The password expiration time, in milliseconds since epoch.
1925     */
1926    public long getPasswordExpiration(@Nullable ComponentName admin) {
1927        if (mService != null) {
1928            try {
1929                return mService.getPasswordExpiration(admin, myUserId(), mParentInstance);
1930            } catch (RemoteException e) {
1931                throw e.rethrowFromSystemServer();
1932            }
1933        }
1934        return 0;
1935    }
1936
1937    /**
1938     * Retrieve the current password history length for a particular admin or all admins that
1939     * set retrictions on this user and its participating profiles. Restrictions on profiles that
1940     * have a separate challenge are not taken into account.
1941     *
1942     * <p>This method can be called on the {@link DevicePolicyManager} instance
1943     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1944     * restrictions on the parent profile.
1945     *
1946     * @param admin The name of the admin component to check, or {@code null} to aggregate
1947     * all admins.
1948     * @return The length of the password history
1949     */
1950    public int getPasswordHistoryLength(@Nullable ComponentName admin) {
1951        return getPasswordHistoryLength(admin, myUserId());
1952    }
1953
1954    /** @hide per-user version */
1955    public int getPasswordHistoryLength(@Nullable ComponentName admin, int userHandle) {
1956        if (mService != null) {
1957            try {
1958                return mService.getPasswordHistoryLength(admin, userHandle, mParentInstance);
1959            } catch (RemoteException e) {
1960                throw e.rethrowFromSystemServer();
1961            }
1962        }
1963        return 0;
1964    }
1965
1966    /**
1967     * Return the maximum password length that the device supports for a
1968     * particular password quality.
1969     * @param quality The quality being interrogated.
1970     * @return Returns the maximum length that the user can enter.
1971     */
1972    public int getPasswordMaximumLength(int quality) {
1973        // Kind-of arbitrary.
1974        return 16;
1975    }
1976
1977    /**
1978     * Determine whether the current password the user has set is sufficient to meet the policy
1979     * requirements (e.g. quality, minimum length) that have been requested by the admins of this
1980     * user and its participating profiles. Restrictions on profiles that have a separate challenge
1981     * are not taken into account.
1982     * <p>
1983     * The calling device admin must have requested
1984     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1985     * not, a security exception will be thrown.
1986     * <p>
1987     * This method can be called on the {@link DevicePolicyManager} instance returned by
1988     * {@link #getParentProfileInstance(ComponentName)} in order to determine if the password set on
1989     * the parent profile is sufficient.
1990     *
1991     * @return Returns true if the password meets the current requirements, else false.
1992     * @throws SecurityException if the calling application does not own an active administrator
1993     *             that uses {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1994     */
1995    public boolean isActivePasswordSufficient() {
1996        if (mService != null) {
1997            try {
1998                return mService.isActivePasswordSufficient(myUserId(), mParentInstance);
1999            } catch (RemoteException e) {
2000                throw e.rethrowFromSystemServer();
2001            }
2002        }
2003        return false;
2004    }
2005
2006    /**
2007     * Determine whether the current profile password the user has set is sufficient
2008     * to meet the policy requirements (e.g. quality, minimum length) that have been
2009     * requested by the admins of the parent user and its profiles.
2010     *
2011     * @param userHandle the userId of the profile to check the password for.
2012     * @return Returns true if the password would meet the current requirements, else false.
2013     * @throws SecurityException if {@code userHandle} is not a managed profile.
2014     * @hide
2015     */
2016    public boolean isProfileActivePasswordSufficientForParent(int userHandle) {
2017        if (mService != null) {
2018            try {
2019                return mService.isProfileActivePasswordSufficientForParent(userHandle);
2020            } catch (RemoteException e) {
2021                throw e.rethrowFromSystemServer();
2022            }
2023        }
2024        return false;
2025    }
2026
2027    /**
2028     * Retrieve the number of times the user has failed at entering a password since that last
2029     * successful password entry.
2030     * <p>
2031     * This method can be called on the {@link DevicePolicyManager} instance returned by
2032     * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the number of failed
2033     * password attemts for the parent user.
2034     * <p>
2035     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN}
2036     * to be able to call this method; if it has not, a security exception will be thrown.
2037     *
2038     * @return The number of times user has entered an incorrect password since the last correct
2039     *         password entry.
2040     * @throws SecurityException if the calling application does not own an active administrator
2041     *             that uses {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN}
2042     */
2043    public int getCurrentFailedPasswordAttempts() {
2044        return getCurrentFailedPasswordAttempts(myUserId());
2045    }
2046
2047    /**
2048     * Retrieve the number of times the given user has failed at entering a
2049     * password since that last successful password entry.
2050     *
2051     * <p>The calling device admin must have requested
2052     * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call this method; if it has
2053     * not and it is not the system uid, a security exception will be thrown.
2054     *
2055     * @hide
2056     */
2057    public int getCurrentFailedPasswordAttempts(int userHandle) {
2058        if (mService != null) {
2059            try {
2060                return mService.getCurrentFailedPasswordAttempts(userHandle, mParentInstance);
2061            } catch (RemoteException e) {
2062                throw e.rethrowFromSystemServer();
2063            }
2064        }
2065        return -1;
2066    }
2067
2068    /**
2069     * Queries whether {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT} flag is set.
2070     *
2071     * @return true if RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set.
2072     * @hide
2073     */
2074    public boolean getDoNotAskCredentialsOnBoot() {
2075        if (mService != null) {
2076            try {
2077                return mService.getDoNotAskCredentialsOnBoot();
2078            } catch (RemoteException e) {
2079                throw e.rethrowFromSystemServer();
2080            }
2081        }
2082        return false;
2083    }
2084
2085    /**
2086     * Setting this to a value greater than zero enables a built-in policy that will perform a
2087     * device or profile wipe after too many incorrect device-unlock passwords have been entered.
2088     * This built-in policy combines watching for failed passwords and wiping the device, and
2089     * requires that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and
2090     * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}.
2091     * <p>
2092     * To implement any other policy (e.g. wiping data for a particular application only, erasing or
2093     * revoking credentials, or reporting the failure to a server), you should implement
2094     * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} instead. Do not
2095     * use this API, because if the maximum count is reached, the device or profile will be wiped
2096     * immediately, and your callback will not be invoked.
2097     * <p>
2098     * This method can be called on the {@link DevicePolicyManager} instance returned by
2099     * {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent
2100     * profile.
2101     *
2102     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2103     * @param num The number of failed password attempts at which point the device or profile will
2104     *            be wiped.
2105     * @throws SecurityException if {@code admin} is not an active administrator or does not use
2106     *             both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and
2107     *             {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}.
2108     */
2109    public void setMaximumFailedPasswordsForWipe(@NonNull ComponentName admin, int num) {
2110        if (mService != null) {
2111            try {
2112                mService.setMaximumFailedPasswordsForWipe(admin, num, mParentInstance);
2113            } catch (RemoteException e) {
2114                throw e.rethrowFromSystemServer();
2115            }
2116        }
2117    }
2118
2119    /**
2120     * Retrieve the current maximum number of login attempts that are allowed before the device
2121     * or profile is wiped, for a particular admin or all admins that set retrictions on this user
2122     * and its participating profiles. Restrictions on profiles that have a separate challenge are
2123     * not taken into account.
2124     *
2125     * <p>This method can be called on the {@link DevicePolicyManager} instance
2126     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2127     * the value for the parent profile.
2128     *
2129     * @param admin The name of the admin component to check, or {@code null} to aggregate
2130     * all admins.
2131     */
2132    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin) {
2133        return getMaximumFailedPasswordsForWipe(admin, myUserId());
2134    }
2135
2136    /** @hide per-user version */
2137    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
2138        if (mService != null) {
2139            try {
2140                return mService.getMaximumFailedPasswordsForWipe(
2141                        admin, userHandle, mParentInstance);
2142            } catch (RemoteException e) {
2143                throw e.rethrowFromSystemServer();
2144            }
2145        }
2146        return 0;
2147    }
2148
2149    /**
2150     * Returns the profile with the smallest maximum failed passwords for wipe,
2151     * for the given user. So for primary user, it might return the primary or
2152     * a managed profile. For a secondary user, it would be the same as the
2153     * user passed in.
2154     * @hide Used only by Keyguard
2155     */
2156    public int getProfileWithMinimumFailedPasswordsForWipe(int userHandle) {
2157        if (mService != null) {
2158            try {
2159                return mService.getProfileWithMinimumFailedPasswordsForWipe(
2160                        userHandle, mParentInstance);
2161            } catch (RemoteException e) {
2162                throw e.rethrowFromSystemServer();
2163            }
2164        }
2165        return UserHandle.USER_NULL;
2166    }
2167
2168    /**
2169     * Flag for {@link #resetPassword}: don't allow other admins to change
2170     * the password again until the user has entered it.
2171     */
2172    public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001;
2173
2174    /**
2175     * Flag for {@link #resetPassword}: don't ask for user credentials on device boot.
2176     * If the flag is set, the device can be booted without asking for user password.
2177     * The absence of this flag does not change the current boot requirements. This flag
2178     * can be set by the device owner only. If the app is not the device owner, the flag
2179     * is ignored. Once the flag is set, it cannot be reverted back without resetting the
2180     * device to factory defaults.
2181     */
2182    public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002;
2183
2184    /**
2185     * Force a new device unlock password (the password needed to access the entire device, not for
2186     * individual accounts) on the user. This takes effect immediately.
2187     * <p>
2188     * Calling this from a managed profile that shares the password with the owner profile will
2189     * throw a security exception.
2190     * <p>
2191     * <em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for
2192     * device admins that are not device owner and not profile owner.
2193     * The password can now only be changed if there is currently no password set.  Device owner
2194     * and profile owner can still do this.</em>
2195     * <p>
2196     * The given password must be sufficient for the current password quality and length constraints
2197     * as returned by {@link #getPasswordQuality(ComponentName)} and
2198     * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then
2199     * it will be rejected and false returned. Note that the password may be a stronger quality
2200     * (containing alphanumeric characters when the requested quality is only numeric), in which
2201     * case the currently active quality will be increased to match.
2202     * <p>
2203     * Calling with a null or empty password will clear any existing PIN, pattern or password if the
2204     * current password constraints allow it. <em>Note: This will not
2205     * work in {@link android.os.Build.VERSION_CODES#N} and later for device admins that are not
2206     * device owner and not profile owner.  Once set, the password cannot be changed to null or
2207     * empty, except by device owner or profile owner.</em>
2208     * <p>
2209     * The calling device admin must have requested
2210     * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call this method; if it has
2211     * not, a security exception will be thrown.
2212     *
2213     * @param password The new password for the user. Null or empty clears the password.
2214     * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and
2215     *            {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}.
2216     * @return Returns true if the password was applied, or false if it is not acceptable for the
2217     *         current constraints or if the user has not been decrypted yet.
2218     * @throws SecurityException if the calling application does not own an active administrator
2219     *             that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD}
2220     */
2221    public boolean resetPassword(String password, int flags) {
2222        if (mParentInstance) {
2223            throw new SecurityException("Reset password does not work across profiles.");
2224        }
2225        if (mService != null) {
2226            try {
2227                return mService.resetPassword(password, flags);
2228            } catch (RemoteException e) {
2229                throw e.rethrowFromSystemServer();
2230            }
2231        }
2232        return false;
2233    }
2234
2235    /**
2236     * Called by an application that is administering the device to set the maximum time for user
2237     * activity until the device will lock. This limits the length that the user can set. It takes
2238     * effect immediately.
2239     * <p>
2240     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2241     * to be able to call this method; if it has not, a security exception will be thrown.
2242     * <p>
2243     * This method can be called on the {@link DevicePolicyManager} instance returned by
2244     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2245     * profile.
2246     *
2247     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2248     * @param timeMs The new desired maximum time to lock in milliseconds. A value of 0 means there
2249     *            is no restriction.
2250     * @throws SecurityException if {@code admin} is not an active administrator or it does not use
2251     *             {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2252     */
2253    public void setMaximumTimeToLock(@NonNull ComponentName admin, long timeMs) {
2254        if (mService != null) {
2255            try {
2256                mService.setMaximumTimeToLock(admin, timeMs, mParentInstance);
2257            } catch (RemoteException e) {
2258                throw e.rethrowFromSystemServer();
2259            }
2260        }
2261    }
2262
2263    /**
2264     * Retrieve the current maximum time to unlock for a particular admin or all admins that set
2265     * retrictions on this user and its participating profiles. Restrictions on profiles that have
2266     * a separate challenge are not taken into account.
2267     *
2268     * <p>This method can be called on the {@link DevicePolicyManager} instance
2269     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2270     * restrictions on the parent profile.
2271     *
2272     * @param admin The name of the admin component to check, or {@code null} to aggregate
2273     * all admins.
2274     * @return time in milliseconds for the given admin or the minimum value (strictest) of
2275     * all admins if admin is null. Returns 0 if there are no restrictions.
2276     */
2277    public long getMaximumTimeToLock(@Nullable ComponentName admin) {
2278        return getMaximumTimeToLock(admin, myUserId());
2279    }
2280
2281    /** @hide per-user version */
2282    public long getMaximumTimeToLock(@Nullable ComponentName admin, int userHandle) {
2283        if (mService != null) {
2284            try {
2285                return mService.getMaximumTimeToLock(admin, userHandle, mParentInstance);
2286            } catch (RemoteException e) {
2287                throw e.rethrowFromSystemServer();
2288            }
2289        }
2290        return 0;
2291    }
2292
2293    /**
2294     * Make the device lock immediately, as if the lock screen timeout has expired at the point of
2295     * this call.
2296     * <p>
2297     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2298     * to be able to call this method; if it has not, a security exception will be thrown.
2299     * <p>
2300     * This method can be called on the {@link DevicePolicyManager} instance returned by
2301     * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
2302     *
2303     * @throws SecurityException if the calling application does not own an active administrator
2304     *             that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2305     */
2306    public void lockNow() {
2307        if (mService != null) {
2308            try {
2309                mService.lockNow(mParentInstance);
2310            } catch (RemoteException e) {
2311                throw e.rethrowFromSystemServer();
2312            }
2313        }
2314    }
2315
2316    /**
2317     * Flag for {@link #wipeData(int)}: also erase the device's external
2318     * storage (such as SD cards).
2319     */
2320    public static final int WIPE_EXTERNAL_STORAGE = 0x0001;
2321
2322    /**
2323     * Flag for {@link #wipeData(int)}: also erase the factory reset protection
2324     * data.
2325     *
2326     * <p>This flag may only be set by device owner admins; if it is set by
2327     * other admins a {@link SecurityException} will be thrown.
2328     */
2329    public static final int WIPE_RESET_PROTECTION_DATA = 0x0002;
2330
2331    /**
2332     * Ask the user data be wiped. Wiping the primary user will cause the device to reboot, erasing
2333     * all user data while next booting up.
2334     * <p>
2335     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to
2336     * be able to call this method; if it has not, a security exception will be thrown.
2337     *
2338     * @param flags Bit mask of additional options: currently supported flags are
2339     *            {@link #WIPE_EXTERNAL_STORAGE} and {@link #WIPE_RESET_PROTECTION_DATA}.
2340     * @throws SecurityException if the calling application does not own an active administrator
2341     *             that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
2342     */
2343    public void wipeData(int flags) {
2344        if (mService != null) {
2345            try {
2346                mService.wipeData(flags);
2347            } catch (RemoteException e) {
2348                throw e.rethrowFromSystemServer();
2349            }
2350        }
2351    }
2352
2353    /**
2354     * Called by an application that is administering the device to set the
2355     * global proxy and exclusion list.
2356     * <p>
2357     * The calling device admin must have requested
2358     * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call
2359     * this method; if it has not, a security exception will be thrown.
2360     * Only the first device admin can set the proxy. If a second admin attempts
2361     * to set the proxy, the {@link ComponentName} of the admin originally setting the
2362     * proxy will be returned. If successful in setting the proxy, {@code null} will
2363     * be returned.
2364     * The method can be called repeatedly by the device admin alrady setting the
2365     * proxy to update the proxy and exclusion list.
2366     *
2367     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2368     * @param proxySpec the global proxy desired. Must be an HTTP Proxy.
2369     *            Pass Proxy.NO_PROXY to reset the proxy.
2370     * @param exclusionList a list of domains to be excluded from the global proxy.
2371     * @return {@code null} if the proxy was successfully set, or otherwise a {@link ComponentName}
2372     *            of the device admin that sets the proxy.
2373     * @hide
2374     */
2375    public ComponentName setGlobalProxy(@NonNull ComponentName admin, Proxy proxySpec,
2376            List<String> exclusionList ) {
2377        if (proxySpec == null) {
2378            throw new NullPointerException();
2379        }
2380        if (mService != null) {
2381            try {
2382                String hostSpec;
2383                String exclSpec;
2384                if (proxySpec.equals(Proxy.NO_PROXY)) {
2385                    hostSpec = null;
2386                    exclSpec = null;
2387                } else {
2388                    if (!proxySpec.type().equals(Proxy.Type.HTTP)) {
2389                        throw new IllegalArgumentException();
2390                    }
2391                    InetSocketAddress sa = (InetSocketAddress)proxySpec.address();
2392                    String hostName = sa.getHostName();
2393                    int port = sa.getPort();
2394                    StringBuilder hostBuilder = new StringBuilder();
2395                    hostSpec = hostBuilder.append(hostName)
2396                        .append(":").append(Integer.toString(port)).toString();
2397                    if (exclusionList == null) {
2398                        exclSpec = "";
2399                    } else {
2400                        StringBuilder listBuilder = new StringBuilder();
2401                        boolean firstDomain = true;
2402                        for (String exclDomain : exclusionList) {
2403                            if (!firstDomain) {
2404                                listBuilder = listBuilder.append(",");
2405                            } else {
2406                                firstDomain = false;
2407                            }
2408                            listBuilder = listBuilder.append(exclDomain.trim());
2409                        }
2410                        exclSpec = listBuilder.toString();
2411                    }
2412                    if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec)
2413                            != android.net.Proxy.PROXY_VALID)
2414                        throw new IllegalArgumentException();
2415                }
2416                return mService.setGlobalProxy(admin, hostSpec, exclSpec);
2417            } catch (RemoteException e) {
2418                throw e.rethrowFromSystemServer();
2419            }
2420        }
2421        return null;
2422    }
2423
2424    /**
2425     * Set a network-independent global HTTP proxy. This is not normally what you want for typical
2426     * HTTP proxies - they are generally network dependent. However if you're doing something
2427     * unusual like general internal filtering this may be useful. On a private network where the
2428     * proxy is not accessible, you may break HTTP using this.
2429     * <p>
2430     * This method requires the caller to be the device owner.
2431     * <p>
2432     * This proxy is only a recommendation and it is possible that some apps will ignore it.
2433     *
2434     * @see ProxyInfo
2435     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2436     * @param proxyInfo The a {@link ProxyInfo} object defining the new global HTTP proxy. A
2437     *            {@code null} value will clear the global HTTP proxy.
2438     * @throws SecurityException if {@code admin} is not the device owner.
2439     */
2440    public void setRecommendedGlobalProxy(@NonNull ComponentName admin, @Nullable ProxyInfo
2441            proxyInfo) {
2442        if (mService != null) {
2443            try {
2444                mService.setRecommendedGlobalProxy(admin, proxyInfo);
2445            } catch (RemoteException e) {
2446                throw e.rethrowFromSystemServer();
2447            }
2448        }
2449    }
2450
2451    /**
2452     * Returns the component name setting the global proxy.
2453     * @return ComponentName object of the device admin that set the global proxy, or {@code null}
2454     *         if no admin has set the proxy.
2455     * @hide
2456     */
2457    public ComponentName getGlobalProxyAdmin() {
2458        if (mService != null) {
2459            try {
2460                return mService.getGlobalProxyAdmin(myUserId());
2461            } catch (RemoteException e) {
2462                throw e.rethrowFromSystemServer();
2463            }
2464        }
2465        return null;
2466    }
2467
2468    /**
2469     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
2470     * indicating that encryption is not supported.
2471     */
2472    public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0;
2473
2474    /**
2475     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
2476     * indicating that encryption is supported, but is not currently active.
2477     */
2478    public static final int ENCRYPTION_STATUS_INACTIVE = 1;
2479
2480    /**
2481     * Result code for {@link #getStorageEncryptionStatus}:
2482     * indicating that encryption is not currently active, but is currently
2483     * being activated.  This is only reported by devices that support
2484     * encryption of data and only when the storage is currently
2485     * undergoing a process of becoming encrypted.  A device that must reboot and/or wipe data
2486     * to become encrypted will never return this value.
2487     */
2488    public static final int ENCRYPTION_STATUS_ACTIVATING = 2;
2489
2490    /**
2491     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
2492     * indicating that encryption is active.
2493     */
2494    public static final int ENCRYPTION_STATUS_ACTIVE = 3;
2495
2496    /**
2497     * Result code for {@link #getStorageEncryptionStatus}:
2498     * indicating that encryption is active, but an encryption key has not
2499     * been set by the user.
2500     */
2501    public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4;
2502
2503    /**
2504     * Result code for {@link #getStorageEncryptionStatus}:
2505     * indicating that encryption is active and the encryption key is tied to the user.
2506     */
2507    public static final int ENCRYPTION_STATUS_ACTIVE_PER_USER = 5;
2508
2509    /**
2510     * Activity action: begin the process of encrypting data on the device.  This activity should
2511     * be launched after using {@link #setStorageEncryption} to request encryption be activated.
2512     * After resuming from this activity, use {@link #getStorageEncryption}
2513     * to check encryption status.  However, on some devices this activity may never return, as
2514     * it may trigger a reboot and in some cases a complete data wipe of the device.
2515     */
2516    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
2517    public static final String ACTION_START_ENCRYPTION
2518            = "android.app.action.START_ENCRYPTION";
2519    /**
2520     * Widgets are enabled in keyguard
2521     */
2522    public static final int KEYGUARD_DISABLE_FEATURES_NONE = 0;
2523
2524    /**
2525     * Disable all keyguard widgets. Has no effect.
2526     */
2527    public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1 << 0;
2528
2529    /**
2530     * Disable the camera on secure keyguard screens (e.g. PIN/Pattern/Password)
2531     */
2532    public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 1 << 1;
2533
2534    /**
2535     * Disable showing all notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
2536     */
2537    public static final int KEYGUARD_DISABLE_SECURE_NOTIFICATIONS = 1 << 2;
2538
2539    /**
2540     * Only allow redacted notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
2541     */
2542    public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 1 << 3;
2543
2544    /**
2545     * Ignore trust agent state on secure keyguard screens
2546     * (e.g. PIN/Pattern/Password).
2547     */
2548    public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4;
2549
2550    /**
2551     * Disable fingerprint sensor on keyguard secure screens (e.g. PIN/Pattern/Password).
2552     */
2553    public static final int KEYGUARD_DISABLE_FINGERPRINT = 1 << 5;
2554
2555    /**
2556     * Disable all current and future keyguard customizations.
2557     */
2558    public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff;
2559
2560    /**
2561     * Called by an application that is administering the device to request that the storage system
2562     * be encrypted.
2563     * <p>
2564     * When multiple device administrators attempt to control device encryption, the most secure,
2565     * supported setting will always be used. If any device administrator requests device
2566     * encryption, it will be enabled; Conversely, if a device administrator attempts to disable
2567     * device encryption while another device administrator has enabled it, the call to disable will
2568     * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}).
2569     * <p>
2570     * This policy controls encryption of the secure (application data) storage area. Data written
2571     * to other storage areas may or may not be encrypted, and this policy does not require or
2572     * control the encryption of any other storage areas. There is one exception: If
2573     * {@link android.os.Environment#isExternalStorageEmulated()} is {@code true}, then the
2574     * directory returned by {@link android.os.Environment#getExternalStorageDirectory()} must be
2575     * written to disk within the encrypted storage area.
2576     * <p>
2577     * Important Note: On some devices, it is possible to encrypt storage without requiring the user
2578     * to create a device PIN or Password. In this case, the storage is encrypted, but the
2579     * encryption key may not be fully secured. For maximum security, the administrator should also
2580     * require (and check for) a pattern, PIN, or password.
2581     *
2582     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2583     * @param encrypt true to request encryption, false to release any previous request
2584     * @return the new request status (for all active admins) - will be one of
2585     *         {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or
2586     *         {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use
2587     *         {@link #getStorageEncryptionStatus()} to query the actual device state.
2588     * @throws SecurityException if {@code admin} is not an active administrator or does not use
2589     *             {@link DeviceAdminInfo#USES_ENCRYPTED_STORAGE}
2590     */
2591    public int setStorageEncryption(@NonNull ComponentName admin, boolean encrypt) {
2592        if (mService != null) {
2593            try {
2594                return mService.setStorageEncryption(admin, encrypt);
2595            } catch (RemoteException e) {
2596                throw e.rethrowFromSystemServer();
2597            }
2598        }
2599        return ENCRYPTION_STATUS_UNSUPPORTED;
2600    }
2601
2602    /**
2603     * Called by an application that is administering the device to
2604     * determine the requested setting for secure storage.
2605     *
2606     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.  If null,
2607     * this will return the requested encryption setting as an aggregate of all active
2608     * administrators.
2609     * @return true if the admin(s) are requesting encryption, false if not.
2610     */
2611    public boolean getStorageEncryption(@Nullable ComponentName admin) {
2612        if (mService != null) {
2613            try {
2614                return mService.getStorageEncryption(admin, myUserId());
2615            } catch (RemoteException e) {
2616                throw e.rethrowFromSystemServer();
2617            }
2618        }
2619        return false;
2620    }
2621
2622    /**
2623     * Called by an application that is administering the device to
2624     * determine the current encryption status of the device.
2625     *
2626     * Depending on the returned status code, the caller may proceed in different
2627     * ways.  If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the
2628     * storage system does not support encryption.  If the
2629     * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link
2630     * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the
2631     * storage.  If the result is {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY}, the
2632     * storage system has enabled encryption but no password is set so further action
2633     * may be required.  If the result is {@link #ENCRYPTION_STATUS_ACTIVATING} or
2634     * {@link #ENCRYPTION_STATUS_ACTIVE}, no further action is required.
2635     *
2636     * @return current status of encryption. The value will be one of
2637     * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE},
2638     * {@link #ENCRYPTION_STATUS_ACTIVATING}, {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY},
2639     * or {@link #ENCRYPTION_STATUS_ACTIVE}.
2640     */
2641    public int getStorageEncryptionStatus() {
2642        return getStorageEncryptionStatus(myUserId());
2643    }
2644
2645    /** @hide per-user version */
2646    public int getStorageEncryptionStatus(int userHandle) {
2647        if (mService != null) {
2648            try {
2649                return mService.getStorageEncryptionStatus(mContext.getPackageName(), userHandle);
2650            } catch (RemoteException e) {
2651                throw e.rethrowFromSystemServer();
2652            }
2653        }
2654        return ENCRYPTION_STATUS_UNSUPPORTED;
2655    }
2656
2657    /**
2658     * Installs the given certificate as a user CA.
2659     *
2660     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2661     *              {@code null} if calling from a delegated certificate installer.
2662     * @param certBuffer encoded form of the certificate to install.
2663     *
2664     * @return false if the certBuffer cannot be parsed or installation is
2665     *         interrupted, true otherwise.
2666     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2667     *         owner.
2668     */
2669    public boolean installCaCert(@Nullable ComponentName admin, byte[] certBuffer) {
2670        if (mService != null) {
2671            try {
2672                return mService.installCaCert(admin, certBuffer);
2673            } catch (RemoteException e) {
2674                throw e.rethrowFromSystemServer();
2675            }
2676        }
2677        return false;
2678    }
2679
2680    /**
2681     * Uninstalls the given certificate from trusted user CAs, if present.
2682     *
2683     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2684     *              {@code null} if calling from a delegated certificate installer.
2685     * @param certBuffer encoded form of the certificate to remove.
2686     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2687     *         owner.
2688     */
2689    public void uninstallCaCert(@Nullable ComponentName admin, byte[] certBuffer) {
2690        if (mService != null) {
2691            try {
2692                final String alias = getCaCertAlias(certBuffer);
2693                mService.uninstallCaCerts(admin, new String[] {alias});
2694            } catch (CertificateException e) {
2695                Log.w(TAG, "Unable to parse certificate", e);
2696            } catch (RemoteException e) {
2697                throw e.rethrowFromSystemServer();
2698            }
2699        }
2700    }
2701
2702    /**
2703     * Returns all CA certificates that are currently trusted, excluding system CA certificates.
2704     * If a user has installed any certificates by other means than device policy these will be
2705     * included too.
2706     *
2707     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2708     *              {@code null} if calling from a delegated certificate installer.
2709     * @return a List of byte[] arrays, each encoding one user CA certificate.
2710     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2711     *         owner.
2712     */
2713    public List<byte[]> getInstalledCaCerts(@Nullable ComponentName admin) {
2714        List<byte[]> certs = new ArrayList<byte[]>();
2715        if (mService != null) {
2716            try {
2717                mService.enforceCanManageCaCerts(admin);
2718                final TrustedCertificateStore certStore = new TrustedCertificateStore();
2719                for (String alias : certStore.userAliases()) {
2720                    try {
2721                        certs.add(certStore.getCertificate(alias).getEncoded());
2722                    } catch (CertificateException ce) {
2723                        Log.w(TAG, "Could not encode certificate: " + alias, ce);
2724                    }
2725                }
2726            } catch (RemoteException re) {
2727                throw re.rethrowFromSystemServer();
2728            }
2729        }
2730        return certs;
2731    }
2732
2733    /**
2734     * Uninstalls all custom trusted CA certificates from the profile. Certificates installed by
2735     * means other than device policy will also be removed, except for system CA certificates.
2736     *
2737     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2738     *              {@code null} if calling from a delegated certificate installer.
2739     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2740     *         owner.
2741     */
2742    public void uninstallAllUserCaCerts(@Nullable ComponentName admin) {
2743        if (mService != null) {
2744            try {
2745                mService.uninstallCaCerts(admin, new TrustedCertificateStore().userAliases()
2746                        .toArray(new String[0]));
2747            } catch (RemoteException re) {
2748                throw re.rethrowFromSystemServer();
2749            }
2750        }
2751    }
2752
2753    /**
2754     * Returns whether this certificate is installed as a trusted CA.
2755     *
2756     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2757     *              {@code null} if calling from a delegated certificate installer.
2758     * @param certBuffer encoded form of the certificate to look up.
2759     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2760     *         owner.
2761     */
2762    public boolean hasCaCertInstalled(@Nullable ComponentName admin, byte[] certBuffer) {
2763        if (mService != null) {
2764            try {
2765                mService.enforceCanManageCaCerts(admin);
2766                return getCaCertAlias(certBuffer) != null;
2767            } catch (RemoteException re) {
2768                throw re.rethrowFromSystemServer();
2769            } catch (CertificateException ce) {
2770                Log.w(TAG, "Could not parse certificate", ce);
2771            }
2772        }
2773        return false;
2774    }
2775
2776    /**
2777     * Called by a device or profile owner, or delegated certificate installer, to install a
2778     * certificate and corresponding private key. All apps within the profile will be able to access
2779     * the certificate and use the private key, given direct user approval.
2780     *
2781     * <p>Access to the installed credentials will not be granted to the caller of this API without
2782     * direct user approval. This is for security - should a certificate installer become
2783     * compromised, certificates it had already installed will be protected.
2784     *
2785     * <p>If the installer must have access to the credentials, call
2786     * {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, boolean)} instead.
2787     *
2788     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2789     *            {@code null} if calling from a delegated certificate installer.
2790     * @param privKey The private key to install.
2791     * @param cert The certificate to install.
2792     * @param alias The private key alias under which to install the certificate. If a certificate
2793     * with that alias already exists, it will be overwritten.
2794     * @return {@code true} if the keys were installed, {@code false} otherwise.
2795     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2796     *         owner.
2797     */
2798    public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
2799            @NonNull Certificate cert, @NonNull String alias) {
2800        return installKeyPair(admin, privKey, new Certificate[] {cert}, alias, false);
2801    }
2802
2803    /**
2804     * Called by a device or profile owner, or delegated certificate installer, to install a
2805     * certificate chain and corresponding private key for the leaf certificate. All apps within the
2806     * profile will be able to access the certificate chain and use the private key, given direct
2807     * user approval.
2808     *
2809     * <p>The caller of this API may grant itself access to the certificate and private key
2810     * immediately, without user approval. It is a best practice not to request this unless strictly
2811     * necessary since it opens up additional security vulnerabilities.
2812     *
2813     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2814     *        {@code null} if calling from a delegated certificate installer.
2815     * @param privKey The private key to install.
2816     * @param certs The certificate chain to install. The chain should start with the leaf
2817     *        certificate and include the chain of trust in order. This will be returned by
2818     *        {@link android.security.KeyChain#getCertificateChain}.
2819     * @param alias The private key alias under which to install the certificate. If a certificate
2820     *        with that alias already exists, it will be overwritten.
2821     * @param requestAccess {@code true} to request that the calling app be granted access to the
2822     *        credentials immediately. Otherwise, access to the credentials will be gated by user
2823     *        approval.
2824     * @return {@code true} if the keys were installed, {@code false} otherwise.
2825     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2826     *         owner.
2827     * @see android.security.KeyChain#getCertificateChain
2828     */
2829    public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
2830            @NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess) {
2831        try {
2832            final byte[] pemCert = Credentials.convertToPem(certs[0]);
2833            byte[] pemChain = null;
2834            if (certs.length > 1) {
2835                pemChain = Credentials.convertToPem(Arrays.copyOfRange(certs, 1, certs.length));
2836            }
2837            final byte[] pkcs8Key = KeyFactory.getInstance(privKey.getAlgorithm())
2838                    .getKeySpec(privKey, PKCS8EncodedKeySpec.class).getEncoded();
2839            return mService.installKeyPair(admin, pkcs8Key, pemCert, pemChain, alias,
2840                    requestAccess);
2841        } catch (RemoteException e) {
2842            throw e.rethrowFromSystemServer();
2843        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
2844            Log.w(TAG, "Failed to obtain private key material", e);
2845        } catch (CertificateException | IOException e) {
2846            Log.w(TAG, "Could not pem-encode certificate", e);
2847        }
2848        return false;
2849    }
2850
2851    /**
2852     * Called by a device or profile owner, or delegated certificate installer, to remove a
2853     * certificate and private key pair installed under a given alias.
2854     *
2855     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
2856     *        {@code null} if calling from a delegated certificate installer.
2857     * @param alias The private key alias under which the certificate is installed.
2858     * @return {@code true} if the private key alias no longer exists, {@code false} otherwise.
2859     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
2860     *         owner.
2861     */
2862    public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) {
2863        try {
2864            return mService.removeKeyPair(admin, alias);
2865        } catch (RemoteException e) {
2866            throw e.rethrowFromSystemServer();
2867        }
2868    }
2869
2870    /**
2871     * @return the alias of a given CA certificate in the certificate store, or {@code null} if it
2872     * doesn't exist.
2873     */
2874    private static String getCaCertAlias(byte[] certBuffer) throws CertificateException {
2875        final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
2876        final X509Certificate cert = (X509Certificate) certFactory.generateCertificate(
2877                              new ByteArrayInputStream(certBuffer));
2878        return new TrustedCertificateStore().getCertificateAlias(cert);
2879    }
2880
2881    /**
2882     * Called by a profile owner or device owner to grant access to privileged certificate
2883     * manipulation APIs to a third-party certificate installer app. Granted APIs include
2884     * {@link #getInstalledCaCerts}, {@link #hasCaCertInstalled}, {@link #installCaCert},
2885     * {@link #uninstallCaCert}, {@link #uninstallAllUserCaCerts} and {@link #installKeyPair}.
2886     * <p>
2887     * Delegated certificate installer is a per-user state. The delegated access is persistent until
2888     * it is later cleared by calling this method with a null value or uninstallling the certificate
2889     * installer.
2890     * <p>
2891     * <b>Note:</b>Starting from {@link android.os.Build.VERSION_CODES#N}, if the caller
2892     * application's target SDK version is {@link android.os.Build.VERSION_CODES#N} or newer, the
2893     * supplied certificate installer package must be installed when calling this API, otherwise an
2894     * {@link IllegalArgumentException} will be thrown.
2895     *
2896     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2897     * @param installerPackage The package name of the certificate installer which will be given
2898     *            access. If {@code null} is given the current package will be cleared.
2899     * @throws SecurityException if {@code admin} is not a device or a profile owner.
2900     */
2901    public void setCertInstallerPackage(@NonNull ComponentName admin, @Nullable String
2902            installerPackage) throws SecurityException {
2903        if (mService != null) {
2904            try {
2905                mService.setCertInstallerPackage(admin, installerPackage);
2906            } catch (RemoteException e) {
2907                throw e.rethrowFromSystemServer();
2908            }
2909        }
2910    }
2911
2912    /**
2913     * Called by a profile owner or device owner to retrieve the certificate installer for the user.
2914     * null if none is set.
2915     *
2916     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2917     * @return The package name of the current delegated certificate installer, or {@code null} if
2918     *         none is set.
2919     * @throws SecurityException if {@code admin} is not a device or a profile owner.
2920     */
2921    public String getCertInstallerPackage(@NonNull ComponentName admin) throws SecurityException {
2922        if (mService != null) {
2923            try {
2924                return mService.getCertInstallerPackage(admin);
2925            } catch (RemoteException e) {
2926                throw e.rethrowFromSystemServer();
2927            }
2928        }
2929        return null;
2930    }
2931
2932    /**
2933     * Called by a device or profile owner to configure an always-on VPN connection through a
2934     * specific application for the current user. This connection is automatically granted and
2935     * persisted after a reboot.
2936     * <p>
2937     * The designated package should declare a {@link android.net.VpnService} in its manifest
2938     * guarded by {@link android.Manifest.permission#BIND_VPN_SERVICE}, otherwise the call will
2939     * fail.
2940     *
2941     * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to
2942     *            remove an existing always-on VPN configuration.
2943     * @return {@code true} if the package is set as always-on VPN controller; {@code false}
2944     *         otherwise.
2945     * @throws SecurityException if {@code admin} is not a device or a profile owner.
2946     */
2947    public boolean setAlwaysOnVpnPackage(@NonNull ComponentName admin,
2948            @Nullable String vpnPackage) {
2949        if (mService != null) {
2950            try {
2951                return mService.setAlwaysOnVpnPackage(admin, vpnPackage);
2952            } catch (RemoteException e) {
2953                throw e.rethrowFromSystemServer();
2954            }
2955        }
2956        return false;
2957    }
2958
2959    /**
2960     * Called by a device or profile owner to read the name of the package administering an
2961     * always-on VPN connection for the current user. If there is no such package, or the always-on
2962     * VPN is provided by the system instead of by an application, {@code null} will be returned.
2963     *
2964     * @return Package name of VPN controller responsible for always-on VPN, or {@code null} if none
2965     *         is set.
2966     * @throws SecurityException if {@code admin} is not a device or a profile owner.
2967     */
2968    public String getAlwaysOnVpnPackage(@NonNull ComponentName admin) {
2969        if (mService != null) {
2970            try {
2971                return mService.getAlwaysOnVpnPackage(admin);
2972            } catch (RemoteException e) {
2973                throw e.rethrowFromSystemServer();
2974            }
2975        }
2976        return null;
2977    }
2978
2979    /**
2980     * Called by an application that is administering the device to disable all cameras on the
2981     * device, for this user. After setting this, no applications running as this user will be able
2982     * to access any cameras on the device.
2983     * <p>
2984     * If the caller is device owner, then the restriction will be applied to all users.
2985     * <p>
2986     * The calling device admin must have requested
2987     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call this method; if it has
2988     * not, a security exception will be thrown.
2989     *
2990     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2991     * @param disabled Whether or not the camera should be disabled.
2992     * @throws SecurityException if {@code admin} is not an active administrator or does not use
2993     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA}.
2994     */
2995    public void setCameraDisabled(@NonNull ComponentName admin, boolean disabled) {
2996        if (mService != null) {
2997            try {
2998                mService.setCameraDisabled(admin, disabled);
2999            } catch (RemoteException e) {
3000                throw e.rethrowFromSystemServer();
3001            }
3002        }
3003    }
3004
3005    /**
3006     * Determine whether or not the device's cameras have been disabled for this user,
3007     * either by the calling admin, if specified, or all admins.
3008     * @param admin The name of the admin component to check, or {@code null} to check whether any admins
3009     * have disabled the camera
3010     */
3011    public boolean getCameraDisabled(@Nullable ComponentName admin) {
3012        return getCameraDisabled(admin, myUserId());
3013    }
3014
3015    /** @hide per-user version */
3016    public boolean getCameraDisabled(@Nullable ComponentName admin, int userHandle) {
3017        if (mService != null) {
3018            try {
3019                return mService.getCameraDisabled(admin, userHandle);
3020            } catch (RemoteException e) {
3021                throw e.rethrowFromSystemServer();
3022            }
3023        }
3024        return false;
3025    }
3026
3027    /**
3028     * Called by a device owner to request a bugreport.
3029     * <p>
3030     * There must be only one user on the device, managed by the device owner. Otherwise a
3031     * {@link SecurityException} will be thrown.
3032     *
3033     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3034     * @return {@code true} if the bugreport collection started successfully, or {@code false} if it
3035     *         wasn't triggered because a previous bugreport operation is still active (either the
3036     *         bugreport is still running or waiting for the user to share or decline)
3037     * @throws SecurityException if {@code admin} is not a device owner, or if there are users other
3038     *             than the one managed by the device owner.
3039     */
3040    public boolean requestBugreport(@NonNull ComponentName admin) {
3041        if (mService != null) {
3042            try {
3043                return mService.requestBugreport(admin);
3044            } catch (RemoteException e) {
3045                throw e.rethrowFromSystemServer();
3046            }
3047        }
3048        return false;
3049    }
3050
3051    /**
3052     * Determine whether or not creating a guest user has been disabled for the device
3053     *
3054     * @hide
3055     */
3056    public boolean getGuestUserDisabled(@Nullable ComponentName admin) {
3057        // Currently guest users can always be created if multi-user is enabled
3058        // TODO introduce a policy for guest user creation
3059        return false;
3060    }
3061
3062    /**
3063     * Called by a device/profile owner to set whether the screen capture is disabled. Disabling
3064     * screen capture also prevents the content from being shown on display devices that do not have
3065     * a secure video output. See {@link android.view.Display#FLAG_SECURE} for more details about
3066     * secure surfaces and secure displays.
3067     * <p>
3068     * The calling device admin must be a device or profile owner. If it is not, a security
3069     * exception will be thrown.
3070     * <p>
3071     * From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also blocks
3072     * assist requests for all activities of the relevant user.
3073     *
3074     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3075     * @param disabled Whether screen capture is disabled or not.
3076     * @throws SecurityException if {@code admin} is not a device or profile owner.
3077     */
3078    public void setScreenCaptureDisabled(@NonNull ComponentName admin, boolean disabled) {
3079        if (mService != null) {
3080            try {
3081                mService.setScreenCaptureDisabled(admin, disabled);
3082            } catch (RemoteException e) {
3083                throw e.rethrowFromSystemServer();
3084            }
3085        }
3086    }
3087
3088    /**
3089     * Determine whether or not screen capture has been disabled by the calling
3090     * admin, if specified, or all admins.
3091     * @param admin The name of the admin component to check, or {@code null} to check whether any admins
3092     * have disabled screen capture.
3093     */
3094    public boolean getScreenCaptureDisabled(@Nullable ComponentName admin) {
3095        return getScreenCaptureDisabled(admin, myUserId());
3096    }
3097
3098    /** @hide per-user version */
3099    public boolean getScreenCaptureDisabled(@Nullable ComponentName admin, int userHandle) {
3100        if (mService != null) {
3101            try {
3102                return mService.getScreenCaptureDisabled(admin, userHandle);
3103            } catch (RemoteException e) {
3104                throw e.rethrowFromSystemServer();
3105            }
3106        }
3107        return false;
3108    }
3109
3110    /**
3111     * Called by a device owner to set whether auto time is required. If auto time is required the
3112     * user cannot set the date and time, but has to use network date and time.
3113     * <p>
3114     * Note: if auto time is required the user can still manually set the time zone.
3115     * <p>
3116     * The calling device admin must be a device owner. If it is not, a security exception will be
3117     * thrown.
3118     *
3119     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3120     * @param required Whether auto time is set required or not.
3121     * @throws SecurityException if {@code admin} is not a device owner.
3122     */
3123    public void setAutoTimeRequired(@NonNull ComponentName admin, boolean required) {
3124        if (mService != null) {
3125            try {
3126                mService.setAutoTimeRequired(admin, required);
3127            } catch (RemoteException e) {
3128                throw e.rethrowFromSystemServer();
3129            }
3130        }
3131    }
3132
3133    /**
3134     * @return true if auto time is required.
3135     */
3136    public boolean getAutoTimeRequired() {
3137        if (mService != null) {
3138            try {
3139                return mService.getAutoTimeRequired();
3140            } catch (RemoteException e) {
3141                throw e.rethrowFromSystemServer();
3142            }
3143        }
3144        return false;
3145    }
3146
3147    /**
3148     * Called by a device owner to set whether all users created on the device should be ephemeral.
3149     * <p>
3150     * The system user is exempt from this policy - it is never ephemeral.
3151     * <p>
3152     * The calling device admin must be the device owner. If it is not, a security exception will be
3153     * thrown.
3154     *
3155     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3156     * @param forceEphemeralUsers If true, all the existing users will be deleted and all
3157     *            subsequently created users will be ephemeral.
3158     * @throws SecurityException if {@code admin} is not a device owner.
3159     * @hide
3160     */
3161    public void setForceEphemeralUsers(
3162            @NonNull ComponentName admin, boolean forceEphemeralUsers) {
3163        if (mService != null) {
3164            try {
3165                mService.setForceEphemeralUsers(admin, forceEphemeralUsers);
3166            } catch (RemoteException e) {
3167                throw e.rethrowFromSystemServer();
3168            }
3169        }
3170    }
3171
3172    /**
3173     * @return true if all users are created ephemeral.
3174     * @throws SecurityException if {@code admin} is not a device owner.
3175     * @hide
3176     */
3177    public boolean getForceEphemeralUsers(@NonNull ComponentName admin) {
3178        if (mService != null) {
3179            try {
3180                return mService.getForceEphemeralUsers(admin);
3181            } catch (RemoteException e) {
3182                throw e.rethrowFromSystemServer();
3183            }
3184        }
3185        return false;
3186    }
3187
3188    /**
3189     * Called by an application that is administering the device to disable keyguard customizations,
3190     * such as widgets. After setting this, keyguard features will be disabled according to the
3191     * provided feature list.
3192     * <p>
3193     * The calling device admin must have requested
3194     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method;
3195     * if it has not, a security exception will be thrown.
3196     * <p>
3197     * Calling this from a managed profile before version {@link android.os.Build.VERSION_CODES#M}
3198     * will throw a security exception. From version {@link android.os.Build.VERSION_CODES#M} the
3199     * profile owner of a managed profile can set:
3200     * <ul>
3201     * <li>{@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which affects the parent user, but only if there
3202     * is no separate challenge set on the managed profile.
3203     * <li>{@link #KEYGUARD_DISABLE_FINGERPRINT} which affects the managed profile challenge if
3204     * there is one, or the parent user otherwise.
3205     * <li>{@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS} which affects notifications generated
3206     * by applications in the managed profile.
3207     * </ul>
3208     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} and {@link #KEYGUARD_DISABLE_FINGERPRINT} can also be
3209     * set on the {@link DevicePolicyManager} instance returned by
3210     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
3211     * profile.
3212     * <p>
3213     * Requests to disable other features on a managed profile will be ignored.
3214     * <p>
3215     * The admin can check which features have been disabled by calling
3216     * {@link #getKeyguardDisabledFeatures(ComponentName)}
3217     *
3218     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3219     * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default),
3220     *            {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA},
3221     *            {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS},
3222     *            {@link #KEYGUARD_DISABLE_TRUST_AGENTS},
3223     *            {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},
3224     *            {@link #KEYGUARD_DISABLE_FINGERPRINT}, {@link #KEYGUARD_DISABLE_FEATURES_ALL}
3225     * @throws SecurityException if {@code admin} is not an active administrator or does not user
3226     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES}
3227     */
3228    public void setKeyguardDisabledFeatures(@NonNull ComponentName admin, int which) {
3229        if (mService != null) {
3230            try {
3231                mService.setKeyguardDisabledFeatures(admin, which, mParentInstance);
3232            } catch (RemoteException e) {
3233                throw e.rethrowFromSystemServer();
3234            }
3235        }
3236    }
3237
3238    /**
3239     * Determine whether or not features have been disabled in keyguard either by the calling
3240     * admin, if specified, or all admins that set retrictions on this user and its participating
3241     * profiles. Restrictions on profiles that have a separate challenge are not taken into account.
3242     *
3243     * <p>This method can be called on the {@link DevicePolicyManager} instance
3244     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
3245     * restrictions on the parent profile.
3246     *
3247     * @param admin The name of the admin component to check, or {@code null} to check whether any
3248     * admins have disabled features in keyguard.
3249     * @return bitfield of flags. See {@link #setKeyguardDisabledFeatures(ComponentName, int)}
3250     * for a list.
3251     */
3252    public int getKeyguardDisabledFeatures(@Nullable ComponentName admin) {
3253        return getKeyguardDisabledFeatures(admin, myUserId());
3254    }
3255
3256    /** @hide per-user version */
3257    public int getKeyguardDisabledFeatures(@Nullable ComponentName admin, int userHandle) {
3258        if (mService != null) {
3259            try {
3260                return mService.getKeyguardDisabledFeatures(admin, userHandle, mParentInstance);
3261            } catch (RemoteException e) {
3262                throw e.rethrowFromSystemServer();
3263            }
3264        }
3265        return KEYGUARD_DISABLE_FEATURES_NONE;
3266    }
3267
3268    /**
3269     * @hide
3270     */
3271    public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing,
3272            int userHandle) {
3273        if (mService != null) {
3274            try {
3275                mService.setActiveAdmin(policyReceiver, refreshing, userHandle);
3276            } catch (RemoteException e) {
3277                throw e.rethrowFromSystemServer();
3278            }
3279        }
3280    }
3281
3282    /**
3283     * @hide
3284     */
3285    public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing) {
3286        setActiveAdmin(policyReceiver, refreshing, myUserId());
3287    }
3288
3289    /**
3290     * @hide
3291     */
3292    public void getRemoveWarning(@Nullable ComponentName admin, RemoteCallback result) {
3293        if (mService != null) {
3294            try {
3295                mService.getRemoveWarning(admin, result, myUserId());
3296            } catch (RemoteException e) {
3297                throw e.rethrowFromSystemServer();
3298            }
3299        }
3300    }
3301
3302    /**
3303     * @hide
3304     */
3305    public void setActivePasswordState(int quality, int length, int letters, int uppercase,
3306            int lowercase, int numbers, int symbols, int nonletter, int userHandle) {
3307        if (mService != null) {
3308            try {
3309                mService.setActivePasswordState(quality, length, letters, uppercase, lowercase,
3310                        numbers, symbols, nonletter, userHandle);
3311            } catch (RemoteException e) {
3312                throw e.rethrowFromSystemServer();
3313            }
3314        }
3315    }
3316
3317    /**
3318     * @hide
3319     */
3320    public void reportFailedPasswordAttempt(int userHandle) {
3321        if (mService != null) {
3322            try {
3323                mService.reportFailedPasswordAttempt(userHandle);
3324            } catch (RemoteException e) {
3325                throw e.rethrowFromSystemServer();
3326            }
3327        }
3328    }
3329
3330    /**
3331     * @hide
3332     */
3333    public void reportSuccessfulPasswordAttempt(int userHandle) {
3334        if (mService != null) {
3335            try {
3336                mService.reportSuccessfulPasswordAttempt(userHandle);
3337            } catch (RemoteException e) {
3338                throw e.rethrowFromSystemServer();
3339            }
3340        }
3341    }
3342
3343    /**
3344     * @hide
3345     */
3346    public void reportFailedFingerprintAttempt(int userHandle) {
3347        if (mService != null) {
3348            try {
3349                mService.reportFailedFingerprintAttempt(userHandle);
3350            } catch (RemoteException e) {
3351                throw e.rethrowFromSystemServer();
3352            }
3353        }
3354    }
3355
3356    /**
3357     * @hide
3358     */
3359    public void reportSuccessfulFingerprintAttempt(int userHandle) {
3360        if (mService != null) {
3361            try {
3362                mService.reportSuccessfulFingerprintAttempt(userHandle);
3363            } catch (RemoteException e) {
3364                throw e.rethrowFromSystemServer();
3365            }
3366        }
3367    }
3368
3369    /**
3370     * Should be called when keyguard has been dismissed.
3371     * @hide
3372     */
3373    public void reportKeyguardDismissed(int userHandle) {
3374        if (mService != null) {
3375            try {
3376                mService.reportKeyguardDismissed(userHandle);
3377            } catch (RemoteException e) {
3378                throw e.rethrowFromSystemServer();
3379            }
3380        }
3381    }
3382
3383    /**
3384     * Should be called when keyguard view has been shown to the user.
3385     * @hide
3386     */
3387    public void reportKeyguardSecured(int userHandle) {
3388        if (mService != null) {
3389            try {
3390                mService.reportKeyguardSecured(userHandle);
3391            } catch (RemoteException e) {
3392                throw e.rethrowFromSystemServer();
3393            }
3394        }
3395    }
3396
3397    /**
3398     * @hide
3399     * Sets the given package as the device owner.
3400     * Same as {@link #setDeviceOwner(ComponentName, String)} but without setting a device owner name.
3401     * @param who the component name to be registered as device owner.
3402     * @return whether the package was successfully registered as the device owner.
3403     * @throws IllegalArgumentException if the package name is null or invalid
3404     * @throws IllegalStateException If the preconditions mentioned are not met.
3405     */
3406    public boolean setDeviceOwner(ComponentName who) {
3407        return setDeviceOwner(who, null);
3408    }
3409
3410    /**
3411     * @hide
3412     */
3413    public boolean setDeviceOwner(ComponentName who, int userId)  {
3414        return setDeviceOwner(who, null, userId);
3415    }
3416
3417    /**
3418     * @hide
3419     */
3420    public boolean setDeviceOwner(ComponentName who, String ownerName) {
3421        return setDeviceOwner(who, ownerName, UserHandle.USER_SYSTEM);
3422    }
3423
3424    /**
3425     * @hide
3426     * Sets the given package as the device owner. The package must already be installed. There
3427     * must not already be a device owner.
3428     * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call
3429     * this method.
3430     * Calling this after the setup phase of the primary user has completed is allowed only if
3431     * the caller is the shell uid, and there are no additional users and no accounts.
3432     * @param who the component name to be registered as device owner.
3433     * @param ownerName the human readable name of the institution that owns this device.
3434     * @param userId ID of the user on which the device owner runs.
3435     * @return whether the package was successfully registered as the device owner.
3436     * @throws IllegalArgumentException if the package name is null or invalid
3437     * @throws IllegalStateException If the preconditions mentioned are not met.
3438     */
3439    public boolean setDeviceOwner(ComponentName who, String ownerName, int userId)
3440            throws IllegalArgumentException, IllegalStateException {
3441        if (mService != null) {
3442            try {
3443                return mService.setDeviceOwner(who, ownerName, userId);
3444            } catch (RemoteException re) {
3445                throw re.rethrowFromSystemServer();
3446            }
3447        }
3448        return false;
3449    }
3450
3451    /**
3452     * Used to determine if a particular package has been registered as a Device Owner app.
3453     * A device owner app is a special device admin that cannot be deactivated by the user, once
3454     * activated as a device admin. It also cannot be uninstalled. To check whether a particular
3455     * package is currently registered as the device owner app, pass in the package name from
3456     * {@link Context#getPackageName()} to this method.<p/>This is useful for device
3457     * admin apps that want to check whether they are also registered as the device owner app. The
3458     * exact mechanism by which a device admin app is registered as a device owner app is defined by
3459     * the setup process.
3460     * @param packageName the package name of the app, to compare with the registered device owner
3461     * app, if any.
3462     * @return whether or not the package is registered as the device owner app.
3463     */
3464    public boolean isDeviceOwnerApp(String packageName) {
3465        return isDeviceOwnerAppOnCallingUser(packageName);
3466    }
3467
3468    /**
3469     * @return true if a package is registered as device owner, only when it's running on the
3470     * calling user.
3471     *
3472     * <p>Same as {@link #isDeviceOwnerApp}, but bundled code should use it for clarity.
3473     * @hide
3474     */
3475    public boolean isDeviceOwnerAppOnCallingUser(String packageName) {
3476        return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ true);
3477    }
3478
3479    /**
3480     * @return true if a package is registered as device owner, even if it's running on a different
3481     * user.
3482     *
3483     * <p>Requires the MANAGE_USERS permission.
3484     *
3485     * @hide
3486     */
3487    public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
3488        return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ false);
3489    }
3490
3491    /**
3492     * @return device owner component name, only when it's running on the calling user.
3493     *
3494     * @hide
3495     */
3496    public ComponentName getDeviceOwnerComponentOnCallingUser() {
3497        return getDeviceOwnerComponentInner(/* callingUserOnly =*/ true);
3498    }
3499
3500    /**
3501     * @return device owner component name, even if it's running on a different user.
3502     *
3503     * <p>Requires the MANAGE_USERS permission.
3504     *
3505     * @hide
3506     */
3507    public ComponentName getDeviceOwnerComponentOnAnyUser() {
3508        return getDeviceOwnerComponentInner(/* callingUserOnly =*/ false);
3509    }
3510
3511    private boolean isDeviceOwnerAppOnAnyUserInner(String packageName, boolean callingUserOnly) {
3512        if (packageName == null) {
3513            return false;
3514        }
3515        final ComponentName deviceOwner = getDeviceOwnerComponentInner(callingUserOnly);
3516        if (deviceOwner == null) {
3517            return false;
3518        }
3519        return packageName.equals(deviceOwner.getPackageName());
3520    }
3521
3522    private ComponentName getDeviceOwnerComponentInner(boolean callingUserOnly) {
3523        if (mService != null) {
3524            try {
3525                return mService.getDeviceOwnerComponent(callingUserOnly);
3526            } catch (RemoteException re) {
3527                throw re.rethrowFromSystemServer();
3528            }
3529        }
3530        return null;
3531    }
3532
3533    /**
3534     * @return ID of the user who runs device owner, or {@link UserHandle#USER_NULL} if there's
3535     * no device owner.
3536     *
3537     * <p>Requires the MANAGE_USERS permission.
3538     *
3539     * @hide
3540     */
3541    public int getDeviceOwnerUserId() {
3542        if (mService != null) {
3543            try {
3544                return mService.getDeviceOwnerUserId();
3545            } catch (RemoteException re) {
3546                throw re.rethrowFromSystemServer();
3547            }
3548        }
3549        return UserHandle.USER_NULL;
3550    }
3551
3552    /**
3553     * Clears the current device owner. The caller must be the device owner. This function should be
3554     * used cautiously as once it is called it cannot be undone. The device owner can only be set as
3555     * a part of device setup before setup completes.
3556     *
3557     * @param packageName The package name of the device owner.
3558     * @throws SecurityException if the caller is not in {@code packageName} or {@code packageName}
3559     *             does not own the current device owner component.
3560     */
3561    public void clearDeviceOwnerApp(String packageName) {
3562        if (mService != null) {
3563            try {
3564                mService.clearDeviceOwner(packageName);
3565            } catch (RemoteException re) {
3566                throw re.rethrowFromSystemServer();
3567            }
3568        }
3569    }
3570
3571    /**
3572     * Returns the device owner package name, only if it's running on the calling user.
3573     *
3574     * <p>Bundled components should use {@code getDeviceOwnerComponentOnCallingUser()} for clarity.
3575     *
3576     * @hide
3577     */
3578    @SystemApi
3579    public String getDeviceOwner() {
3580        final ComponentName name = getDeviceOwnerComponentOnCallingUser();
3581        return name != null ? name.getPackageName() : null;
3582    }
3583
3584    /**
3585     * @return true if the device is managed by any device owner.
3586     *
3587     * <p>Requires the MANAGE_USERS permission.
3588     *
3589     * @hide
3590     */
3591    public boolean isDeviceManaged() {
3592        return getDeviceOwnerComponentOnAnyUser() != null;
3593    }
3594
3595    /**
3596     * Returns the device owner name.  Note this method *will* return the device owner
3597     * name when it's running on a different user.
3598     *
3599     * <p>Requires the MANAGE_USERS permission.
3600     *
3601     * @hide
3602     */
3603    @SystemApi
3604    public String getDeviceOwnerNameOnAnyUser() {
3605        if (mService != null) {
3606            try {
3607                return mService.getDeviceOwnerName();
3608            } catch (RemoteException re) {
3609                throw re.rethrowFromSystemServer();
3610            }
3611        }
3612        return null;
3613    }
3614
3615    /**
3616     * @hide
3617     * @deprecated Do not use
3618     * @removed
3619     */
3620    @Deprecated
3621    @SystemApi
3622    public String getDeviceInitializerApp() {
3623        return null;
3624    }
3625
3626    /**
3627     * @hide
3628     * @deprecated Do not use
3629     * @removed
3630     */
3631    @Deprecated
3632    @SystemApi
3633    public ComponentName getDeviceInitializerComponent() {
3634        return null;
3635    }
3636
3637    /**
3638     * @hide
3639     * @deprecated Use #ACTION_SET_PROFILE_OWNER
3640     * Sets the given component as an active admin and registers the package as the profile
3641     * owner for this user. The package must already be installed and there shouldn't be
3642     * an existing profile owner registered for this user. Also, this method must be called
3643     * before the user setup has been completed.
3644     * <p>
3645     * This method can only be called by system apps that hold MANAGE_USERS permission and
3646     * MANAGE_DEVICE_ADMINS permission.
3647     * @param admin The component to register as an active admin and profile owner.
3648     * @param ownerName The user-visible name of the entity that is managing this user.
3649     * @return whether the admin was successfully registered as the profile owner.
3650     * @throws IllegalArgumentException if packageName is null, the package isn't installed, or
3651     *         the user has already been set up.
3652     */
3653    @SystemApi
3654    public boolean setActiveProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName)
3655            throws IllegalArgumentException {
3656        if (mService != null) {
3657            try {
3658                final int myUserId = myUserId();
3659                mService.setActiveAdmin(admin, false, myUserId);
3660                return mService.setProfileOwner(admin, ownerName, myUserId);
3661            } catch (RemoteException re) {
3662                throw re.rethrowFromSystemServer();
3663            }
3664        }
3665        return false;
3666    }
3667
3668    /**
3669     * Clears the active profile owner and removes all user restrictions. The caller must be from
3670     * the same package as the active profile owner for this user, otherwise a SecurityException
3671     * will be thrown.
3672     * <p>
3673     * This doesn't work for managed profile owners.
3674     *
3675     * @param admin The component to remove as the profile owner.
3676     * @throws SecurityException if {@code admin} is not an active profile owner.
3677     */
3678    public void clearProfileOwner(@NonNull ComponentName admin) {
3679        if (mService != null) {
3680            try {
3681                mService.clearProfileOwner(admin);
3682            } catch (RemoteException re) {
3683                throw re.rethrowFromSystemServer();
3684            }
3685        }
3686    }
3687
3688    /**
3689     * @hide
3690     * Checks whether the user was already setup.
3691     */
3692    public boolean hasUserSetupCompleted() {
3693        if (mService != null) {
3694            try {
3695                return mService.hasUserSetupCompleted();
3696            } catch (RemoteException re) {
3697                throw re.rethrowFromSystemServer();
3698            }
3699        }
3700        return true;
3701    }
3702
3703    /**
3704     * @hide
3705     * Sets the given component as the profile owner of the given user profile. The package must
3706     * already be installed. There must not already be a profile owner for this user.
3707     * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call
3708     * this method.
3709     * Calling this after the setup phase of the specified user has completed is allowed only if:
3710     * - the caller is SYSTEM_UID.
3711     * - or the caller is the shell uid, and there are no accounts on the specified user.
3712     * @param admin the component name to be registered as profile owner.
3713     * @param ownerName the human readable name of the organisation associated with this DPM.
3714     * @param userHandle the userId to set the profile owner for.
3715     * @return whether the component was successfully registered as the profile owner.
3716     * @throws IllegalArgumentException if admin is null, the package isn't installed, or the
3717     * preconditions mentioned are not met.
3718     */
3719    public boolean setProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName,
3720            int userHandle) throws IllegalArgumentException {
3721        if (mService != null) {
3722            try {
3723                if (ownerName == null) {
3724                    ownerName = "";
3725                }
3726                return mService.setProfileOwner(admin, ownerName, userHandle);
3727            } catch (RemoteException re) {
3728                throw re.rethrowFromSystemServer();
3729            }
3730        }
3731        return false;
3732    }
3733
3734    /**
3735     * Sets the device owner information to be shown on the lock screen.
3736     * <p>
3737     * If the device owner information is {@code null} or empty then the device owner info is
3738     * cleared and the user owner info is shown on the lock screen if it is set.
3739     * <p>
3740     * If the device owner information contains only whitespaces then the message on the lock screen
3741     * will be blank and the user will not be allowed to change it.
3742     * <p>
3743     * If the device owner information needs to be localized, it is the responsibility of the
3744     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
3745     * and set a new version of this string accordingly.
3746     *
3747     * @param admin The name of the admin component to check.
3748     * @param info Device owner information which will be displayed instead of the user owner info.
3749     * @throws SecurityException if {@code admin} is not a device owner.
3750     */
3751    public void setDeviceOwnerLockScreenInfo(@NonNull ComponentName admin, CharSequence info) {
3752        if (mService != null) {
3753            try {
3754                mService.setDeviceOwnerLockScreenInfo(admin, info);
3755            } catch (RemoteException re) {
3756                throw re.rethrowFromSystemServer();
3757            }
3758        }
3759    }
3760
3761    /**
3762     * @return The device owner information. If it is not set returns {@code null}.
3763     */
3764    public CharSequence getDeviceOwnerLockScreenInfo() {
3765        if (mService != null) {
3766            try {
3767                return mService.getDeviceOwnerLockScreenInfo();
3768            } catch (RemoteException re) {
3769                throw re.rethrowFromSystemServer();
3770            }
3771        }
3772        return null;
3773    }
3774
3775    /**
3776     * Called by device or profile owners to suspend packages for this user.
3777     * <p>
3778     * A suspended package will not be able to start activities. Its notifications will be hidden,
3779     * it will not show up in recents, will not be able to show toasts or dialogs or ring the
3780     * device.
3781     * <p>
3782     * The package must already be installed. If the package is uninstalled while suspended the
3783     * package will no longer be suspended. The admin can block this by using
3784     * {@link #setUninstallBlocked}.
3785     *
3786     * @param admin The name of the admin component to check.
3787     * @param packageNames The package names to suspend or unsuspend.
3788     * @param suspended If set to {@code true} than the packages will be suspended, if set to
3789     *            {@code false} the packages will be unsuspended.
3790     * @return an array of package names for which the suspended status is not set as requested in
3791     *         this method.
3792     * @throws SecurityException if {@code admin} is not a device or profile owner.
3793     */
3794    public String[] setPackagesSuspended(@NonNull ComponentName admin, String[] packageNames,
3795            boolean suspended) {
3796        if (mService != null) {
3797            try {
3798                return mService.setPackagesSuspended(admin, packageNames, suspended);
3799            } catch (RemoteException re) {
3800                throw re.rethrowFromSystemServer();
3801            }
3802        }
3803        return packageNames;
3804    }
3805
3806    /**
3807     * Called by device or profile owners to determine if a package is suspended.
3808     *
3809     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3810     * @param packageName The name of the package to retrieve the suspended status of.
3811     * @return {@code true} if the package is suspended or {@code false} if the package is not
3812     *         suspended, could not be found or an error occurred.
3813     * @throws SecurityException if {@code admin} is not a device or profile owner.
3814     * @throws NameNotFoundException if the package could not be found.
3815     */
3816    public boolean isPackageSuspended(@NonNull ComponentName admin, String packageName)
3817            throws NameNotFoundException {
3818        if (mService != null) {
3819            try {
3820                return mService.isPackageSuspended(admin, packageName);
3821            } catch (RemoteException e) {
3822                throw e.rethrowFromSystemServer();
3823            } catch (IllegalArgumentException ex) {
3824                throw new NameNotFoundException(packageName);
3825            }
3826        }
3827        return false;
3828    }
3829
3830    /**
3831     * Sets the enabled state of the profile. A profile should be enabled only once it is ready to
3832     * be used. Only the profile owner can call this.
3833     *
3834     * @see #isProfileOwnerApp
3835     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3836     * @throws SecurityException if {@code admin} is not a profile owner.
3837     */
3838    public void setProfileEnabled(@NonNull ComponentName admin) {
3839        if (mService != null) {
3840            try {
3841                mService.setProfileEnabled(admin);
3842            } catch (RemoteException e) {
3843                throw e.rethrowFromSystemServer();
3844            }
3845        }
3846    }
3847
3848    /**
3849     * Sets the name of the profile. In the device owner case it sets the name of the user which it
3850     * is called from. Only a profile owner or device owner can call this. If this is never called
3851     * by the profile or device owner, the name will be set to default values.
3852     *
3853     * @see #isProfileOwnerApp
3854     * @see #isDeviceOwnerApp
3855     * @param admin Which {@link DeviceAdminReceiver} this request is associate with.
3856     * @param profileName The name of the profile.
3857     * @throws SecurityException if {@code admin} is not a device or profile owner.
3858     */
3859    public void setProfileName(@NonNull ComponentName admin, String profileName) {
3860        if (mService != null) {
3861            try {
3862                mService.setProfileName(admin, profileName);
3863            } catch (RemoteException e) {
3864                throw e.rethrowFromSystemServer();
3865            }
3866        }
3867    }
3868
3869    /**
3870     * Used to determine if a particular package is registered as the profile owner for the
3871     * user. A profile owner is a special device admin that has additional privileges
3872     * within the profile.
3873     *
3874     * @param packageName The package name of the app to compare with the registered profile owner.
3875     * @return Whether or not the package is registered as the profile owner.
3876     */
3877    public boolean isProfileOwnerApp(String packageName) {
3878        if (mService != null) {
3879            try {
3880                ComponentName profileOwner = mService.getProfileOwner(myUserId());
3881                return profileOwner != null
3882                        && profileOwner.getPackageName().equals(packageName);
3883            } catch (RemoteException re) {
3884                throw re.rethrowFromSystemServer();
3885            }
3886        }
3887        return false;
3888    }
3889
3890    /**
3891     * @hide
3892     * @return the packageName of the owner of the given user profile or {@code null} if no profile
3893     * owner has been set for that user.
3894     * @throws IllegalArgumentException if the userId is invalid.
3895     */
3896    @SystemApi
3897    public ComponentName getProfileOwner() throws IllegalArgumentException {
3898        return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier());
3899    }
3900
3901    /**
3902     * @see #getProfileOwner()
3903     * @hide
3904     */
3905    public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException {
3906        if (mService != null) {
3907            try {
3908                return mService.getProfileOwner(userId);
3909            } catch (RemoteException re) {
3910                throw re.rethrowFromSystemServer();
3911            }
3912        }
3913        return null;
3914    }
3915
3916    /**
3917     * @hide
3918     * @return the human readable name of the organisation associated with this DPM or {@code null}
3919     *         if one is not set.
3920     * @throws IllegalArgumentException if the userId is invalid.
3921     */
3922    public String getProfileOwnerName() throws IllegalArgumentException {
3923        if (mService != null) {
3924            try {
3925                return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier());
3926            } catch (RemoteException re) {
3927                throw re.rethrowFromSystemServer();
3928            }
3929        }
3930        return null;
3931    }
3932
3933    /**
3934     * @hide
3935     * @param userId The user for whom to fetch the profile owner name, if any.
3936     * @return the human readable name of the organisation associated with this profile owner or
3937     *         null if one is not set.
3938     * @throws IllegalArgumentException if the userId is invalid.
3939     */
3940    @SystemApi
3941    public String getProfileOwnerNameAsUser(int userId) throws IllegalArgumentException {
3942        if (mService != null) {
3943            try {
3944                return mService.getProfileOwnerName(userId);
3945            } catch (RemoteException re) {
3946                throw re.rethrowFromSystemServer();
3947            }
3948        }
3949        return null;
3950    }
3951
3952    /**
3953     * Called by a profile owner or device owner to add a default intent handler activity for
3954     * intents that match a certain intent filter. This activity will remain the default intent
3955     * handler even if the set of potential event handlers for the intent filter changes and if the
3956     * intent preferences are reset.
3957     * <p>
3958     * The default disambiguation mechanism takes over if the activity is not installed (anymore).
3959     * When the activity is (re)installed, it is automatically reset as default intent handler for
3960     * the filter.
3961     * <p>
3962     * The calling device admin must be a profile owner or device owner. If it is not, a security
3963     * exception will be thrown.
3964     *
3965     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3966     * @param filter The IntentFilter for which a default handler is added.
3967     * @param activity The Activity that is added as default intent handler.
3968     * @throws SecurityException if {@code admin} is not a device or profile owner.
3969     */
3970    public void addPersistentPreferredActivity(@NonNull ComponentName admin, IntentFilter filter,
3971            @NonNull ComponentName activity) {
3972        if (mService != null) {
3973            try {
3974                mService.addPersistentPreferredActivity(admin, filter, activity);
3975            } catch (RemoteException e) {
3976                throw e.rethrowFromSystemServer();
3977            }
3978        }
3979    }
3980
3981    /**
3982     * Called by a profile owner or device owner to remove all persistent intent handler preferences
3983     * associated with the given package that were set by {@link #addPersistentPreferredActivity}.
3984     * <p>
3985     * The calling device admin must be a profile owner. If it is not, a security exception will be
3986     * thrown.
3987     *
3988     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3989     * @param packageName The name of the package for which preferences are removed.
3990     * @throws SecurityException if {@code admin} is not a device or profile owner.
3991     */
3992    public void clearPackagePersistentPreferredActivities(@NonNull ComponentName admin,
3993            String packageName) {
3994        if (mService != null) {
3995            try {
3996                mService.clearPackagePersistentPreferredActivities(admin, packageName);
3997            } catch (RemoteException e) {
3998                throw e.rethrowFromSystemServer();
3999            }
4000        }
4001    }
4002
4003    /**
4004     * Called by a profile owner or device owner to grant permission to a package to manage
4005     * application restrictions for the calling user via {@link #setApplicationRestrictions} and
4006     * {@link #getApplicationRestrictions}.
4007     * <p>
4008     * This permission is persistent until it is later cleared by calling this method with a
4009     * {@code null} value or uninstalling the managing package.
4010     * <p>
4011     * The supplied application restriction managing package must be installed when calling this
4012     * API, otherwise an {@link NameNotFoundException} will be thrown.
4013     *
4014     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4015     * @param packageName The package name which will be given access to application restrictions
4016     *            APIs. If {@code null} is given the current package will be cleared.
4017     * @throws SecurityException if {@code admin} is not a device or profile owner.
4018     * @throws NameNotFoundException if {@code packageName} is not found
4019     */
4020    public void setApplicationRestrictionsManagingPackage(@NonNull ComponentName admin,
4021            @Nullable String packageName) throws NameNotFoundException {
4022        if (mService != null) {
4023            try {
4024                if (!mService.setApplicationRestrictionsManagingPackage(admin, packageName)) {
4025                    throw new NameNotFoundException(packageName);
4026                }
4027            } catch (RemoteException e) {
4028                throw e.rethrowFromSystemServer();
4029            }
4030        }
4031    }
4032
4033    /**
4034     * Called by a profile owner or device owner to retrieve the application restrictions managing
4035     * package for the current user, or {@code null} if none is set.
4036     *
4037     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4038     * @return The package name allowed to manage application restrictions on the current user, or
4039     *         {@code null} if none is set.
4040     * @throws SecurityException if {@code admin} is not a device or profile owner.
4041     */
4042    public String getApplicationRestrictionsManagingPackage(@NonNull ComponentName admin) {
4043        if (mService != null) {
4044            try {
4045                return mService.getApplicationRestrictionsManagingPackage(admin);
4046            } catch (RemoteException e) {
4047                throw e.rethrowFromSystemServer();
4048            }
4049        }
4050        return null;
4051    }
4052
4053    /**
4054     * Called by any application to find out whether it has been granted permission via
4055     * {@link #setApplicationRestrictionsManagingPackage} to manage application restrictions
4056     * for the calling user.
4057     *
4058     * <p>This is done by comparing the calling Linux uid with the uid of the package specified by
4059     * that method.
4060     */
4061    public boolean isCallerApplicationRestrictionsManagingPackage() {
4062        if (mService != null) {
4063            try {
4064                return mService.isCallerApplicationRestrictionsManagingPackage();
4065            } catch (RemoteException e) {
4066                throw e.rethrowFromSystemServer();
4067            }
4068        }
4069        return false;
4070    }
4071
4072    /**
4073     * Sets the application restrictions for a given target application running in the calling user.
4074     * <p>
4075     * The caller must be a profile or device owner on that user, or the package allowed to manage
4076     * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a
4077     * security exception will be thrown.
4078     * <p>
4079     * The provided {@link Bundle} consists of key-value pairs, where the types of values may be:
4080     * <ul>
4081     * <li>{@code boolean}
4082     * <li>{@code int}
4083     * <li>{@code String} or {@code String[]}
4084     * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]}
4085     * </ul>
4086     * <p>
4087     * If the restrictions are not available yet, but may be applied in the near future, the caller
4088     * can notify the target application of that by adding
4089     * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter.
4090     * <p>
4091     * The application restrictions are only made visible to the target application via
4092     * {@link UserManager#getApplicationRestrictions(String)}, in addition to the profile or device
4093     * owner, and the application restrictions managing package via
4094     * {@link #getApplicationRestrictions}.
4095     *
4096     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
4097     *            {@code null} if called by the application restrictions managing package.
4098     * @param packageName The name of the package to update restricted settings for.
4099     * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new
4100     *            set of active restrictions.
4101     * @throws SecurityException if {@code admin} is not a device or profile owner.
4102     * @see #setApplicationRestrictionsManagingPackage
4103     * @see UserManager#KEY_RESTRICTIONS_PENDING
4104     */
4105    public void setApplicationRestrictions(@Nullable ComponentName admin, String packageName,
4106            Bundle settings) {
4107        if (mService != null) {
4108            try {
4109                mService.setApplicationRestrictions(admin, packageName, settings);
4110            } catch (RemoteException e) {
4111                throw e.rethrowFromSystemServer();
4112            }
4113        }
4114    }
4115
4116    /**
4117     * Sets a list of configuration features to enable for a TrustAgent component. This is meant to
4118     * be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all trust
4119     * agents but those enabled by this function call. If flag
4120     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is not set, then this call has no effect.
4121     * <p>
4122     * The calling device admin must have requested
4123     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method;
4124     * if not, a security exception will be thrown.
4125     *
4126     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4127     * @param target Component name of the agent to be enabled.
4128     * @param configuration TrustAgent-specific feature bundle. If null for any admin, agent will be
4129     *            strictly disabled according to the state of the
4130     *            {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag.
4131     *            <p>
4132     *            If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all
4133     *            admins, then it's up to the TrustAgent itself to aggregate the values from all
4134     *            device admins.
4135     *            <p>
4136     *            Consult documentation for the specific TrustAgent to determine legal options
4137     *            parameters.
4138     * @throws SecurityException if {@code admin} is not an active administrator or does not use
4139     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES}
4140     */
4141    public void setTrustAgentConfiguration(@NonNull ComponentName admin,
4142            @NonNull ComponentName target, PersistableBundle configuration) {
4143        if (mService != null) {
4144            try {
4145                mService.setTrustAgentConfiguration(admin, target, configuration);
4146            } catch (RemoteException e) {
4147                throw e.rethrowFromSystemServer();
4148            }
4149        }
4150    }
4151
4152    /**
4153     * Gets configuration for the given trust agent based on aggregating all calls to
4154     * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)} for
4155     * all device admins.
4156     *
4157     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null,
4158     * this function returns a list of configurations for all admins that declare
4159     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. If any admin declares
4160     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} but doesn't call
4161     * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)}
4162     * for this {@param agent} or calls it with a null configuration, null is returned.
4163     * @param agent Which component to get enabled features for.
4164     * @return configuration for the given trust agent.
4165     */
4166    public List<PersistableBundle> getTrustAgentConfiguration(@Nullable ComponentName admin,
4167            @NonNull ComponentName agent) {
4168        return getTrustAgentConfiguration(admin, agent, myUserId());
4169    }
4170
4171    /** @hide per-user version */
4172    public List<PersistableBundle> getTrustAgentConfiguration(@Nullable ComponentName admin,
4173            @NonNull ComponentName agent, int userHandle) {
4174        if (mService != null) {
4175            try {
4176                return mService.getTrustAgentConfiguration(admin, agent, userHandle);
4177            } catch (RemoteException e) {
4178                throw e.rethrowFromSystemServer();
4179            }
4180        }
4181        return new ArrayList<PersistableBundle>(); // empty list
4182    }
4183
4184    /**
4185     * Called by a profile owner of a managed profile to set whether caller-Id information from the
4186     * managed profile will be shown in the parent profile, for incoming calls.
4187     * <p>
4188     * The calling device admin must be a profile owner. If it is not, a security exception will be
4189     * thrown.
4190     *
4191     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4192     * @param disabled If true caller-Id information in the managed profile is not displayed.
4193     * @throws SecurityException if {@code admin} is not a device or profile owner.
4194     */
4195    public void setCrossProfileCallerIdDisabled(@NonNull ComponentName admin, boolean disabled) {
4196        if (mService != null) {
4197            try {
4198                mService.setCrossProfileCallerIdDisabled(admin, disabled);
4199            } catch (RemoteException e) {
4200                throw e.rethrowFromSystemServer();
4201            }
4202        }
4203    }
4204
4205    /**
4206     * Called by a profile owner of a managed profile to determine whether or not caller-Id
4207     * information has been disabled.
4208     * <p>
4209     * The calling device admin must be a profile owner. If it is not, a security exception will be
4210     * thrown.
4211     *
4212     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4213     * @throws SecurityException if {@code admin} is not a device or profile owner.
4214     */
4215    public boolean getCrossProfileCallerIdDisabled(@NonNull ComponentName admin) {
4216        if (mService != null) {
4217            try {
4218                return mService.getCrossProfileCallerIdDisabled(admin);
4219            } catch (RemoteException e) {
4220                throw e.rethrowFromSystemServer();
4221            }
4222        }
4223        return false;
4224    }
4225
4226    /**
4227     * Determine whether or not caller-Id information has been disabled.
4228     *
4229     * @param userHandle The user for whom to check the caller-id permission
4230     * @hide
4231     */
4232    public boolean getCrossProfileCallerIdDisabled(UserHandle userHandle) {
4233        if (mService != null) {
4234            try {
4235                return mService.getCrossProfileCallerIdDisabledForUser(userHandle.getIdentifier());
4236            } catch (RemoteException e) {
4237                throw e.rethrowFromSystemServer();
4238            }
4239        }
4240        return false;
4241    }
4242
4243    /**
4244     * Called by a profile owner of a managed profile to set whether contacts search from the
4245     * managed profile will be shown in the parent profile, for incoming calls.
4246     * <p>
4247     * The calling device admin must be a profile owner. If it is not, a security exception will be
4248     * thrown.
4249     *
4250     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4251     * @param disabled If true contacts search in the managed profile is not displayed.
4252     * @throws SecurityException if {@code admin} is not a device or profile owner.
4253     */
4254    public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin,
4255            boolean disabled) {
4256        if (mService != null) {
4257            try {
4258                mService.setCrossProfileContactsSearchDisabled(admin, disabled);
4259            } catch (RemoteException e) {
4260                throw e.rethrowFromSystemServer();
4261            }
4262        }
4263    }
4264
4265    /**
4266     * Called by a profile owner of a managed profile to determine whether or not contacts search
4267     * has been disabled.
4268     * <p>
4269     * The calling device admin must be a profile owner. If it is not, a security exception will be
4270     * thrown.
4271     *
4272     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4273     * @throws SecurityException if {@code admin} is not a device or profile owner.
4274     */
4275    public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) {
4276        if (mService != null) {
4277            try {
4278                return mService.getCrossProfileContactsSearchDisabled(admin);
4279            } catch (RemoteException e) {
4280                throw e.rethrowFromSystemServer();
4281            }
4282        }
4283        return false;
4284    }
4285
4286
4287    /**
4288     * Determine whether or not contacts search has been disabled.
4289     *
4290     * @param userHandle The user for whom to check the contacts search permission
4291     * @hide
4292     */
4293    public boolean getCrossProfileContactsSearchDisabled(@NonNull UserHandle userHandle) {
4294        if (mService != null) {
4295            try {
4296                return mService
4297                        .getCrossProfileContactsSearchDisabledForUser(userHandle.getIdentifier());
4298            } catch (RemoteException e) {
4299                throw e.rethrowFromSystemServer();
4300            }
4301        }
4302        return false;
4303    }
4304
4305    /**
4306     * Start Quick Contact on the managed profile for the user, if the policy allows.
4307     *
4308     * @hide
4309     */
4310    public void startManagedQuickContact(String actualLookupKey, long actualContactId,
4311            boolean isContactIdIgnored, long directoryId, Intent originalIntent) {
4312        if (mService != null) {
4313            try {
4314                mService.startManagedQuickContact(actualLookupKey, actualContactId,
4315                        isContactIdIgnored, directoryId, originalIntent);
4316            } catch (RemoteException e) {
4317                throw e.rethrowFromSystemServer();
4318            }
4319        }
4320    }
4321
4322    /**
4323     * Start Quick Contact on the managed profile for the user, if the policy allows.
4324     * @hide
4325     */
4326    public void startManagedQuickContact(String actualLookupKey, long actualContactId,
4327            Intent originalIntent) {
4328        startManagedQuickContact(actualLookupKey, actualContactId, false, Directory.DEFAULT,
4329                originalIntent);
4330    }
4331
4332    /**
4333     * Called by a profile owner of a managed profile to set whether bluetooth devices can access
4334     * enterprise contacts.
4335     * <p>
4336     * The calling device admin must be a profile owner. If it is not, a security exception will be
4337     * thrown.
4338     * <p>
4339     * This API works on managed profile only.
4340     *
4341     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4342     * @param disabled If true, bluetooth devices cannot access enterprise contacts.
4343     * @throws SecurityException if {@code admin} is not a device or profile owner.
4344     */
4345    public void setBluetoothContactSharingDisabled(@NonNull ComponentName admin, boolean disabled) {
4346        if (mService != null) {
4347            try {
4348                mService.setBluetoothContactSharingDisabled(admin, disabled);
4349            } catch (RemoteException e) {
4350                throw e.rethrowFromSystemServer();
4351            }
4352        }
4353    }
4354
4355    /**
4356     * Called by a profile owner of a managed profile to determine whether or not Bluetooth devices
4357     * cannot access enterprise contacts.
4358     * <p>
4359     * The calling device admin must be a profile owner. If it is not, a security exception will be
4360     * thrown.
4361     * <p>
4362     * This API works on managed profile only.
4363     *
4364     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4365     * @throws SecurityException if {@code admin} is not a device or profile owner.
4366     */
4367    public boolean getBluetoothContactSharingDisabled(@NonNull ComponentName admin) {
4368        if (mService != null) {
4369            try {
4370                return mService.getBluetoothContactSharingDisabled(admin);
4371            } catch (RemoteException e) {
4372                throw e.rethrowFromSystemServer();
4373            }
4374        }
4375        return true;
4376    }
4377
4378    /**
4379     * Determine whether or not Bluetooth devices cannot access contacts.
4380     * <p>
4381     * This API works on managed profile UserHandle only.
4382     *
4383     * @param userHandle The user for whom to check the caller-id permission
4384     * @hide
4385     */
4386    public boolean getBluetoothContactSharingDisabled(UserHandle userHandle) {
4387        if (mService != null) {
4388            try {
4389                return mService.getBluetoothContactSharingDisabledForUser(userHandle
4390                        .getIdentifier());
4391            } catch (RemoteException e) {
4392                throw e.rethrowFromSystemServer();
4393            }
4394        }
4395        return true;
4396    }
4397
4398    /**
4399     * Called by the profile owner of a managed profile so that some intents sent in the managed
4400     * profile can also be resolved in the parent, or vice versa. Only activity intents are
4401     * supported.
4402     *
4403     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4404     * @param filter The {@link IntentFilter} the intent has to match to be also resolved in the
4405     *            other profile
4406     * @param flags {@link DevicePolicyManager#FLAG_MANAGED_CAN_ACCESS_PARENT} and
4407     *            {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported.
4408     * @throws SecurityException if {@code admin} is not a device or profile owner.
4409     */
4410    public void addCrossProfileIntentFilter(@NonNull ComponentName admin, IntentFilter filter, int flags) {
4411        if (mService != null) {
4412            try {
4413                mService.addCrossProfileIntentFilter(admin, filter, flags);
4414            } catch (RemoteException e) {
4415                throw e.rethrowFromSystemServer();
4416            }
4417        }
4418    }
4419
4420    /**
4421     * Called by a profile owner of a managed profile to remove the cross-profile intent filters
4422     * that go from the managed profile to the parent, or from the parent to the managed profile.
4423     * Only removes those that have been set by the profile owner.
4424     *
4425     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4426     * @throws SecurityException if {@code admin} is not a device or profile owner.
4427     */
4428    public void clearCrossProfileIntentFilters(@NonNull ComponentName admin) {
4429        if (mService != null) {
4430            try {
4431                mService.clearCrossProfileIntentFilters(admin);
4432            } catch (RemoteException e) {
4433                throw e.rethrowFromSystemServer();
4434            }
4435        }
4436    }
4437
4438    /**
4439     * Called by a profile or device owner to set the permitted accessibility services. When set by
4440     * a device owner or profile owner the restriction applies to all profiles of the user the
4441     * device owner or profile owner is an admin for. By default the user can use any accessiblity
4442     * service. When zero or more packages have been added, accessiblity services that are not in
4443     * the list and not part of the system can not be enabled by the user.
4444     * <p>
4445     * Calling with a null value for the list disables the restriction so that all services can be
4446     * used, calling with an empty list only allows the builtin system's services.
4447     * <p>
4448     * System accesibility services are always available to the user the list can't modify this.
4449     *
4450     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4451     * @param packageNames List of accessibility service package names.
4452     * @return true if setting the restriction succeeded. It fail if there is one or more non-system
4453     *         accessibility services enabled, that are not in the list.
4454     * @throws SecurityException if {@code admin} is not a device or profile owner.
4455     */
4456    public boolean setPermittedAccessibilityServices(@NonNull ComponentName admin,
4457            List<String> packageNames) {
4458        if (mService != null) {
4459            try {
4460                return mService.setPermittedAccessibilityServices(admin, packageNames);
4461            } catch (RemoteException e) {
4462                throw e.rethrowFromSystemServer();
4463            }
4464        }
4465        return false;
4466    }
4467
4468    /**
4469     * Returns the list of permitted accessibility services set by this device or profile owner.
4470     * <p>
4471     * An empty list means no accessibility services except system services are allowed. Null means
4472     * all accessibility services are allowed.
4473     *
4474     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4475     * @return List of accessiblity service package names.
4476     * @throws SecurityException if {@code admin} is not a device or profile owner.
4477     */
4478    public List<String> getPermittedAccessibilityServices(@NonNull ComponentName admin) {
4479        if (mService != null) {
4480            try {
4481                return mService.getPermittedAccessibilityServices(admin);
4482            } catch (RemoteException e) {
4483                throw e.rethrowFromSystemServer();
4484            }
4485        }
4486        return null;
4487    }
4488
4489    /**
4490     * Called by the system to check if a specific accessibility service is disabled by admin.
4491     *
4492     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4493     * @param packageName Accessibility service package name that needs to be checked.
4494     * @param userHandle user id the admin is running as.
4495     * @return true if the accessibility service is permitted, otherwise false.
4496     *
4497     * @hide
4498     */
4499    public boolean isAccessibilityServicePermittedByAdmin(@NonNull ComponentName admin,
4500            @NonNull String packageName, int userHandle) {
4501        if (mService != null) {
4502            try {
4503                return mService.isAccessibilityServicePermittedByAdmin(admin, packageName,
4504                        userHandle);
4505            } catch (RemoteException e) {
4506                throw e.rethrowFromSystemServer();
4507            }
4508        }
4509        return false;
4510    }
4511
4512    /**
4513     * Returns the list of accessibility services permitted by the device or profiles
4514     * owners of this user.
4515     *
4516     * <p>Null means all accessibility services are allowed, if a non-null list is returned
4517     * it will contain the intersection of the permitted lists for any device or profile
4518     * owners that apply to this user. It will also include any system accessibility services.
4519     *
4520     * @param userId which user to check for.
4521     * @return List of accessiblity service package names.
4522     * @hide
4523     */
4524     @SystemApi
4525     public List<String> getPermittedAccessibilityServices(int userId) {
4526        if (mService != null) {
4527            try {
4528                return mService.getPermittedAccessibilityServicesForUser(userId);
4529            } catch (RemoteException e) {
4530                throw e.rethrowFromSystemServer();
4531            }
4532        }
4533        return null;
4534     }
4535
4536    /**
4537     * Called by a profile or device owner to set the permitted input methods services. When set by
4538     * a device owner or profile owner the restriction applies to all profiles of the user the
4539     * device owner or profile owner is an admin for. By default the user can use any input method.
4540     * When zero or more packages have been added, input method that are not in the list and not
4541     * part of the system can not be enabled by the user. This method will fail if it is called for
4542     * a admin that is not for the foreground user or a profile of the foreground user.
4543     * <p>
4544     * Calling with a null value for the list disables the restriction so that all input methods can
4545     * be used, calling with an empty list disables all but the system's own input methods.
4546     * <p>
4547     * System input methods are always available to the user this method can't modify this.
4548     *
4549     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4550     * @param packageNames List of input method package names.
4551     * @return true if setting the restriction succeeded. It will fail if there are one or more
4552     *         non-system input methods currently enabled that are not in the packageNames list.
4553     * @throws SecurityException if {@code admin} is not a device or profile owner.
4554     */
4555    public boolean setPermittedInputMethods(@NonNull ComponentName admin, List<String> packageNames) {
4556        if (mService != null) {
4557            try {
4558                return mService.setPermittedInputMethods(admin, packageNames);
4559            } catch (RemoteException e) {
4560                throw e.rethrowFromSystemServer();
4561            }
4562        }
4563        return false;
4564    }
4565
4566
4567    /**
4568     * Returns the list of permitted input methods set by this device or profile owner.
4569     * <p>
4570     * An empty list means no input methods except system input methods are allowed. Null means all
4571     * input methods are allowed.
4572     *
4573     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4574     * @return List of input method package names.
4575     * @throws SecurityException if {@code admin} is not a device or profile owner.
4576     */
4577    public List<String> getPermittedInputMethods(@NonNull ComponentName admin) {
4578        if (mService != null) {
4579            try {
4580                return mService.getPermittedInputMethods(admin);
4581            } catch (RemoteException e) {
4582                throw e.rethrowFromSystemServer();
4583            }
4584        }
4585        return null;
4586    }
4587
4588    /**
4589     * Called by the system to check if a specific input method is disabled by admin.
4590     *
4591     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4592     * @param packageName Input method package name that needs to be checked.
4593     * @param userHandle user id the admin is running as.
4594     * @return true if the input method is permitted, otherwise false.
4595     *
4596     * @hide
4597     */
4598    public boolean isInputMethodPermittedByAdmin(@NonNull ComponentName admin,
4599            @NonNull String packageName, int userHandle) {
4600        if (mService != null) {
4601            try {
4602                return mService.isInputMethodPermittedByAdmin(admin, packageName, userHandle);
4603            } catch (RemoteException e) {
4604                throw e.rethrowFromSystemServer();
4605            }
4606        }
4607        return false;
4608    }
4609
4610    /**
4611     * Returns the list of input methods permitted by the device or profiles
4612     * owners of the current user.  (*Not* calling user, due to a limitation in InputMethodManager.)
4613     *
4614     * <p>Null means all input methods are allowed, if a non-null list is returned
4615     * it will contain the intersection of the permitted lists for any device or profile
4616     * owners that apply to this user. It will also include any system input methods.
4617     *
4618     * @return List of input method package names.
4619     * @hide
4620     */
4621    @SystemApi
4622    public List<String> getPermittedInputMethodsForCurrentUser() {
4623        if (mService != null) {
4624            try {
4625                return mService.getPermittedInputMethodsForCurrentUser();
4626            } catch (RemoteException e) {
4627                throw e.rethrowFromSystemServer();
4628            }
4629        }
4630        return null;
4631    }
4632
4633    /**
4634     * Called by a device owner to get the list of apps to keep around as APKs even if no user has
4635     * currently installed it.
4636     *
4637     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4638     *
4639     * @return List of package names to keep cached.
4640     * @hide
4641     */
4642    public List<String> getKeepUninstalledPackages(@NonNull ComponentName admin) {
4643        if (mService != null) {
4644            try {
4645                return mService.getKeepUninstalledPackages(admin);
4646            } catch (RemoteException e) {
4647                throw e.rethrowFromSystemServer();
4648            }
4649        }
4650        return null;
4651    }
4652
4653    /**
4654     * Called by a device owner to set a list of apps to keep around as APKs even if no user has
4655     * currently installed it.
4656     *
4657     * <p>Please note that setting this policy does not imply that specified apps will be
4658     * automatically pre-cached.</p>
4659     *
4660     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4661     * @param packageNames List of package names to keep cached.
4662     * @throws SecurityException if {@code admin} is not a device owner.
4663     * @hide
4664     */
4665    public void setKeepUninstalledPackages(@NonNull ComponentName admin,
4666            @NonNull List<String> packageNames) {
4667        if (mService != null) {
4668            try {
4669                mService.setKeepUninstalledPackages(admin, packageNames);
4670            } catch (RemoteException e) {
4671                throw e.rethrowFromSystemServer();
4672            }
4673        }
4674    }
4675
4676    /**
4677     * Called by a device owner to create a user with the specified name. The UserHandle returned
4678     * by this method should not be persisted as user handles are recycled as users are removed and
4679     * created. If you need to persist an identifier for this user, use
4680     * {@link UserManager#getSerialNumberForUser}.
4681     *
4682     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4683     * @param name the user's name
4684     * @see UserHandle
4685     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
4686     *         user could not be created.
4687     *
4688     * @deprecated From {@link android.os.Build.VERSION_CODES#M}
4689     * @removed From {@link android.os.Build.VERSION_CODES#N}
4690     */
4691    @Deprecated
4692    public UserHandle createUser(@NonNull ComponentName admin, String name) {
4693        return null;
4694    }
4695
4696    /**
4697     * Called by a device owner to create a user with the specified name. The UserHandle returned
4698     * by this method should not be persisted as user handles are recycled as users are removed and
4699     * created. If you need to persist an identifier for this user, use
4700     * {@link UserManager#getSerialNumberForUser}.  The new user will be started in the background
4701     * immediately.
4702     *
4703     * <p> profileOwnerComponent is the {@link DeviceAdminReceiver} to be the profile owner as well
4704     * as registered as an active admin on the new user.  The profile owner package will be
4705     * installed on the new user if it already is installed on the device.
4706     *
4707     * <p>If the optionalInitializeData is not null, then the extras will be passed to the
4708     * profileOwnerComponent when onEnable is called.
4709     *
4710     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4711     * @param name the user's name
4712     * @param ownerName the human readable name of the organisation associated with this DPM.
4713     * @param profileOwnerComponent The {@link DeviceAdminReceiver} that will be an active admin on
4714     *      the user.
4715     * @param adminExtras Extras that will be passed to onEnable of the admin receiver
4716     *      on the new user.
4717     * @see UserHandle
4718     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
4719     *         user could not be created.
4720     *
4721     * @deprecated From {@link android.os.Build.VERSION_CODES#M}
4722     * @removed From {@link android.os.Build.VERSION_CODES#N}
4723     */
4724    @Deprecated
4725    public UserHandle createAndInitializeUser(@NonNull ComponentName admin, String name,
4726            String ownerName, @NonNull ComponentName profileOwnerComponent, Bundle adminExtras) {
4727        return null;
4728    }
4729
4730    /**
4731      * Flag used by {@link #createAndManageUser} to skip setup wizard after creating a new user.
4732      */
4733    public static final int SKIP_SETUP_WIZARD = 0x0001;
4734
4735    /**
4736     * Flag used by {@link #createAndManageUser} to specify that the user should be created
4737     * ephemeral.
4738     * @hide
4739     */
4740    public static final int MAKE_USER_EPHEMERAL = 0x0002;
4741
4742    /**
4743     * Called by a device owner to create a user with the specified name and a given component of
4744     * the calling package as profile owner. The UserHandle returned by this method should not be
4745     * persisted as user handles are recycled as users are removed and created. If you need to
4746     * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new
4747     * user will not be started in the background.
4748     * <p>
4749     * admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also a
4750     * DeviceAdminReceiver in the same package as admin, and will become the profile owner and will
4751     * be registered as an active admin on the new user. The profile owner package will be installed
4752     * on the new user.
4753     * <p>
4754     * If the adminExtras are not null, they will be stored on the device until the user is started
4755     * for the first time. Then the extras will be passed to the admin when onEnable is called.
4756     *
4757     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4758     * @param name The user's name.
4759     * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the
4760     *            same package as admin, otherwise no user is created and an
4761     *            IllegalArgumentException is thrown.
4762     * @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new
4763     *            user.
4764     * @param flags {@link #SKIP_SETUP_WIZARD} is supported.
4765     * @see UserHandle
4766     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
4767     *         user could not be created.
4768     * @throws SecurityException if {@code admin} is not a device owner.
4769     */
4770    public UserHandle createAndManageUser(@NonNull ComponentName admin, @NonNull String name,
4771            @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras,
4772            int flags) {
4773        try {
4774            return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags);
4775        } catch (RemoteException re) {
4776            throw re.rethrowFromSystemServer();
4777        }
4778    }
4779
4780    /**
4781     * Called by a device owner to remove a user and all associated data. The primary user can not
4782     * be removed.
4783     *
4784     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4785     * @param userHandle the user to remove.
4786     * @return {@code true} if the user was removed, {@code false} otherwise.
4787     * @throws SecurityException if {@code admin} is not a device owner.
4788     */
4789    public boolean removeUser(@NonNull ComponentName admin, UserHandle userHandle) {
4790        try {
4791            return mService.removeUser(admin, userHandle);
4792        } catch (RemoteException re) {
4793            throw re.rethrowFromSystemServer();
4794        }
4795    }
4796
4797    /**
4798     * Called by a device owner to switch the specified user to the foreground.
4799     *
4800     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4801     * @param userHandle the user to switch to; null will switch to primary.
4802     * @return {@code true} if the switch was successful, {@code false} otherwise.
4803     * @throws SecurityException if {@code admin} is not a device owner.
4804     * @see Intent#ACTION_USER_FOREGROUND
4805     */
4806    public boolean switchUser(@NonNull ComponentName admin, @Nullable UserHandle userHandle) {
4807        try {
4808            return mService.switchUser(admin, userHandle);
4809        } catch (RemoteException re) {
4810            throw re.rethrowFromSystemServer();
4811        }
4812    }
4813
4814    /**
4815     * Retrieves the application restrictions for a given target application running in the calling
4816     * user.
4817     * <p>
4818     * The caller must be a profile or device owner on that user, or the package allowed to manage
4819     * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a
4820     * security exception will be thrown.
4821     *
4822     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
4823     *            {@code null} if called by the application restrictions managing package.
4824     * @param packageName The name of the package to fetch restricted settings of.
4825     * @return {@link Bundle} of settings corresponding to what was set last time
4826     *         {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty
4827     *         {@link Bundle} if no restrictions have been set.
4828     * @throws SecurityException if {@code admin} is not a device or profile owner.
4829     * @see {@link #setApplicationRestrictionsManagingPackage}
4830     */
4831    public Bundle getApplicationRestrictions(@Nullable ComponentName admin, String packageName) {
4832        if (mService != null) {
4833            try {
4834                return mService.getApplicationRestrictions(admin, packageName);
4835            } catch (RemoteException e) {
4836                throw e.rethrowFromSystemServer();
4837            }
4838        }
4839        return null;
4840    }
4841
4842    /**
4843     * Called by a profile or device owner to set a user restriction specified by the key.
4844     * <p>
4845     * The calling device admin must be a profile or device owner; if it is not, a security
4846     * exception will be thrown.
4847     *
4848     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4849     * @param key The key of the restriction. See the constants in {@link android.os.UserManager}
4850     *            for the list of keys.
4851     * @throws SecurityException if {@code admin} is not a device or profile owner.
4852     */
4853    public void addUserRestriction(@NonNull ComponentName admin, String key) {
4854        if (mService != null) {
4855            try {
4856                mService.setUserRestriction(admin, key, true);
4857            } catch (RemoteException e) {
4858                throw e.rethrowFromSystemServer();
4859            }
4860        }
4861    }
4862
4863    /**
4864     * Called by a profile or device owner to clear a user restriction specified by the key.
4865     * <p>
4866     * The calling device admin must be a profile or device owner; if it is not, a security
4867     * exception will be thrown.
4868     *
4869     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4870     * @param key The key of the restriction. See the constants in {@link android.os.UserManager}
4871     *            for the list of keys.
4872     * @throws SecurityException if {@code admin} is not a device or profile owner.
4873     */
4874    public void clearUserRestriction(@NonNull ComponentName admin, String key) {
4875        if (mService != null) {
4876            try {
4877                mService.setUserRestriction(admin, key, false);
4878            } catch (RemoteException e) {
4879                throw e.rethrowFromSystemServer();
4880            }
4881        }
4882    }
4883
4884    /**
4885     * Called by a profile or device owner to get user restrictions set with
4886     * {@link #addUserRestriction(ComponentName, String)}.
4887     * <p>
4888     * The target user may have more restrictions set by the system or other device owner / profile
4889     * owner. To get all the user restrictions currently set, use
4890     * {@link UserManager#getUserRestrictions()}.
4891     *
4892     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4893     * @throws SecurityException if {@code admin} is not a device or profile owner.
4894     */
4895    public Bundle getUserRestrictions(@NonNull ComponentName admin) {
4896        Bundle ret = null;
4897        if (mService != null) {
4898            try {
4899                ret = mService.getUserRestrictions(admin);
4900            } catch (RemoteException e) {
4901                throw e.rethrowFromSystemServer();
4902            }
4903        }
4904        return ret == null ? new Bundle() : ret;
4905    }
4906
4907    /**
4908     * Called by the system to get the user restrictions for a user.
4909     *
4910     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4911     * @param userHandle user id the admin is running as.
4912     *
4913     * @hide
4914     */
4915    public Bundle getUserRestrictionsForUser(@NonNull ComponentName admin, int userHandle) {
4916        Bundle ret = null;
4917        if (mService != null) {
4918            try {
4919                ret = mService.getUserRestrictionsForUser(admin, userHandle);
4920            } catch (RemoteException e) {
4921                throw e.rethrowFromSystemServer();
4922            }
4923        }
4924        return ret == null ? new Bundle() : ret;
4925    }
4926
4927    /**
4928     * Called by profile or device owners to hide or unhide packages. When a package is hidden it is
4929     * unavailable for use, but the data and actual package file remain.
4930     *
4931     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4932     * @param packageName The name of the package to hide or unhide.
4933     * @param hidden {@code true} if the package should be hidden, {@code false} if it should be
4934     *            unhidden.
4935     * @return boolean Whether the hidden setting of the package was successfully updated.
4936     * @throws SecurityException if {@code admin} is not a device or profile owner.
4937     */
4938    public boolean setApplicationHidden(@NonNull ComponentName admin, String packageName,
4939            boolean hidden) {
4940        if (mService != null) {
4941            try {
4942                return mService.setApplicationHidden(admin, packageName, hidden);
4943            } catch (RemoteException e) {
4944                throw e.rethrowFromSystemServer();
4945            }
4946        }
4947        return false;
4948    }
4949
4950    /**
4951     * Called by profile or device owners to determine if a package is hidden.
4952     *
4953     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4954     * @param packageName The name of the package to retrieve the hidden status of.
4955     * @return boolean {@code true} if the package is hidden, {@code false} otherwise.
4956     * @throws SecurityException if {@code admin} is not a device or profile owner.
4957     */
4958    public boolean isApplicationHidden(@NonNull ComponentName admin, String packageName) {
4959        if (mService != null) {
4960            try {
4961                return mService.isApplicationHidden(admin, packageName);
4962            } catch (RemoteException e) {
4963                throw e.rethrowFromSystemServer();
4964            }
4965        }
4966        return false;
4967    }
4968
4969    /**
4970     * Called by profile or device owners to re-enable a system app that was disabled by default
4971     * when the user was initialized.
4972     *
4973     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4974     * @param packageName The package to be re-enabled in the calling profile.
4975     * @throws SecurityException if {@code admin} is not a device or profile owner.
4976     */
4977    public void enableSystemApp(@NonNull ComponentName admin, String packageName) {
4978        if (mService != null) {
4979            try {
4980                mService.enableSystemApp(admin, packageName);
4981            } catch (RemoteException e) {
4982                throw e.rethrowFromSystemServer();
4983            }
4984        }
4985    }
4986
4987    /**
4988     * Called by profile or device owners to re-enable system apps by intent that were disabled by
4989     * default when the user was initialized.
4990     *
4991     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4992     * @param intent An intent matching the app(s) to be installed. All apps that resolve for this
4993     *            intent will be re-enabled in the calling profile.
4994     * @return int The number of activities that matched the intent and were installed.
4995     * @throws SecurityException if {@code admin} is not a device or profile owner.
4996     */
4997    public int enableSystemApp(@NonNull ComponentName admin, Intent intent) {
4998        if (mService != null) {
4999            try {
5000                return mService.enableSystemAppWithIntent(admin, intent);
5001            } catch (RemoteException e) {
5002                throw e.rethrowFromSystemServer();
5003            }
5004        }
5005        return 0;
5006    }
5007
5008    /**
5009     * Called by a device owner or profile owner to disable account management for a specific type
5010     * of account.
5011     * <p>
5012     * The calling device admin must be a device owner or profile owner. If it is not, a security
5013     * exception will be thrown.
5014     * <p>
5015     * When account management is disabled for an account type, adding or removing an account of
5016     * that type will not be possible.
5017     * <p>
5018     * From {@link android.os.Build.VERSION_CODES#N} the profile or device owner can still use
5019     * {@link android.accounts.AccountManager} APIs to add or remove accounts when account
5020     * management for a specific type is disabled.
5021     *
5022     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5023     * @param accountType For which account management is disabled or enabled.
5024     * @param disabled The boolean indicating that account management will be disabled (true) or
5025     *            enabled (false).
5026     * @throws SecurityException if {@code admin} is not a device or profile owner.
5027     */
5028    public void setAccountManagementDisabled(@NonNull ComponentName admin, String accountType,
5029            boolean disabled) {
5030        if (mService != null) {
5031            try {
5032                mService.setAccountManagementDisabled(admin, accountType, disabled);
5033            } catch (RemoteException e) {
5034                throw e.rethrowFromSystemServer();
5035            }
5036        }
5037    }
5038
5039    /**
5040     * Gets the array of accounts for which account management is disabled by the profile owner.
5041     *
5042     * <p> Account management can be disabled/enabled by calling
5043     * {@link #setAccountManagementDisabled}.
5044     *
5045     * @return a list of account types for which account management has been disabled.
5046     *
5047     * @see #setAccountManagementDisabled
5048     */
5049    public String[] getAccountTypesWithManagementDisabled() {
5050        return getAccountTypesWithManagementDisabledAsUser(myUserId());
5051    }
5052
5053    /**
5054     * @see #getAccountTypesWithManagementDisabled()
5055     * @hide
5056     */
5057    public String[] getAccountTypesWithManagementDisabledAsUser(int userId) {
5058        if (mService != null) {
5059            try {
5060                return mService.getAccountTypesWithManagementDisabledAsUser(userId);
5061            } catch (RemoteException e) {
5062                throw e.rethrowFromSystemServer();
5063            }
5064        }
5065
5066        return null;
5067    }
5068
5069    /**
5070     * Sets which packages may enter lock task mode.
5071     * <p>
5072     * Any packages that shares uid with an allowed package will also be allowed to activate lock
5073     * task. From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task
5074     * package list results in locked tasks belonging to those packages to be finished. This
5075     * function can only be called by the device owner.
5076     *
5077     * @param packages The list of packages allowed to enter lock task mode
5078     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5079     * @throws SecurityException if {@code admin} is not a device owner.
5080     * @see Activity#startLockTask()
5081     * @see DeviceAdminReceiver#onLockTaskModeEntering(Context, Intent, String)
5082     * @see DeviceAdminReceiver#onLockTaskModeExiting(Context, Intent)
5083     * @see UserManager#DISALLOW_CREATE_WINDOWS
5084     */
5085    public void setLockTaskPackages(@NonNull ComponentName admin, String[] packages)
5086            throws SecurityException {
5087        if (mService != null) {
5088            try {
5089                mService.setLockTaskPackages(admin, packages);
5090            } catch (RemoteException e) {
5091                throw e.rethrowFromSystemServer();
5092            }
5093        }
5094    }
5095
5096    /**
5097     * This function returns the list of packages allowed to start the lock task mode.
5098     *
5099     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5100     * @hide
5101     */
5102    public String[] getLockTaskPackages(@NonNull ComponentName admin) {
5103        if (mService != null) {
5104            try {
5105                return mService.getLockTaskPackages(admin);
5106            } catch (RemoteException e) {
5107                throw e.rethrowFromSystemServer();
5108            }
5109        }
5110        return null;
5111    }
5112
5113    /**
5114     * This function lets the caller know whether the given component is allowed to start the
5115     * lock task mode.
5116     * @param pkg The package to check
5117     */
5118    public boolean isLockTaskPermitted(String pkg) {
5119        if (mService != null) {
5120            try {
5121                return mService.isLockTaskPermitted(pkg);
5122            } catch (RemoteException e) {
5123                throw e.rethrowFromSystemServer();
5124            }
5125        }
5126        return false;
5127    }
5128
5129    /**
5130     * Called by device owners to update {@link Settings.Global} settings. Validation that the value
5131     * of the setting is in the correct form for the setting type should be performed by the caller.
5132     * <p>
5133     * The settings that can be updated with this method are:
5134     * <ul>
5135     * <li>{@link Settings.Global#ADB_ENABLED}</li>
5136     * <li>{@link Settings.Global#AUTO_TIME}</li>
5137     * <li>{@link Settings.Global#AUTO_TIME_ZONE}</li>
5138     * <li>{@link Settings.Global#DATA_ROAMING}</li>
5139     * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
5140     * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li>
5141     * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only available from
5142     * {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
5143     * {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
5144     * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This setting is only
5145     * available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
5146     * </ul>
5147     * <p>
5148     * Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}:
5149     * <ul>
5150     * <li>{@link Settings.Global#BLUETOOTH_ON}. Use
5151     * {@link android.bluetooth.BluetoothAdapter#enable()} and
5152     * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
5153     * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
5154     * <li>{@link Settings.Global#MODE_RINGER}. Use
5155     * {@link android.media.AudioManager#setRingerMode(int)} instead.</li>
5156     * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
5157     * <li>{@link Settings.Global#WIFI_ON}. Use
5158     * {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
5159     * </ul>
5160     *
5161     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5162     * @param setting The name of the setting to update.
5163     * @param value The value to update the setting to.
5164     * @throws SecurityException if {@code admin} is not a device owner.
5165     */
5166    public void setGlobalSetting(@NonNull ComponentName admin, String setting, String value) {
5167        if (mService != null) {
5168            try {
5169                mService.setGlobalSetting(admin, setting, value);
5170            } catch (RemoteException e) {
5171                throw e.rethrowFromSystemServer();
5172            }
5173        }
5174    }
5175
5176    /**
5177     * Called by profile or device owners to update {@link Settings.Secure} settings. Validation
5178     * that the value of the setting is in the correct form for the setting type should be performed
5179     * by the caller.
5180     * <p>
5181     * The settings that can be updated by a profile or device owner with this method are:
5182     * <ul>
5183     * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
5184     * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li>
5185     * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
5186     * </ul>
5187     * <p>
5188     * A device owner can additionally update the following settings:
5189     * <ul>
5190     * <li>{@link Settings.Secure#LOCATION_MODE}</li>
5191     * </ul>
5192     *
5193     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5194     * @param setting The name of the setting to update.
5195     * @param value The value to update the setting to.
5196     * @throws SecurityException if {@code admin} is not a device or profile owner.
5197     */
5198    public void setSecureSetting(@NonNull ComponentName admin, String setting, String value) {
5199        if (mService != null) {
5200            try {
5201                mService.setSecureSetting(admin, setting, value);
5202            } catch (RemoteException e) {
5203                throw e.rethrowFromSystemServer();
5204            }
5205        }
5206    }
5207
5208    /**
5209     * Designates a specific service component as the provider for making permission requests of a
5210     * local or remote administrator of the user.
5211     * <p/>
5212     * Only a profile owner can designate the restrictions provider.
5213     *
5214     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5215     * @param provider The component name of the service that implements
5216     *            {@link RestrictionsReceiver}. If this param is null, it removes the restrictions
5217     *            provider previously assigned.
5218     * @throws SecurityException if {@code admin} is not a device or profile owner.
5219     */
5220    public void setRestrictionsProvider(@NonNull ComponentName admin,
5221            @Nullable ComponentName provider) {
5222        if (mService != null) {
5223            try {
5224                mService.setRestrictionsProvider(admin, provider);
5225            } catch (RemoteException re) {
5226                throw re.rethrowFromSystemServer();
5227            }
5228        }
5229    }
5230
5231    /**
5232     * Called by profile or device owners to set the master volume mute on or off.
5233     *
5234     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5235     * @param on {@code true} to mute master volume, {@code false} to turn mute off.
5236     * @throws SecurityException if {@code admin} is not a device or profile owner.
5237     */
5238    public void setMasterVolumeMuted(@NonNull ComponentName admin, boolean on) {
5239        if (mService != null) {
5240            try {
5241                mService.setMasterVolumeMuted(admin, on);
5242            } catch (RemoteException re) {
5243                throw re.rethrowFromSystemServer();
5244            }
5245        }
5246    }
5247
5248    /**
5249     * Called by profile or device owners to check whether the master volume mute is on or off.
5250     *
5251     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5252     * @return {@code true} if master volume is muted, {@code false} if it's not.
5253     * @throws SecurityException if {@code admin} is not a device or profile owner.
5254     */
5255    public boolean isMasterVolumeMuted(@NonNull ComponentName admin) {
5256        if (mService != null) {
5257            try {
5258                return mService.isMasterVolumeMuted(admin);
5259            } catch (RemoteException re) {
5260                throw re.rethrowFromSystemServer();
5261            }
5262        }
5263        return false;
5264    }
5265
5266    /**
5267     * Called by profile or device owners to change whether a user can uninstall a package.
5268     *
5269     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5270     * @param packageName package to change.
5271     * @param uninstallBlocked true if the user shouldn't be able to uninstall the package.
5272     * @throws SecurityException if {@code admin} is not a device or profile owner.
5273     */
5274    public void setUninstallBlocked(@NonNull ComponentName admin, String packageName,
5275            boolean uninstallBlocked) {
5276        if (mService != null) {
5277            try {
5278                mService.setUninstallBlocked(admin, packageName, uninstallBlocked);
5279            } catch (RemoteException re) {
5280                throw re.rethrowFromSystemServer();
5281            }
5282        }
5283    }
5284
5285    /**
5286     * Check whether the user has been blocked by device policy from uninstalling a package.
5287     * Requires the caller to be the profile owner if checking a specific admin's policy.
5288     * <p>
5289     * <strong>Note:</strong> Starting from {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}, the
5290     * behavior of this API is changed such that passing {@code null} as the {@code admin} parameter
5291     * will return if any admin has blocked the uninstallation. Before L MR1, passing {@code null}
5292     * will cause a NullPointerException to be raised.
5293     *
5294     * @param admin The name of the admin component whose blocking policy will be checked, or
5295     *            {@code null} to check whether any admin has blocked the uninstallation.
5296     * @param packageName package to check.
5297     * @return true if uninstallation is blocked.
5298     * @throws SecurityException if {@code admin} is not a device or profile owner.
5299     */
5300    public boolean isUninstallBlocked(@Nullable ComponentName admin, String packageName) {
5301        if (mService != null) {
5302            try {
5303                return mService.isUninstallBlocked(admin, packageName);
5304            } catch (RemoteException re) {
5305                throw re.rethrowFromSystemServer();
5306            }
5307        }
5308        return false;
5309    }
5310
5311    /**
5312     * Called by the profile owner of a managed profile to enable widget providers from a given
5313     * package to be available in the parent profile. As a result the user will be able to add
5314     * widgets from the white-listed package running under the profile to a widget host which runs
5315     * under the parent profile, for example the home screen. Note that a package may have zero or
5316     * more provider components, where each component provides a different widget type.
5317     * <p>
5318     * <strong>Note:</strong> By default no widget provider package is white-listed.
5319     *
5320     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5321     * @param packageName The package from which widget providers are white-listed.
5322     * @return Whether the package was added.
5323     * @throws SecurityException if {@code admin} is not a profile owner.
5324     * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
5325     * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
5326     */
5327    public boolean addCrossProfileWidgetProvider(@NonNull ComponentName admin, String packageName) {
5328        if (mService != null) {
5329            try {
5330                return mService.addCrossProfileWidgetProvider(admin, packageName);
5331            } catch (RemoteException re) {
5332                throw re.rethrowFromSystemServer();
5333            }
5334        }
5335        return false;
5336    }
5337
5338    /**
5339     * Called by the profile owner of a managed profile to disable widget providers from a given
5340     * package to be available in the parent profile. For this method to take effect the package
5341     * should have been added via
5342     * {@link #addCrossProfileWidgetProvider( android.content.ComponentName, String)}.
5343     * <p>
5344     * <strong>Note:</strong> By default no widget provider package is white-listed.
5345     *
5346     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5347     * @param packageName The package from which widget providers are no longer white-listed.
5348     * @return Whether the package was removed.
5349     * @throws SecurityException if {@code admin} is not a profile owner.
5350     * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
5351     * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
5352     */
5353    public boolean removeCrossProfileWidgetProvider(
5354            @NonNull ComponentName admin, String packageName) {
5355        if (mService != null) {
5356            try {
5357                return mService.removeCrossProfileWidgetProvider(admin, packageName);
5358            } catch (RemoteException re) {
5359                throw re.rethrowFromSystemServer();
5360            }
5361        }
5362        return false;
5363    }
5364
5365    /**
5366     * Called by the profile owner of a managed profile to query providers from which packages are
5367     * available in the parent profile.
5368     *
5369     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5370     * @return The white-listed package list.
5371     * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
5372     * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
5373     * @throws SecurityException if {@code admin} is not a profile owner.
5374     */
5375    public List<String> getCrossProfileWidgetProviders(@NonNull ComponentName admin) {
5376        if (mService != null) {
5377            try {
5378                List<String> providers = mService.getCrossProfileWidgetProviders(admin);
5379                if (providers != null) {
5380                    return providers;
5381                }
5382            } catch (RemoteException re) {
5383                throw re.rethrowFromSystemServer();
5384            }
5385        }
5386        return Collections.emptyList();
5387    }
5388
5389    /**
5390     * Called by profile or device owners to set the user's photo.
5391     *
5392     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5393     * @param icon the bitmap to set as the photo.
5394     * @throws SecurityException if {@code admin} is not a device or profile owner.
5395     */
5396    public void setUserIcon(@NonNull ComponentName admin, Bitmap icon) {
5397        try {
5398            mService.setUserIcon(admin, icon);
5399        } catch (RemoteException re) {
5400            throw re.rethrowFromSystemServer();
5401        }
5402    }
5403
5404    /**
5405     * Called by device owners to set a local system update policy. When a new policy is set,
5406     * {@link #ACTION_SYSTEM_UPDATE_POLICY_CHANGED} is broadcasted.
5407     *
5408     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. All
5409     *            components in the device owner package can set system update policies and the most
5410     *            recent policy takes effect.
5411     * @param policy the new policy, or {@code null} to clear the current policy.
5412     * @throws SecurityException if {@code admin} is not a device owner.
5413     * @see SystemUpdatePolicy
5414     */
5415    public void setSystemUpdatePolicy(@NonNull ComponentName admin, SystemUpdatePolicy policy) {
5416        if (mService != null) {
5417            try {
5418                mService.setSystemUpdatePolicy(admin, policy);
5419            } catch (RemoteException re) {
5420                throw re.rethrowFromSystemServer();
5421            }
5422        }
5423    }
5424
5425    /**
5426     * Retrieve a local system update policy set previously by {@link #setSystemUpdatePolicy}.
5427     *
5428     * @return The current policy object, or {@code null} if no policy is set.
5429     */
5430    public SystemUpdatePolicy getSystemUpdatePolicy() {
5431        if (mService != null) {
5432            try {
5433                return mService.getSystemUpdatePolicy();
5434            } catch (RemoteException re) {
5435                throw re.rethrowFromSystemServer();
5436            }
5437        }
5438        return null;
5439    }
5440
5441    /**
5442     * Called by a device owner to disable the keyguard altogether.
5443     * <p>
5444     * Setting the keyguard to disabled has the same effect as choosing "None" as the screen lock
5445     * type. However, this call has no effect if a password, pin or pattern is currently set. If a
5446     * password, pin or pattern is set after the keyguard was disabled, the keyguard stops being
5447     * disabled.
5448     *
5449     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5450     * @param disabled {@code true} disables the keyguard, {@code false} reenables it.
5451     * @return {@code false} if attempting to disable the keyguard while a lock password was in
5452     *         place. {@code true} otherwise.
5453     * @throws SecurityException if {@code admin} is not a device owner.
5454     */
5455    public boolean setKeyguardDisabled(@NonNull ComponentName admin, boolean disabled) {
5456        try {
5457            return mService.setKeyguardDisabled(admin, disabled);
5458        } catch (RemoteException re) {
5459            throw re.rethrowFromSystemServer();
5460        }
5461    }
5462
5463    /**
5464     * Called by device owner to disable the status bar. Disabling the status bar blocks
5465     * notifications, quick settings and other screen overlays that allow escaping from a single use
5466     * device.
5467     *
5468     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5469     * @param disabled {@code true} disables the status bar, {@code false} reenables it.
5470     * @return {@code false} if attempting to disable the status bar failed. {@code true} otherwise.
5471     * @throws SecurityException if {@code admin} is not a device owner.
5472     */
5473    public boolean setStatusBarDisabled(@NonNull ComponentName admin, boolean disabled) {
5474        try {
5475            return mService.setStatusBarDisabled(admin, disabled);
5476        } catch (RemoteException re) {
5477            throw re.rethrowFromSystemServer();
5478        }
5479    }
5480
5481    /**
5482     * Callable by the system update service to notify device owners about pending updates.
5483     * The caller must hold {@link android.Manifest.permission#NOTIFY_PENDING_SYSTEM_UPDATE}
5484     * permission.
5485     *
5486     * @param updateReceivedTime The time as given by {@link System#currentTimeMillis()} indicating
5487     *        when the current pending update was first available. -1 if no update is available.
5488     * @hide
5489     */
5490    @SystemApi
5491    public void notifyPendingSystemUpdate(long updateReceivedTime) {
5492        if (mService != null) {
5493            try {
5494                mService.notifyPendingSystemUpdate(updateReceivedTime);
5495            } catch (RemoteException re) {
5496                throw re.rethrowFromSystemServer();
5497            }
5498        }
5499    }
5500
5501    /**
5502     * Called by profile or device owners to set the default response for future runtime permission
5503     * requests by applications. The policy can allow for normal operation which prompts the user to
5504     * grant a permission, or can allow automatic granting or denying of runtime permission requests
5505     * by an application. This also applies to new permissions declared by app updates. When a
5506     * permission is denied or granted this way, the effect is equivalent to setting the permission
5507     * grant state via {@link #setPermissionGrantState}.
5508     * <p/>
5509     * As this policy only acts on runtime permission requests, it only applies to applications
5510     * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later.
5511     *
5512     * @param admin Which profile or device owner this request is associated with.
5513     * @param policy One of the policy constants {@link #PERMISSION_POLICY_PROMPT},
5514     *            {@link #PERMISSION_POLICY_AUTO_GRANT} and {@link #PERMISSION_POLICY_AUTO_DENY}.
5515     * @throws SecurityException if {@code admin} is not a device or profile owner.
5516     * @see #setPermissionGrantState
5517     */
5518    public void setPermissionPolicy(@NonNull ComponentName admin, int policy) {
5519        try {
5520            mService.setPermissionPolicy(admin, policy);
5521        } catch (RemoteException re) {
5522            throw re.rethrowFromSystemServer();
5523        }
5524    }
5525
5526    /**
5527     * Returns the current runtime permission policy set by the device or profile owner. The
5528     * default is {@link #PERMISSION_POLICY_PROMPT}.
5529     * @param admin Which profile or device owner this request is associated with.
5530     * @return the current policy for future permission requests.
5531     */
5532    public int getPermissionPolicy(ComponentName admin) {
5533        try {
5534            return mService.getPermissionPolicy(admin);
5535        } catch (RemoteException re) {
5536            throw re.rethrowFromSystemServer();
5537        }
5538    }
5539
5540    /**
5541     * Sets the grant state of a runtime permission for a specific application. The state can be
5542     * {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it through the UI,
5543     * {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission is denied and the user
5544     * cannot manage it through the UI, and {@link #PERMISSION_GRANT_STATE_GRANTED granted} in which
5545     * the permission is granted and the user cannot manage it through the UI. This might affect all
5546     * permissions in a group that the runtime permission belongs to. This method can only be called
5547     * by a profile or device owner.
5548     * <p/>
5549     * Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not revoke
5550     * the permission. It retains the previous grant, if any.
5551     * <p/>
5552     * Permissions can be granted or revoked only for applications built with a
5553     * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later.
5554     *
5555     * @param admin Which profile or device owner this request is associated with.
5556     * @param packageName The application to grant or revoke a permission to.
5557     * @param permission The permission to grant or revoke.
5558     * @param grantState The permission grant state which is one of
5559     *            {@link #PERMISSION_GRANT_STATE_DENIED}, {@link #PERMISSION_GRANT_STATE_DEFAULT},
5560     *            {@link #PERMISSION_GRANT_STATE_GRANTED},
5561     * @return whether the permission was successfully granted or revoked.
5562     * @throws SecurityException if {@code admin} is not a device or profile owner.
5563     * @see #PERMISSION_GRANT_STATE_DENIED
5564     * @see #PERMISSION_GRANT_STATE_DEFAULT
5565     * @see #PERMISSION_GRANT_STATE_GRANTED
5566     */
5567    public boolean setPermissionGrantState(@NonNull ComponentName admin, String packageName,
5568            String permission, int grantState) {
5569        try {
5570            return mService.setPermissionGrantState(admin, packageName, permission, grantState);
5571        } catch (RemoteException re) {
5572            throw re.rethrowFromSystemServer();
5573        }
5574    }
5575
5576    /**
5577     * Returns the current grant state of a runtime permission for a specific application.
5578     *
5579     * @param admin Which profile or device owner this request is associated with.
5580     * @param packageName The application to check the grant state for.
5581     * @param permission The permission to check for.
5582     * @return the current grant state specified by device policy. If the profile or device owner
5583     *         has not set a grant state, the return value is
5584     *         {@link #PERMISSION_GRANT_STATE_DEFAULT}. This does not indicate whether or not the
5585     *         permission is currently granted for the package.
5586     *         <p/>
5587     *         If a grant state was set by the profile or device owner, then the return value will
5588     *         be one of {@link #PERMISSION_GRANT_STATE_DENIED} or
5589     *         {@link #PERMISSION_GRANT_STATE_GRANTED}, which indicates if the permission is
5590     *         currently denied or granted.
5591     * @throws SecurityException if {@code admin} is not a device or profile owner.
5592     * @see #setPermissionGrantState(ComponentName, String, String, int)
5593     * @see PackageManager#checkPermission(String, String)
5594     */
5595    public int getPermissionGrantState(@NonNull ComponentName admin, String packageName,
5596            String permission) {
5597        try {
5598            return mService.getPermissionGrantState(admin, packageName, permission);
5599        } catch (RemoteException re) {
5600            throw re.rethrowFromSystemServer();
5601        }
5602    }
5603
5604    /**
5605     * Returns if provisioning a managed profile or device is possible or not.
5606     * @param action One of {@link #ACTION_PROVISION_MANAGED_DEVICE},
5607     * {@link #ACTION_PROVISION_MANAGED_PROFILE}.
5608     * @return if provisioning a managed profile or device is possible or not.
5609     * @throws IllegalArgumentException if the supplied action is not valid.
5610     */
5611    public boolean isProvisioningAllowed(String action) {
5612        try {
5613            return mService.isProvisioningAllowed(action);
5614        } catch (RemoteException re) {
5615            throw re.rethrowFromSystemServer();
5616        }
5617    }
5618
5619    /**
5620     * @hide
5621     * Return if this user is a managed profile of another user. An admin can become the profile
5622     * owner of a managed profile with {@link #ACTION_PROVISION_MANAGED_PROFILE} and of a managed
5623     * user with {@link #ACTION_PROVISION_MANAGED_USER}.
5624     * @param admin Which profile owner this request is associated with.
5625     * @return if this user is a managed profile of another user.
5626     */
5627    public boolean isManagedProfile(@NonNull ComponentName admin) {
5628        try {
5629            return mService.isManagedProfile(admin);
5630        } catch (RemoteException re) {
5631            throw re.rethrowFromSystemServer();
5632        }
5633    }
5634
5635    /**
5636     * @hide
5637     * Return if this user is a system-only user. An admin can manage a device from a system only
5638     * user by calling {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE}.
5639     * @param admin Which device owner this request is associated with.
5640     * @return if this user is a system-only user.
5641     */
5642    public boolean isSystemOnlyUser(@NonNull ComponentName admin) {
5643        try {
5644            return mService.isSystemOnlyUser(admin);
5645        } catch (RemoteException re) {
5646            throw re.rethrowFromSystemServer();
5647        }
5648    }
5649
5650    /**
5651     * Called by device owner to get the MAC address of the Wi-Fi device.
5652     *
5653     * @param admin Which device owner this request is associated with.
5654     * @return the MAC address of the Wi-Fi device, or null when the information is not available.
5655     *         (For example, Wi-Fi hasn't been enabled, or the device doesn't support Wi-Fi.)
5656     *         <p>
5657     *         The address will be in the {@code XX:XX:XX:XX:XX:XX} format.
5658     * @throws SecurityException if {@code admin} is not a device owner.
5659     */
5660    public String getWifiMacAddress(@NonNull ComponentName admin) {
5661        try {
5662            return mService.getWifiMacAddress(admin);
5663        } catch (RemoteException re) {
5664            throw re.rethrowFromSystemServer();
5665        }
5666    }
5667
5668    /**
5669     * Called by device owner to reboot the device. If there is an ongoing call on the device,
5670     * throws an {@link IllegalStateException}.
5671     * @param admin Which device owner the request is associated with.
5672     * @throws IllegalStateException if device has an ongoing call.
5673     * @throws SecurityException if {@code admin} is not a device owner.
5674     * @see TelephonyManager#CALL_STATE_IDLE
5675     */
5676    public void reboot(@NonNull ComponentName admin) {
5677        try {
5678            mService.reboot(admin);
5679        } catch (RemoteException re) {
5680            throw re.rethrowFromSystemServer();
5681        }
5682    }
5683
5684    /**
5685     * Called by a device admin to set the short support message. This will be displayed to the user
5686     * in settings screens where funtionality has been disabled by the admin. The message should be
5687     * limited to a short statement such as "This setting is disabled by your administrator. Contact
5688     * someone@example.com for support." If the message is longer than 200 characters it may be
5689     * truncated.
5690     * <p>
5691     * If the short support message needs to be localized, it is the responsibility of the
5692     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
5693     * and set a new version of this string accordingly.
5694     *
5695     * @see #setLongSupportMessage
5696     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5697     * @param message Short message to be displayed to the user in settings or null to clear the
5698     *            existing message.
5699     * @throws SecurityException if {@code admin} is not an active administrator.
5700     */
5701    public void setShortSupportMessage(@NonNull ComponentName admin,
5702            @Nullable String message) {
5703        if (mService != null) {
5704            try {
5705                mService.setShortSupportMessage(admin, message);
5706            } catch (RemoteException e) {
5707                throw e.rethrowFromSystemServer();
5708            }
5709        }
5710    }
5711
5712    /**
5713     * Called by a device admin to get the short support message.
5714     *
5715     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5716     * @return The message set by {@link #setShortSupportMessage(ComponentName, String)} or null if
5717     *         no message has been set.
5718     * @throws SecurityException if {@code admin} is not an active administrator.
5719     */
5720    public String getShortSupportMessage(@NonNull ComponentName admin) {
5721        if (mService != null) {
5722            try {
5723                return mService.getShortSupportMessage(admin);
5724            } catch (RemoteException e) {
5725                throw e.rethrowFromSystemServer();
5726            }
5727        }
5728        return null;
5729    }
5730
5731    /**
5732     * Called by a device admin to set the long support message. This will be displayed to the user
5733     * in the device administators settings screen.
5734     * <p>
5735     * If the long support message needs to be localized, it is the responsibility of the
5736     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
5737     * and set a new version of this string accordingly.
5738     *
5739     * @see #setShortSupportMessage
5740     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5741     * @param message Long message to be displayed to the user in settings or null to clear the
5742     *            existing message.
5743     * @throws SecurityException if {@code admin} is not an active administrator.
5744     */
5745    public void setLongSupportMessage(@NonNull ComponentName admin,
5746            @Nullable String message) {
5747        if (mService != null) {
5748            try {
5749                mService.setLongSupportMessage(admin, message);
5750            } catch (RemoteException e) {
5751                throw e.rethrowFromSystemServer();
5752            }
5753        }
5754    }
5755
5756    /**
5757     * Called by a device admin to get the long support message.
5758     *
5759     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5760     * @return The message set by {@link #setLongSupportMessage(ComponentName, String)} or null if
5761     *         no message has been set.
5762     * @throws SecurityException if {@code admin} is not an active administrator.
5763     */
5764    public String getLongSupportMessage(@NonNull ComponentName admin) {
5765        if (mService != null) {
5766            try {
5767                return mService.getLongSupportMessage(admin);
5768            } catch (RemoteException e) {
5769                throw e.rethrowFromSystemServer();
5770            }
5771        }
5772        return null;
5773    }
5774
5775    /**
5776     * Called by the system to get the short support message.
5777     *
5778     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5779     * @param userHandle user id the admin is running as.
5780     * @return The message set by {@link #setShortSupportMessage(ComponentName, String)}
5781     *
5782     * @hide
5783     */
5784    public String getShortSupportMessageForUser(@NonNull ComponentName admin, int userHandle) {
5785        if (mService != null) {
5786            try {
5787                return mService.getShortSupportMessageForUser(admin, userHandle);
5788            } catch (RemoteException e) {
5789                throw e.rethrowFromSystemServer();
5790            }
5791        }
5792        return null;
5793    }
5794
5795
5796    /**
5797     * Called by the system to get the long support message.
5798     *
5799     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5800     * @param userHandle user id the admin is running as.
5801     * @return The message set by {@link #setLongSupportMessage(ComponentName, String)}
5802     *
5803     * @hide
5804     */
5805    public String getLongSupportMessageForUser(@NonNull ComponentName admin, int userHandle) {
5806        if (mService != null) {
5807            try {
5808                return mService.getLongSupportMessageForUser(admin, userHandle);
5809            } catch (RemoteException e) {
5810                throw e.rethrowFromSystemServer();
5811            }
5812        }
5813        return null;
5814    }
5815
5816    /**
5817     * Called by the profile owner of a managed profile to obtain a {@link DevicePolicyManager}
5818     * whose calls act on the parent profile.
5819     * <p>
5820     * Note only some methods will work on the parent Manager.
5821     *
5822     * @return a new instance of {@link DevicePolicyManager} that acts on the parent profile.
5823     * @throws SecurityException if {@code admin} is not a profile owner.
5824     */
5825    public DevicePolicyManager getParentProfileInstance(@NonNull ComponentName admin) {
5826        try {
5827            if (!mService.isManagedProfile(admin)) {
5828                throw new SecurityException("The current user does not have a parent profile.");
5829            }
5830            return new DevicePolicyManager(mContext, true);
5831        } catch (RemoteException e) {
5832            throw e.rethrowFromSystemServer();
5833        }
5834    }
5835
5836    /**
5837     * Called by device owner to control the security logging feature. Logging can only be
5838     * enabled on single user devices where the sole user is managed by the device owner.
5839     *
5840     * <p> Security logs contain various information intended for security auditing purposes.
5841     * See {@link SecurityEvent} for details.
5842     *
5843     * <p>There must be only one user on the device, managed by the device owner.
5844     * Otherwise a {@link SecurityException} will be thrown.
5845     *
5846     * @param admin Which device owner this request is associated with.
5847     * @param enabled whether security logging should be enabled or not.
5848     * @throws SecurityException if {@code admin} is not a device owner.
5849     * @see #retrieveSecurityLogs
5850     */
5851    public void setSecurityLoggingEnabled(@NonNull ComponentName admin, boolean enabled) {
5852        try {
5853            mService.setSecurityLoggingEnabled(admin, enabled);
5854        } catch (RemoteException re) {
5855            throw re.rethrowFromSystemServer();
5856        }
5857    }
5858
5859    /**
5860     * Return whether security logging is enabled or not by the device owner.
5861     *
5862     * <p>Can only be called by the device owner, otherwise a {@link SecurityException} will be
5863     * thrown.
5864     *
5865     * @param admin Which device owner this request is associated with.
5866     * @return {@code true} if security logging is enabled by device owner, {@code false} otherwise.
5867     * @throws SecurityException if {@code admin} is not a device owner.
5868     */
5869    public boolean isSecurityLoggingEnabled(@NonNull ComponentName admin) {
5870        try {
5871            return mService.isSecurityLoggingEnabled(admin);
5872        } catch (RemoteException re) {
5873            throw re.rethrowFromSystemServer();
5874        }
5875    }
5876
5877    /**
5878     * Called by device owner to retrieve all new security logging entries since the last call to
5879     * this API after device boots.
5880     *
5881     * <p> Access to the logs is rate limited and it will only return new logs after the device
5882     * owner has been notified via {@link DeviceAdminReceiver#onSecurityLogsAvailable}.
5883     *
5884     * <p>There must be only one user on the device, managed by the device owner.
5885     * Otherwise a {@link SecurityException} will be thrown.
5886     *
5887     * @param admin Which device owner this request is associated with.
5888     * @return the new batch of security logs which is a list of {@link SecurityEvent},
5889     * or {@code null} if rate limitation is exceeded or if logging is currently disabled.
5890     * @throws SecurityException if {@code admin} is not a device owner.
5891     */
5892    public List<SecurityEvent> retrieveSecurityLogs(@NonNull ComponentName admin) {
5893        try {
5894            ParceledListSlice<SecurityEvent> list = mService.retrieveSecurityLogs(admin);
5895            if (list != null) {
5896                return list.getList();
5897            } else {
5898                // Rate limit exceeded.
5899                return null;
5900            }
5901        } catch (RemoteException re) {
5902            throw re.rethrowFromSystemServer();
5903        }
5904    }
5905
5906    /**
5907     * Called by the system to obtain a {@link DevicePolicyManager} whose calls act on the parent
5908     * profile.
5909     *
5910     * @hide
5911     */
5912    public DevicePolicyManager getParentProfileInstance(UserInfo uInfo) {
5913        mContext.checkSelfPermission(
5914                android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
5915        if (!uInfo.isManagedProfile()) {
5916            throw new SecurityException("The user " + uInfo.id
5917                    + " does not have a parent profile.");
5918        }
5919        return new DevicePolicyManager(mContext, true);
5920    }
5921
5922    /**
5923     * Called by device owners to retrieve device logs from before the device's last reboot.
5924     * <p>
5925     * <strong> The device logs are retrieved from a RAM region which is not guaranteed to be
5926     * corruption-free during power cycles, due to hardware variations and limitations. As a result,
5927     * this API is provided as best-effort and the returned logs may be empty or contain corrupted
5928     * data. </strong>
5929     * <p>
5930     * There must be only one user on the device, managed by the device owner. Otherwise a
5931     * {@link SecurityException} will be thrown.
5932     *
5933     * @param admin Which device owner this request is associated with.
5934     * @return Device logs from before the latest reboot of the system.
5935     * @throws SecurityException if {@code admin} is not a device owner.
5936     */
5937    public List<SecurityEvent> retrievePreRebootSecurityLogs(@NonNull ComponentName admin) {
5938        try {
5939            ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs(admin);
5940            return list.getList();
5941        } catch (RemoteException re) {
5942            throw re.rethrowFromSystemServer();
5943        }
5944    }
5945
5946    /**
5947     * Called by a profile owner of a managed profile to set the color used for customization. This
5948     * color is used as background color of the confirm credentials screen for that user. The
5949     * default color is teal (#00796B).
5950     * <p>
5951     * The confirm credentials screen can be created using
5952     * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent}.
5953     *
5954     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5955     * @param color The 32bit representation of the color to be used.
5956     * @throws SecurityException if {@code admin} is not a profile owner.
5957     */
5958    public void setOrganizationColor(@NonNull ComponentName admin, int color) {
5959        try {
5960            mService.setOrganizationColor(admin, color);
5961        } catch (RemoteException re) {
5962            throw re.rethrowFromSystemServer();
5963        }
5964    }
5965
5966    /**
5967     * @hide
5968     *
5969     * Sets the color used for customization.
5970     *
5971     * @param color The 32bit representation of the color to be used.
5972     * @param userId which user to set the color to.
5973     * @RequiresPermission(allOf = {
5974     *       Manifest.permission.MANAGE_USERS,
5975     *       Manifest.permission.INTERACT_ACROSS_USERS_FULL})
5976     */
5977    public void setOrganizationColorForUser(@ColorInt int color, @UserIdInt int userId) {
5978        try {
5979            mService.setOrganizationColorForUser(color, userId);
5980        } catch (RemoteException re) {
5981            throw re.rethrowFromSystemServer();
5982        }
5983    }
5984
5985    /**
5986     * Called by a profile owner of a managed profile to retrieve the color used for customization.
5987     * This color is used as background color of the confirm credentials screen for that user.
5988     *
5989     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5990     * @return The 32bit representation of the color to be used.
5991     * @throws SecurityException if {@code admin} is not a profile owner.
5992     */
5993    public int getOrganizationColor(@NonNull ComponentName admin) {
5994        try {
5995            return mService.getOrganizationColor(admin);
5996        } catch (RemoteException re) {
5997            throw re.rethrowFromSystemServer();
5998        }
5999    }
6000
6001    /**
6002     * @hide
6003     * Retrieve the customization color for a given user.
6004     *
6005     * @param userHandle The user id of the user we're interested in.
6006     * @return The 32bit representation of the color to be used.
6007     */
6008    public int getOrganizationColorForUser(int userHandle) {
6009        try {
6010            return mService.getOrganizationColorForUser(userHandle);
6011        } catch (RemoteException re) {
6012            throw re.rethrowFromSystemServer();
6013        }
6014    }
6015
6016    /**
6017     * Called by a profile owner of a managed profile to set the name of the organization under
6018     * management.
6019     * <p>
6020     * If the organization name needs to be localized, it is the responsibility of the
6021     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
6022     * and set a new version of this string accordingly.
6023     *
6024     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6025     * @param title The organization name or {@code null} to clear a previously set name.
6026     * @throws SecurityException if {@code admin} is not a profile owner.
6027     */
6028    public void setOrganizationName(@NonNull ComponentName admin, @Nullable String title) {
6029        try {
6030            mService.setOrganizationName(admin, title);
6031        } catch (RemoteException re) {
6032            throw re.rethrowFromSystemServer();
6033        }
6034    }
6035
6036    /**
6037     * Called by a profile owner of a managed profile to retrieve the name of the organization under
6038     * management.
6039     *
6040     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6041     * @return The organization name or {@code null} if none is set.
6042     * @throws SecurityException if {@code admin} is not a profile owner.
6043     */
6044    public String getOrganizationName(@NonNull ComponentName admin) {
6045        try {
6046            return mService.getOrganizationName(admin);
6047        } catch (RemoteException re) {
6048            throw re.rethrowFromSystemServer();
6049        }
6050    }
6051
6052    /**
6053     * Retrieve the default title message used in the confirm credentials screen for a given user.
6054     *
6055     * @param userHandle The user id of the user we're interested in.
6056     * @return The organization name or {@code null} if none is set.
6057     *
6058     * @hide
6059     */
6060    public String getOrganizationNameForUser(int userHandle) {
6061        try {
6062            return mService.getOrganizationNameForUser(userHandle);
6063        } catch (RemoteException re) {
6064            throw re.rethrowFromSystemServer();
6065        }
6066    }
6067
6068    /**
6069     * @return the {@link UserProvisioningState} for the current user - for unmanaged users will
6070     *         return {@link #STATE_USER_UNMANAGED}
6071     * @hide
6072     */
6073    @SystemApi
6074    @UserProvisioningState
6075    public int getUserProvisioningState() {
6076        if (mService != null) {
6077            try {
6078                return mService.getUserProvisioningState();
6079            } catch (RemoteException e) {
6080                throw e.rethrowFromSystemServer();
6081            }
6082        }
6083        return STATE_USER_UNMANAGED;
6084    }
6085
6086    /**
6087     * Set the {@link UserProvisioningState} for the supplied user, if they are managed.
6088     *
6089     * @param state to store
6090     * @param userHandle for user
6091     * @hide
6092     */
6093    public void setUserProvisioningState(@UserProvisioningState int state, int userHandle) {
6094        if (mService != null) {
6095            try {
6096                mService.setUserProvisioningState(state, userHandle);
6097            } catch (RemoteException e) {
6098                throw e.rethrowFromSystemServer();
6099            }
6100        }
6101    }
6102
6103    /**
6104     * @hide
6105     * Indicates the entity that controls the device or profile owner. A user/profile is considered
6106     * affiliated if it is managed by the same entity as the device.
6107     *
6108     * <p> By definition, the user that the device owner runs on is always affiliated. Any other
6109     * user/profile is considered affiliated if the following conditions are both met:
6110     * <ul>
6111     * <li>The device owner and the user's/profile's profile owner have called this method,
6112     *   specifying a set of opaque affiliation ids each. If the sets specified by the device owner
6113     *   and a profile owner intersect, they must have come from the same source, which means that
6114     *   the device owner and profile owner are controlled by the same entity.</li>
6115     * <li>The device owner's and profile owner's package names are the same.</li>
6116     * </ul>
6117     *
6118     * @param admin Which profile or device owner this request is associated with.
6119     * @param ids A set of opaque affiliation ids.
6120     */
6121    public void setAffiliationIds(@NonNull ComponentName admin, Set<String> ids) {
6122        try {
6123            mService.setAffiliationIds(admin, new ArrayList<String>(ids));
6124        } catch (RemoteException e) {
6125            throw e.rethrowFromSystemServer();
6126        }
6127    }
6128
6129    /**
6130     * @hide
6131     * Returns whether this user/profile is affiliated with the device. See
6132     * {@link #setAffiliationIds} for the definition of affiliation.
6133     *
6134     * @return whether this user/profile is affiliated with the device.
6135     */
6136    public boolean isAffiliatedUser() {
6137        try {
6138            return mService != null && mService.isAffiliatedUser();
6139        } catch (RemoteException e) {
6140            throw e.rethrowFromSystemServer();
6141        }
6142    }
6143
6144    /**
6145     * @hide
6146     * Returns whether the uninstall for {@code packageName} for the current user is in queue
6147     * to be started
6148     * @param packageName the package to check for
6149     * @return whether the uninstall intent for {@code packageName} is pending
6150     */
6151    public boolean isUninstallInQueue(String packageName) {
6152        try {
6153            return mService.isUninstallInQueue(packageName);
6154        } catch (RemoteException re) {
6155            throw re.rethrowFromSystemServer();
6156        }
6157    }
6158
6159    /**
6160     * @hide
6161     * @param packageName the package containing active DAs to be uninstalled
6162     */
6163    public void uninstallPackageWithActiveAdmins(String packageName) {
6164        try {
6165            mService.uninstallPackageWithActiveAdmins(packageName);
6166        } catch (RemoteException re) {
6167            throw re.rethrowFromSystemServer();
6168        }
6169    }
6170}
6171