DevicePolicyManager.java revision 01894fb02950c41a65c0b4a74c63cb8501b4f42c
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.RequiresPermission;
24import android.annotation.SdkConstant;
25import android.annotation.SdkConstant.SdkConstantType;
26import android.annotation.SuppressLint;
27import android.annotation.SystemApi;
28import android.annotation.SystemService;
29import android.annotation.TestApi;
30import android.annotation.UserIdInt;
31import android.annotation.WorkerThread;
32import android.app.Activity;
33import android.app.IServiceConnection;
34import android.app.KeyguardManager;
35import android.app.admin.SecurityLog.SecurityEvent;
36import android.content.ComponentName;
37import android.content.Context;
38import android.content.Intent;
39import android.content.IntentFilter;
40import android.content.ServiceConnection;
41import android.content.pm.ApplicationInfo;
42import android.content.pm.IPackageDataObserver;
43import android.content.pm.PackageManager;
44import android.content.pm.PackageManager.NameNotFoundException;
45import android.content.pm.ParceledListSlice;
46import android.content.pm.UserInfo;
47import android.graphics.Bitmap;
48import android.net.ProxyInfo;
49import android.net.Uri;
50import android.os.Bundle;
51import android.os.Handler;
52import android.os.Parcelable;
53import android.os.PersistableBundle;
54import android.os.Process;
55import android.os.RemoteCallback;
56import android.os.RemoteException;
57import android.os.UserHandle;
58import android.os.UserManager;
59import android.provider.ContactsContract.Directory;
60import android.security.Credentials;
61import android.service.restrictions.RestrictionsReceiver;
62import android.telephony.TelephonyManager;
63import android.util.ArraySet;
64import android.util.Log;
65
66import com.android.internal.R;
67import com.android.internal.annotations.VisibleForTesting;
68import com.android.internal.util.Preconditions;
69import com.android.org.conscrypt.TrustedCertificateStore;
70
71import java.io.ByteArrayInputStream;
72import java.io.IOException;
73import java.lang.annotation.Retention;
74import java.lang.annotation.RetentionPolicy;
75import java.net.InetSocketAddress;
76import java.net.Proxy;
77import java.security.KeyFactory;
78import java.security.NoSuchAlgorithmException;
79import java.security.PrivateKey;
80import java.security.cert.Certificate;
81import java.security.cert.CertificateException;
82import java.security.cert.CertificateFactory;
83import java.security.cert.X509Certificate;
84import java.security.spec.InvalidKeySpecException;
85import java.security.spec.PKCS8EncodedKeySpec;
86import java.util.ArrayList;
87import java.util.Arrays;
88import java.util.Collections;
89import java.util.List;
90import java.util.Set;
91
92/**
93 * Public interface for managing policies enforced on a device. Most clients of this class must be
94 * registered with the system as a <a href="{@docRoot}guide/topics/admin/device-admin.html">device
95 * administrator</a>. Additionally, a device administrator may be registered as either a profile or
96 * device owner. A given method is accessible to all device administrators unless the documentation
97 * for that method specifies that it is restricted to either device or profile owners. Any
98 * application calling an api may only pass as an argument a device administrator component it
99 * owns. Otherwise, a {@link SecurityException} will be thrown.
100 * <div class="special reference">
101 * <h3>Developer Guides</h3>
102 * <p>
103 * For more information about managing policies for device administration, read the <a href=
104 * "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> developer
105 * guide. </div>
106 */
107@SystemService(Context.DEVICE_POLICY_SERVICE)
108public class DevicePolicyManager {
109    private static String TAG = "DevicePolicyManager";
110
111    private final Context mContext;
112    private final IDevicePolicyManager mService;
113    private final boolean mParentInstance;
114
115    /** @hide */
116    public DevicePolicyManager(Context context, IDevicePolicyManager service) {
117        this(context, service, false);
118    }
119
120    /** @hide */
121    @VisibleForTesting
122    protected DevicePolicyManager(Context context, IDevicePolicyManager service,
123            boolean parentInstance) {
124        mContext = context;
125        mService = service;
126        mParentInstance = parentInstance;
127    }
128
129    /** @hide test will override it. */
130    @VisibleForTesting
131    protected int myUserId() {
132        return UserHandle.myUserId();
133    }
134
135    /**
136     * Activity action: Starts the provisioning flow which sets up a managed profile.
137     *
138     * <p>A managed profile allows data separation for example for the usage of a
139     * device as a personal and corporate device. The user which provisioning is started from and
140     * the managed profile share a launcher.
141     *
142     * <p>This intent will typically be sent by a mobile device management application (MDM).
143     * Provisioning adds a managed profile and sets the MDM as the profile owner who has full
144     * control over the profile.
145     *
146     * <p>It is possible to check if provisioning is allowed or not by querying the method
147     * {@link #isProvisioningAllowed(String)}.
148     *
149     * <p>In version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this intent must contain the
150     * extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}.
151     * As of {@link android.os.Build.VERSION_CODES#M}, it should contain the extra
152     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead, although specifying only
153     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported.
154     *
155     * <p>The intent may also contain the following extras:
156     * <ul>
157     * <li>{@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}, optional </li>
158     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional, supported from
159     * {@link android.os.Build.VERSION_CODES#N}</li>
160     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
161     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
162     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
163     * <li>{@link #EXTRA_PROVISIONING_SKIP_USER_CONSENT}, optional</li>
164     * <li>{@link #EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION}, optional</li>
165     * <li>{@link #EXTRA_PROVISIONING_DISCLAIMERS}, optional</li>
166     * </ul>
167     *
168     * <p>When managed provisioning has completed, broadcasts are sent to the application specified
169     * in the provisioning intent. The
170     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast is sent in the
171     * managed profile and the {@link #ACTION_MANAGED_PROFILE_PROVISIONED} broadcast is sent in
172     * the primary profile.
173     *
174     * <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has
175     * completed, along with the above broadcast, activity intent
176     * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the profile owner.
177     *
178     * <p>If provisioning fails, the managedProfile is removed so the device returns to its
179     * previous state.
180     *
181     * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a
182     * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of
183     * the provisioning flow was successful, although this doesn't guarantee the full flow will
184     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
185     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
186     */
187    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
188    public static final String ACTION_PROVISION_MANAGED_PROFILE
189        = "android.app.action.PROVISION_MANAGED_PROFILE";
190
191    /**
192     * Activity action: Starts the provisioning flow which sets up a managed user.
193     *
194     * <p>This intent will typically be sent by a mobile device management application (MDM).
195     * Provisioning configures the user as managed user and sets the MDM as the profile
196     * owner who has full control over the user. Provisioning can only happen before user setup has
197     * been completed. Use {@link #isProvisioningAllowed(String)} to check if provisioning is
198     * allowed.
199     *
200     * <p>The intent contains the following extras:
201     * <ul>
202     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
203     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
204     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
205     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
206     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
207     * </ul>
208     *
209     * <p>If provisioning fails, the device returns to its previous state.
210     *
211     * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a
212     * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of
213     * the provisioning flow was successful, although this doesn't guarantee the full flow will
214     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
215     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
216     *
217     * @hide
218     */
219    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
220    public static final String ACTION_PROVISION_MANAGED_USER
221        = "android.app.action.PROVISION_MANAGED_USER";
222
223    /**
224     * Activity action: Starts the provisioning flow which sets up a managed device.
225     * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}.
226     *
227     * <p> During device owner provisioning a device admin app is set as the owner of the device.
228     * A device owner has full control over the device. The device owner can not be modified by the
229     * user.
230     *
231     * <p> A typical use case would be a device that is owned by a company, but used by either an
232     * employee or client.
233     *
234     * <p> An intent with this action can be sent only on an unprovisioned device.
235     * It is possible to check if provisioning is allowed or not by querying the method
236     * {@link #isProvisioningAllowed(String)}.
237     *
238     * <p>The intent contains the following extras:
239     * <ul>
240     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
241     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
242     * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li>
243     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
244     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
245     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
246     * <li>{@link #EXTRA_PROVISIONING_DISCLAIMERS}, optional</li>
247     * </ul>
248     *
249     * <p>When device owner provisioning has completed, an intent of the type
250     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the
251     * device owner.
252     *
253     * <p>From version {@link android.os.Build.VERSION_CODES#O}, when device owner provisioning has
254     * completed, along with the above broadcast, activity intent
255     * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the device owner.
256     *
257     * <p>If provisioning fails, the device is factory reset.
258     *
259     * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part
260     * of the provisioning flow was successful, although this doesn't guarantee the full flow will
261     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
262     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
263     */
264    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
265    public static final String ACTION_PROVISION_MANAGED_DEVICE
266        = "android.app.action.PROVISION_MANAGED_DEVICE";
267
268    /**
269     * Activity action: launch when user provisioning completed, i.e.
270     * {@link #getUserProvisioningState()} returns one of the complete state.
271     *
272     * <p> Please note that the API behavior is not necessarily consistent across various releases,
273     * and devices, as it's contract between SetupWizard and ManagedProvisioning. The default
274     * implementation is that ManagedProvisioning launches SetupWizard in NFC provisioning only.
275     *
276     * <p> The activity must be protected by permission
277     * {@link android.Manifest.permission#BIND_DEVICE_ADMIN}, and the process must hold
278     * {@link android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE} to be launched.
279     * Only one {@link ComponentName} in the entire system should be enabled, and the rest of the
280     * components are not started by this intent.
281     * @hide
282     */
283    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
284    @SystemApi
285    public static final String ACTION_STATE_USER_SETUP_COMPLETE =
286            "android.app.action.STATE_USER_SETUP_COMPLETE";
287
288    /**
289     * Activity action: Starts the provisioning flow which sets up a managed device.
290     *
291     * <p>During device owner provisioning, a device admin app is downloaded and set as the owner of
292     * the device. A device owner has full control over the device. The device owner can not be
293     * modified by the user and the only way of resetting the device is via factory reset.
294     *
295     * <p>A typical use case would be a device that is owned by a company, but used by either an
296     * employee or client.
297     *
298     * <p>The provisioning message should be sent to an unprovisioned device.
299     *
300     * <p>Unlike {@link #ACTION_PROVISION_MANAGED_DEVICE}, the provisioning message can only be sent
301     * by a privileged app with the permission
302     * {@link android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE}.
303     *
304     * <p>The provisioning intent contains the following properties:
305     * <ul>
306     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
307     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li>
308     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
309     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li>
310     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL}, optional</li>
311     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI}, optional</li>
312     * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
313     * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
314     * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li>
315     * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li>
316     * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li>
317     * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li>
318     * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li>
319     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li>
320     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li>
321     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li>
322     * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li>
323     * <li>{@link #EXTRA_PROVISIONING_SUPPORT_URL}, optional</li>
324     * <li>{@link #EXTRA_PROVISIONING_ORGANIZATION_NAME}, optional</li>
325     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li></ul>
326     *
327     * @hide
328     */
329    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
330    @SystemApi
331    public static final String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE =
332            "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE";
333
334    /**
335     * Activity action: Starts the provisioning flow which sets up a managed device.
336     * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}.
337     *
338     * <p>NOTE: This is only supported on split system user devices, and puts the device into a
339     * management state that is distinct from that reached by
340     * {@link #ACTION_PROVISION_MANAGED_DEVICE} - specifically the device owner runs on the system
341     * user, and only has control over device-wide policies, not individual users and their data.
342     * The primary benefit is that multiple non-system users are supported when provisioning using
343     * this form of device management.
344     *
345     * <p>During device owner provisioning a device admin app is set as the owner of the device.
346     * A device owner has full control over the device. The device owner can not be modified by the
347     * user.
348     *
349     * <p>A typical use case would be a device that is owned by a company, but used by either an
350     * employee or client.
351     *
352     * <p>An intent with this action can be sent only on an unprovisioned device.
353     * It is possible to check if provisioning is allowed or not by querying the method
354     * {@link #isProvisioningAllowed(String)}.
355     *
356     * <p>The intent contains the following extras:
357     * <ul>
358     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li>
359     * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li>
360     * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li>
361     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li>
362     * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li>
363     * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li>
364     * </ul>
365     *
366     * <p>When device owner provisioning has completed, an intent of the type
367     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the
368     * device owner.
369     *
370     * <p>From version {@link android.os.Build.VERSION_CODES#O}, when device owner provisioning has
371     * completed, along with the above broadcast, activity intent
372     * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the device owner.
373     *
374     * <p>If provisioning fails, the device is factory reset.
375     *
376     * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part
377     * of the provisioning flow was successful, although this doesn't guarantee the full flow will
378     * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies
379     * that the user backed-out of provisioning, or some precondition for provisioning wasn't met.
380     *
381     * @hide
382     */
383    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
384    public static final String ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE
385        = "android.app.action.PROVISION_MANAGED_SHAREABLE_DEVICE";
386
387    /**
388     * Activity action: Finalizes management provisioning, should be used after user-setup
389     * has been completed and {@link #getUserProvisioningState()} returns one of:
390     * <ul>
391     * <li>{@link #STATE_USER_SETUP_INCOMPLETE}</li>
392     * <li>{@link #STATE_USER_SETUP_COMPLETE}</li>
393     * <li>{@link #STATE_USER_PROFILE_COMPLETE}</li>
394     * </ul>
395     *
396     * @hide
397     */
398    @SystemApi
399    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
400    public static final String ACTION_PROVISION_FINALIZATION
401            = "android.app.action.PROVISION_FINALIZATION";
402
403    /**
404     * Action: Bugreport sharing with device owner has been accepted by the user.
405     *
406     * @hide
407     */
408    public static final String ACTION_BUGREPORT_SHARING_ACCEPTED =
409            "com.android.server.action.REMOTE_BUGREPORT_SHARING_ACCEPTED";
410
411    /**
412     * Action: Bugreport sharing with device owner has been declined by the user.
413     *
414     * @hide
415     */
416    public static final String ACTION_BUGREPORT_SHARING_DECLINED =
417            "com.android.server.action.REMOTE_BUGREPORT_SHARING_DECLINED";
418
419    /**
420     * Action: Bugreport has been collected and is dispatched to {@code DevicePolicyManagerService}.
421     *
422     * @hide
423     */
424    public static final String ACTION_REMOTE_BUGREPORT_DISPATCH =
425            "android.intent.action.REMOTE_BUGREPORT_DISPATCH";
426
427    /**
428     * Extra for shared bugreport's SHA-256 hash.
429     *
430     * @hide
431     */
432    public static final String EXTRA_REMOTE_BUGREPORT_HASH =
433            "android.intent.extra.REMOTE_BUGREPORT_HASH";
434
435    /**
436     * Extra for remote bugreport notification shown type.
437     *
438     * @hide
439     */
440    public static final String EXTRA_BUGREPORT_NOTIFICATION_TYPE =
441            "android.app.extra.bugreport_notification_type";
442
443    /**
444     * Notification type for a started remote bugreport flow.
445     *
446     * @hide
447     */
448    public static final int NOTIFICATION_BUGREPORT_STARTED = 1;
449
450    /**
451     * Notification type for a bugreport that has already been accepted to be shared, but is still
452     * being taken.
453     *
454     * @hide
455     */
456    public static final int NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED = 2;
457
458    /**
459     * Notification type for a bugreport that has been taken and can be shared or declined.
460     *
461     * @hide
462     */
463    public static final int NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED = 3;
464
465    /**
466     * Default and maximum timeout in milliseconds after which unlocking with weak auth times out,
467     * i.e. the user has to use a strong authentication method like password, PIN or pattern.
468     *
469     * @hide
470     */
471    public static final long DEFAULT_STRONG_AUTH_TIMEOUT_MS = 72 * 60 * 60 * 1000; // 72h
472
473    /**
474     * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that
475     * allows a mobile device management application or NFC programmer application which starts
476     * managed provisioning to pass data to the management application instance after provisioning.
477     * <p>
478     * If used with {@link #ACTION_PROVISION_MANAGED_PROFILE} it can be used by the application that
479     * sends the intent to pass data to itself on the newly created profile.
480     * If used with {@link #ACTION_PROVISION_MANAGED_DEVICE} it allows passing data to the same
481     * instance of the app on the primary user.
482     * Starting from {@link android.os.Build.VERSION_CODES#M}, if used with
483     * {@link #MIME_TYPE_PROVISIONING_NFC} as part of NFC managed device provisioning, the NFC
484     * message should contain a stringified {@link java.util.Properties} instance, whose string
485     * properties will be converted into a {@link android.os.PersistableBundle} and passed to the
486     * management application after provisioning.
487     *
488     * <p>
489     * In both cases the application receives the data in
490     * {@link DeviceAdminReceiver#onProfileProvisioningComplete} via an intent with the action
491     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}. The bundle is not changed
492     * during the managed provisioning.
493     */
494    public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE =
495            "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
496
497    /**
498     * A String extra holding the package name of the mobile device management application that
499     * will be set as the profile owner or device owner.
500     *
501     * <p>If an application starts provisioning directly via an intent with action
502     * {@link #ACTION_PROVISION_MANAGED_PROFILE} this package has to match the package name of the
503     * application that started provisioning. The package will be set as profile owner in that case.
504     *
505     * <p>This package is set as device owner when device owner provisioning is started by an NFC
506     * message containing an NFC record with MIME type {@link #MIME_TYPE_PROVISIONING_NFC}.
507     *
508     * <p> When this extra is set, the application must have exactly one device admin receiver.
509     * This receiver will be set as the profile or device owner and active admin.
510     *
511     * @see DeviceAdminReceiver
512     * @deprecated Use {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}. This extra is still
513     * supported, but only if there is only one device admin receiver in the package that requires
514     * the permission {@link android.Manifest.permission#BIND_DEVICE_ADMIN}.
515     */
516    @Deprecated
517    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
518        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
519
520    /**
521     * A ComponentName extra indicating the device admin receiver of the mobile device management
522     * application that will be set as the profile owner or device owner and active admin.
523     *
524     * <p>If an application starts provisioning directly via an intent with action
525     * {@link #ACTION_PROVISION_MANAGED_PROFILE} or
526     * {@link #ACTION_PROVISION_MANAGED_DEVICE} the package name of this
527     * component has to match the package name of the application that started provisioning.
528     *
529     * <p>This component is set as device owner and active admin when device owner provisioning is
530     * started by an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or by an NFC
531     * message containing an NFC record with MIME type
532     * {@link #MIME_TYPE_PROVISIONING_NFC}. For the NFC record, the component name must be
533     * flattened to a string, via {@link ComponentName#flattenToShortString()}.
534     *
535     * @see DeviceAdminReceiver
536     */
537    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME
538        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
539
540    /**
541     * An {@link android.accounts.Account} extra holding the account to migrate during managed
542     * profile provisioning. If the account supplied is present in the primary user, it will be
543     * copied, along with its credentials to the managed profile and removed from the primary user.
544     *
545     * Use with {@link #ACTION_PROVISION_MANAGED_PROFILE}.
546     */
547
548    public static final String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
549        = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE";
550
551    /**
552     * Boolean extra to indicate that the migrated account should be kept. This is used in
553     * conjunction with {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}. If it's set to {@code true},
554     * the account will not be removed from the primary user after it is migrated to the newly
555     * created user or profile.
556     *
557     * <p> Defaults to {@code false}
558     *
559     * <p> Use with {@link #ACTION_PROVISION_MANAGED_PROFILE} and
560     * {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}
561     */
562    public static final String EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION
563            = "android.app.extra.PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION";
564
565    /**
566     * @deprecated From {@link android.os.Build.VERSION_CODES#O}, never used while provisioning the
567     * device.
568     */
569    @Deprecated
570    public static final String EXTRA_PROVISIONING_EMAIL_ADDRESS
571        = "android.app.extra.PROVISIONING_EMAIL_ADDRESS";
572
573    /**
574     * A integer extra indicating the predominant color to show during the provisioning.
575     * Refer to {@link android.graphics.Color} for how the color is represented.
576     *
577     * <p>Use with {@link #ACTION_PROVISION_MANAGED_PROFILE} or
578     * {@link #ACTION_PROVISION_MANAGED_DEVICE}.
579     */
580    public static final String EXTRA_PROVISIONING_MAIN_COLOR =
581             "android.app.extra.PROVISIONING_MAIN_COLOR";
582
583    /**
584     * A Boolean extra that can be used by the mobile device management application to skip the
585     * disabling of system apps during provisioning when set to {@code true}.
586     *
587     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action
588     * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning.
589     */
590    public static final String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED =
591            "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED";
592
593    /**
594     * A String extra holding the time zone {@link android.app.AlarmManager} that the device
595     * will be set to.
596     *
597     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
598     * provisioning via an NFC bump.
599     */
600    public static final String EXTRA_PROVISIONING_TIME_ZONE
601        = "android.app.extra.PROVISIONING_TIME_ZONE";
602
603    /**
604     * A Long extra holding the wall clock time (in milliseconds) to be set on the device's
605     * {@link android.app.AlarmManager}.
606     *
607     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
608     * provisioning via an NFC bump.
609     */
610    public static final String EXTRA_PROVISIONING_LOCAL_TIME
611        = "android.app.extra.PROVISIONING_LOCAL_TIME";
612
613    /**
614     * A String extra holding the {@link java.util.Locale} that the device will be set to.
615     * Format: xx_yy, where xx is the language code, and yy the country code.
616     *
617     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
618     * provisioning via an NFC bump.
619     */
620    public static final String EXTRA_PROVISIONING_LOCALE
621        = "android.app.extra.PROVISIONING_LOCALE";
622
623    /**
624     * A String extra holding the ssid of the wifi network that should be used during nfc device
625     * owner provisioning for downloading the mobile device management application.
626     *
627     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
628     * provisioning via an NFC bump.
629     */
630    public static final String EXTRA_PROVISIONING_WIFI_SSID
631        = "android.app.extra.PROVISIONING_WIFI_SSID";
632
633    /**
634     * A boolean extra indicating whether the wifi network in {@link #EXTRA_PROVISIONING_WIFI_SSID}
635     * is hidden or not.
636     *
637     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
638     * provisioning via an NFC bump.
639     */
640    public static final String EXTRA_PROVISIONING_WIFI_HIDDEN
641        = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
642
643    /**
644     * A String extra indicating the security type of the wifi network in
645     * {@link #EXTRA_PROVISIONING_WIFI_SSID} and could be one of {@code NONE}, {@code WPA} or
646     * {@code WEP}.
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_WIFI_SECURITY_TYPE
652        = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
653
654    /**
655     * A String extra holding the password of the wifi network in
656     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
657     *
658     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
659     * provisioning via an NFC bump.
660     */
661    public static final String EXTRA_PROVISIONING_WIFI_PASSWORD
662        = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
663
664    /**
665     * A String extra holding the proxy host for the wifi network in
666     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
667     *
668     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
669     * provisioning via an NFC bump.
670     */
671    public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST
672        = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
673
674    /**
675     * An int extra holding the proxy port for the wifi network in
676     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
677     *
678     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
679     * provisioning via an NFC bump.
680     */
681    public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT
682        = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
683
684    /**
685     * A String extra holding the proxy bypass for the wifi network in
686     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
687     *
688     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
689     * provisioning via an NFC bump.
690     */
691    public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
692        = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
693
694    /**
695     * A String extra holding the proxy auto-config (PAC) URL for the wifi network in
696     * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
697     *
698     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
699     * provisioning via an NFC bump.
700     */
701    public static final String EXTRA_PROVISIONING_WIFI_PAC_URL
702        = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
703
704    /**
705     * A String extra holding a url that specifies the download location of the device admin
706     * package. When not provided it is assumed that the device admin package is already installed.
707     *
708     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
709     * provisioning via an NFC bump.
710     */
711    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION
712        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
713
714    /**
715     * A String extra holding the localized name of the organization under management.
716     *
717     * The name is displayed only during provisioning.
718     *
719     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
720     *
721     * @hide
722     */
723    @SystemApi
724    public static final String EXTRA_PROVISIONING_ORGANIZATION_NAME =
725            "android.app.extra.PROVISIONING_ORGANIZATION_NAME";
726
727    /**
728     * A String extra holding a url to the website of the device provider so the user can open it
729     * during provisioning. If the url is not HTTPS, an error will be shown.
730     *
731     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
732     *
733     * @hide
734     */
735    @SystemApi
736    public static final String EXTRA_PROVISIONING_SUPPORT_URL =
737            "android.app.extra.PROVISIONING_SUPPORT_URL";
738
739    /**
740     * A String extra holding the localized name of the device admin package. It should be the same
741     * as the app label of the package.
742     *
743     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
744     *
745     * @hide
746     */
747    @SystemApi
748    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL =
749            "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL";
750
751    /**
752     * A {@link Uri} extra pointing to the app icon of device admin package. This image will be
753     * shown during the provisioning.
754     * <h5>The following URI schemes are accepted:</h5>
755     * <ul>
756     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
757     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
758     * </ul>
759     *
760     * <p> It is the responsibility of the caller to provide an image with a reasonable
761     * pixel density for the device.
762     *
763     * <p> If a content: URI is passed, the intent should have the flag
764     * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and the uri should be added to the
765     * {@link android.content.ClipData} of the intent too.
766     *
767     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
768     *
769     * @hide
770     */
771    @SystemApi
772    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI =
773            "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI";
774
775    /**
776     * An int extra holding a minimum required version code for the device admin package. If the
777     * device admin is already installed on the device, it will only be re-downloaded from
778     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION} if the version of the
779     * installed package is less than this version code.
780     *
781     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
782     * provisioning via an NFC bump.
783     */
784    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE
785        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
786
787    /**
788     * A String extra holding a http cookie header which should be used in the http request to the
789     * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
790     *
791     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
792     * provisioning via an NFC bump.
793     */
794    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
795        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
796
797    /**
798     * A String extra holding the URL-safe base64 encoded SHA-256 or SHA-1 hash (see notes below) of
799     * the file at download location specified in
800     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
801     *
802     * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM} must be
803     * present. The provided checksum must match the checksum of the file at the download
804     * location. If the checksum doesn't match an error will be shown to the user and the user will
805     * be asked to factory reset the device.
806     *
807     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
808     * provisioning via an NFC bump.
809     *
810     * <p><strong>Note:</strong> for devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP}
811     * and {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} only SHA-1 hash is supported.
812     * Starting from {@link android.os.Build.VERSION_CODES#M}, this parameter accepts SHA-256 in
813     * addition to SHA-1. Support for SHA-1 is likely to be removed in future OS releases.
814     */
815    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
816        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
817
818    /**
819     * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the
820     * android package archive at the download location specified in {@link
821     * #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
822     *
823     * <p>The signatures of an android package archive can be obtained using
824     * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag
825     * {@link android.content.pm.PackageManager#GET_SIGNATURES}.
826     *
827     * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} must be
828     * present. The provided checksum must match the checksum of any signature of the file at
829     * the download location. If the checksum does not match an error will be shown to the user and
830     * the user will be asked to factory reset the device.
831     *
832     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
833     * provisioning via an NFC bump.
834     */
835    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
836        = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM";
837
838    /**
839     * Broadcast Action: This broadcast is sent to indicate that provisioning of a managed profile
840     * has completed successfully.
841     *
842     * <p>The broadcast is limited to the primary profile, to the app specified in the provisioning
843     * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}.
844     *
845     * <p>This intent will contain the following extras
846     * <ul>
847     * <li>{@link Intent#EXTRA_USER}, corresponds to the {@link UserHandle} of the managed
848     * profile.</li>
849     * <li>{@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}, corresponds to the account requested to
850     * be migrated at provisioning time, if any.</li>
851     * </ul>
852     */
853    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
854    public static final String ACTION_MANAGED_PROFILE_PROVISIONED
855        = "android.app.action.MANAGED_PROFILE_PROVISIONED";
856
857    /**
858     * Activity action: This activity action is sent to indicate that provisioning of a managed
859     * profile or managed device has completed successfully. It'll be sent at the same time as
860     * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast but this will be
861     * delivered faster as it's an activity intent.
862     *
863     * <p>The intent is only sent to the new device or profile owner.
864     *
865     * @see #ACTION_PROVISION_MANAGED_PROFILE
866     * @see #ACTION_PROVISION_MANAGED_DEVICE
867     */
868    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
869    public static final String ACTION_PROVISIONING_SUCCESSFUL =
870            "android.app.action.PROVISIONING_SUCCESSFUL";
871
872    /**
873     * A boolean extra indicating whether device encryption can be skipped as part of device owner
874     * or managed profile provisioning.
875     *
876     * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action
877     * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning.
878     *
879     * <p>From {@link android.os.Build.VERSION_CODES#N} onwards, this is also supported for an
880     * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}.
881     */
882    public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION =
883             "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
884
885    /**
886     * A {@link Uri} extra pointing to a logo image. This image will be shown during the
887     * provisioning. If this extra is not passed, a default image will be shown.
888     * <h5>The following URI schemes are accepted:</h5>
889     * <ul>
890     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
891     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
892     * </ul>
893     *
894     * <p> It is the responsibility of the caller to provide an image with a reasonable
895     * pixel density for the device.
896     *
897     * <p> If a content: URI is passed, the intent should have the flag
898     * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and the uri should be added to the
899     * {@link android.content.ClipData} of the intent too.
900     *
901     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE} or
902     * {@link #ACTION_PROVISION_MANAGED_DEVICE}
903     */
904    public static final String EXTRA_PROVISIONING_LOGO_URI =
905            "android.app.extra.PROVISIONING_LOGO_URI";
906
907    /**
908     * A {@link Bundle}[] extra consisting of list of disclaimer headers and disclaimer contents.
909     * Each {@link Bundle} must have both {@link #EXTRA_PROVISIONING_DISCLAIMER_HEADER}
910     * as disclaimer header, and {@link #EXTRA_PROVISIONING_DISCLAIMER_CONTENT} as disclaimer
911     * content.
912     *
913     * <p> The extra typically contains one disclaimer from the company of mobile device
914     * management application (MDM), and one disclaimer from the organization.
915     *
916     * <p> Call {@link Bundle#putParcelableArray(String, Parcelable[])} to put the {@link Bundle}[]
917     *
918     * <p> Maximum 3 key-value pairs can be specified. The rest will be ignored.
919     *
920     * <p> Use in an intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE} or
921     * {@link #ACTION_PROVISION_MANAGED_DEVICE}
922     */
923    public static final String EXTRA_PROVISIONING_DISCLAIMERS =
924            "android.app.extra.PROVISIONING_DISCLAIMERS";
925
926    /**
927     * A String extra of localized disclaimer header.
928     *
929     * <p> The extra is typically the company name of mobile device management application (MDM)
930     * or the organization name.
931     *
932     * <p> Use in Bundle {@link #EXTRA_PROVISIONING_DISCLAIMERS}
933     *
934     * <p> System app, i.e. application with {@link ApplicationInfo#FLAG_SYSTEM}, can also insert a
935     * disclaimer by declaring an application-level meta-data in {@code AndroidManifest.xml}.
936     * Must use it with {@link #EXTRA_PROVISIONING_DISCLAIMER_CONTENT}. Here is the example:
937     *
938     * <pre>
939     *  &lt;meta-data
940     *      android:name="android.app.extra.PROVISIONING_DISCLAIMER_HEADER"
941     *      android:resource="@string/disclaimer_header"
942     * /&gt;</pre>
943     */
944    public static final String EXTRA_PROVISIONING_DISCLAIMER_HEADER =
945            "android.app.extra.PROVISIONING_DISCLAIMER_HEADER";
946
947    /**
948     * A {@link Uri} extra pointing to disclaimer content.
949     *
950     * <h5>The following URI schemes are accepted:</h5>
951     * <ul>
952     * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
953     * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
954     * </ul>
955     *
956     * <p> Styled text is supported in the disclaimer content. The content is parsed by
957     * {@link android.text.Html#fromHtml(String)} and displayed in a
958     * {@link android.widget.TextView}.
959     *
960     * <p> If a <code>content:</code> URI is passed, URI is passed, the intent should have the flag
961     * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and the uri should be added to the
962     * {@link android.content.ClipData} of the intent too.
963     *
964     * <p> Use in Bundle {@link #EXTRA_PROVISIONING_DISCLAIMERS}
965     *
966     * <p> System app, i.e. application with {@link ApplicationInfo#FLAG_SYSTEM}, can also insert a
967     * disclaimer by declaring an application-level meta-data in {@code AndroidManifest.xml}.
968     * Must use it with {@link #EXTRA_PROVISIONING_DISCLAIMER_HEADER}. Here is the example:
969     *
970     * <pre>
971     *  &lt;meta-data
972     *      android:name="android.app.extra.PROVISIONING_DISCLAIMER_CONTENT"
973     *      android:resource="@string/disclaimer_content"
974     * /&gt;</pre>
975     */
976    public static final String EXTRA_PROVISIONING_DISCLAIMER_CONTENT =
977            "android.app.extra.PROVISIONING_DISCLAIMER_CONTENT";
978
979    /**
980     * A boolean extra indicating if user setup should be skipped, for when provisioning is started
981     * during setup-wizard.
982     *
983     * <p>If unspecified, defaults to {@code true} to match the behavior in
984     * {@link android.os.Build.VERSION_CODES#M} and earlier.
985     *
986     * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or
987     * {@link #ACTION_PROVISION_MANAGED_USER}.
988     *
989     * @hide
990     */
991    public static final String EXTRA_PROVISIONING_SKIP_USER_SETUP =
992            "android.app.extra.PROVISIONING_SKIP_USER_SETUP";
993
994    /**
995     * A boolean extra indicating if the user consent steps from the provisioning flow should be
996     * skipped. If unspecified, defaults to {@code false}.
997     *
998     * It can only be used by an existing device owner trying to create a managed profile via
999     * {@link #ACTION_PROVISION_MANAGED_PROFILE}. Otherwise it is ignored.
1000     */
1001    public static final String EXTRA_PROVISIONING_SKIP_USER_CONSENT =
1002            "android.app.extra.PROVISIONING_SKIP_USER_CONSENT";
1003
1004    /**
1005     * This MIME type is used for starting the device owner provisioning.
1006     *
1007     * <p>During device owner provisioning a device admin app is set as the owner of the device.
1008     * A device owner has full control over the device. The device owner can not be modified by the
1009     * user and the only way of resetting the device is if the device owner app calls a factory
1010     * reset.
1011     *
1012     * <p> A typical use case would be a device that is owned by a company, but used by either an
1013     * employee or client.
1014     *
1015     * <p> The NFC message must be sent to an unprovisioned device.
1016     *
1017     * <p>The NFC record must contain a serialized {@link java.util.Properties} object which
1018     * contains the following properties:
1019     * <ul>
1020     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}</li>
1021     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li>
1022     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
1023     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li>
1024     * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
1025     * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
1026     * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li>
1027     * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li>
1028     * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li>
1029     * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li>
1030     * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li>
1031     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li>
1032     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li>
1033     * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li>
1034     * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li>
1035     * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional, supported from
1036     * {@link android.os.Build.VERSION_CODES#M} </li></ul>
1037     *
1038     * <p>
1039     * As of {@link android.os.Build.VERSION_CODES#M}, the properties should contain
1040     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead of
1041     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}, (although specifying only
1042     * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported).
1043     */
1044    public static final String MIME_TYPE_PROVISIONING_NFC
1045        = "application/com.android.managedprovisioning";
1046
1047    /**
1048     * Activity action: ask the user to add a new device administrator to the system.
1049     * The desired policy is the ComponentName of the policy in the
1050     * {@link #EXTRA_DEVICE_ADMIN} extra field.  This will invoke a UI to
1051     * bring the user through adding the device administrator to the system (or
1052     * allowing them to reject it).
1053     *
1054     * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
1055     * field to provide the user with additional explanation (in addition
1056     * to your component's description) about what is being added.
1057     *
1058     * <p>If your administrator is already active, this will ordinarily return immediately (without
1059     * user intervention).  However, if your administrator has been updated and is requesting
1060     * additional uses-policy flags, the user will be presented with the new list.  New policies
1061     * will not be available to the updated administrator until the user has accepted the new list.
1062     */
1063    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1064    public static final String ACTION_ADD_DEVICE_ADMIN
1065            = "android.app.action.ADD_DEVICE_ADMIN";
1066
1067    /**
1068     * @hide
1069     * Activity action: ask the user to add a new device administrator as the profile owner
1070     * for this user. Only system apps can launch this intent.
1071     *
1072     * <p>The ComponentName of the profile owner admin is passed in the {@link #EXTRA_DEVICE_ADMIN}
1073     * extra field. This will invoke a UI to bring the user through adding the profile owner admin
1074     * to remotely control restrictions on the user.
1075     *
1076     * <p>The intent must be invoked via {@link Activity#startActivityForResult} to receive the
1077     * result of whether or not the user approved the action. If approved, the result will
1078     * be {@link Activity#RESULT_OK} and the component will be set as an active admin as well
1079     * as a profile owner.
1080     *
1081     * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
1082     * field to provide the user with additional explanation (in addition
1083     * to your component's description) about what is being added.
1084     *
1085     * <p>If there is already a profile owner active or the caller is not a system app, the
1086     * operation will return a failure result.
1087     */
1088    @SystemApi
1089    public static final String ACTION_SET_PROFILE_OWNER
1090            = "android.app.action.SET_PROFILE_OWNER";
1091
1092    /**
1093     * @hide
1094     * Name of the profile owner admin that controls the user.
1095     */
1096    @SystemApi
1097    public static final String EXTRA_PROFILE_OWNER_NAME
1098            = "android.app.extra.PROFILE_OWNER_NAME";
1099
1100    /**
1101     * Broadcast action: send when any policy admin changes a policy.
1102     * This is generally used to find out when a new policy is in effect.
1103     *
1104     * @hide
1105     */
1106    public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
1107            = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED";
1108
1109    /**
1110     * Broadcast action: sent when the device owner is set, changed or cleared.
1111     *
1112     * This broadcast is sent only to the primary user.
1113     * @see #ACTION_PROVISION_MANAGED_DEVICE
1114     */
1115    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1116    public static final String ACTION_DEVICE_OWNER_CHANGED
1117            = "android.app.action.DEVICE_OWNER_CHANGED";
1118
1119    /**
1120     * The ComponentName of the administrator component.
1121     *
1122     * @see #ACTION_ADD_DEVICE_ADMIN
1123     */
1124    public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
1125
1126    /**
1127     * An optional CharSequence providing additional explanation for why the
1128     * admin is being added.
1129     *
1130     * @see #ACTION_ADD_DEVICE_ADMIN
1131     */
1132    public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
1133
1134    /**
1135     * Constant to indicate the feature of disabling the camera. Used as argument to
1136     * {@link #createAdminSupportIntent(String)}.
1137     * @see #setCameraDisabled(ComponentName, boolean)
1138     */
1139    public static final String POLICY_DISABLE_CAMERA = "policy_disable_camera";
1140
1141    /**
1142     * Constant to indicate the feature of disabling screen captures. Used as argument to
1143     * {@link #createAdminSupportIntent(String)}.
1144     * @see #setScreenCaptureDisabled(ComponentName, boolean)
1145     */
1146    public static final String POLICY_DISABLE_SCREEN_CAPTURE = "policy_disable_screen_capture";
1147
1148    /**
1149     * A String indicating a specific restricted feature. Can be a user restriction from the
1150     * {@link UserManager}, e.g. {@link UserManager#DISALLOW_ADJUST_VOLUME}, or one of the values
1151     * {@link #POLICY_DISABLE_CAMERA} or {@link #POLICY_DISABLE_SCREEN_CAPTURE}.
1152     * @see #createAdminSupportIntent(String)
1153     * @hide
1154     */
1155    @TestApi
1156    public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
1157
1158    /**
1159     * Activity action: have the user enter a new password. This activity should
1160     * be launched after using {@link #setPasswordQuality(ComponentName, int)},
1161     * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user
1162     * enter a new password that meets the current requirements. You can use
1163     * {@link #isActivePasswordSufficient()} to determine whether you need to
1164     * have the user select a new password in order to meet the current
1165     * constraints. Upon being resumed from this activity, you can check the new
1166     * password characteristics to see if they are sufficient.
1167     *
1168     * If the intent is launched from within a managed profile with a profile
1169     * owner built against {@link android.os.Build.VERSION_CODES#M} or before,
1170     * this will trigger entering a new password for the parent of the profile.
1171     * For all other cases it will trigger entering a new password for the user
1172     * or profile it is launched from.
1173     *
1174     * @see #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
1175     */
1176    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1177    public static final String ACTION_SET_NEW_PASSWORD
1178            = "android.app.action.SET_NEW_PASSWORD";
1179
1180    /**
1181     * Activity action: have the user enter a new password for the parent profile.
1182     * If the intent is launched from within a managed profile, this will trigger
1183     * entering a new password for the parent of the profile. In all other cases
1184     * the behaviour is identical to {@link #ACTION_SET_NEW_PASSWORD}.
1185     */
1186    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1187    public static final String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
1188            = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD";
1189
1190    /**
1191     * Broadcast action: Tell the status bar to open the device monitoring dialog, e.g. when
1192     * Network logging was enabled and the user tapped the notification.
1193     * <p class="note">This is a protected intent that can only be sent by the system.</p>
1194     * @hide
1195     */
1196    public static final String ACTION_SHOW_DEVICE_MONITORING_DIALOG
1197            = "android.app.action.SHOW_DEVICE_MONITORING_DIALOG";
1198
1199    /**
1200     * Broadcast Action: Sent after application delegation scopes are changed. The new delegation
1201     * scopes will be sent in an {@code ArrayList<String>} extra identified by the
1202     * {@link #EXTRA_DELEGATION_SCOPES} key.
1203     *
1204     * <p class=”note”> Note: This is a protected intent that can only be sent by the system.</p>
1205     */
1206    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1207    public static final String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED =
1208            "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
1209
1210    /**
1211     * An {@code ArrayList<String>} corresponding to the delegation scopes given to an app in the
1212     * {@link #ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED} broadcast.
1213     */
1214    public static final String EXTRA_DELEGATION_SCOPES = "android.app.extra.DELEGATION_SCOPES";
1215
1216    /**
1217     * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in
1218     * the parent profile to access intents sent from the managed profile.
1219     * That is, when an app in the managed profile calls
1220     * {@link Activity#startActivity(Intent)}, the intent can be resolved by a
1221     * matching activity in the parent profile.
1222     */
1223    public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 0x0001;
1224
1225    /**
1226     * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in
1227     * the managed profile to access intents sent from the parent profile.
1228     * That is, when an app in the parent profile calls
1229     * {@link Activity#startActivity(Intent)}, the intent can be resolved by a
1230     * matching activity in the managed profile.
1231     */
1232    public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 0x0002;
1233
1234    /**
1235     * Broadcast action: notify that a new local system update policy has been set by the device
1236     * owner. The new policy can be retrieved by {@link #getSystemUpdatePolicy()}.
1237     */
1238    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1239    public static final String ACTION_SYSTEM_UPDATE_POLICY_CHANGED
1240            = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
1241
1242    /**
1243     * Permission policy to prompt user for new permission requests for runtime permissions.
1244     * Already granted or denied permissions are not affected by this.
1245     */
1246    public static final int PERMISSION_POLICY_PROMPT = 0;
1247
1248    /**
1249     * Permission policy to always grant new permission requests for runtime permissions.
1250     * Already granted or denied permissions are not affected by this.
1251     */
1252    public static final int PERMISSION_POLICY_AUTO_GRANT = 1;
1253
1254    /**
1255     * Permission policy to always deny new permission requests for runtime permissions.
1256     * Already granted or denied permissions are not affected by this.
1257     */
1258    public static final int PERMISSION_POLICY_AUTO_DENY = 2;
1259
1260    /**
1261     * Runtime permission state: The user can manage the permission
1262     * through the UI.
1263     */
1264    public static final int PERMISSION_GRANT_STATE_DEFAULT = 0;
1265
1266    /**
1267     * Runtime permission state: The permission is granted to the app
1268     * and the user cannot manage the permission through the UI.
1269     */
1270    public static final int PERMISSION_GRANT_STATE_GRANTED = 1;
1271
1272    /**
1273     * Runtime permission state: The permission is denied to the app
1274     * and the user cannot manage the permission through the UI.
1275     */
1276    public static final int PERMISSION_GRANT_STATE_DENIED = 2;
1277
1278    /**
1279     * Delegation of certificate installation and management. This scope grants access to the
1280     * {@link #getInstalledCaCerts}, {@link #hasCaCertInstalled}, {@link #installCaCert},
1281     * {@link #uninstallCaCert}, {@link #uninstallAllUserCaCerts} and {@link #installKeyPair} APIs.
1282     */
1283    public static final String DELEGATION_CERT_INSTALL = "delegation-cert-install";
1284
1285    /**
1286     * Delegation of application restrictions management. This scope grants access to the
1287     * {@link #setApplicationRestrictions} and {@link #getApplicationRestrictions} APIs.
1288     */
1289    public static final String DELEGATION_APP_RESTRICTIONS = "delegation-app-restrictions";
1290
1291    /**
1292     * Delegation of application uninstall block. This scope grants access to the
1293     * {@link #setUninstallBlocked} API.
1294     */
1295    public static final String DELEGATION_BLOCK_UNINSTALL = "delegation-block-uninstall";
1296
1297    /**
1298     * Delegation of permission policy and permission grant state. This scope grants access to the
1299     * {@link #setPermissionPolicy}, {@link #getPermissionGrantState},
1300     * and {@link #setPermissionGrantState} APIs.
1301     */
1302    public static final String DELEGATION_PERMISSION_GRANT = "delegation-permission-grant";
1303
1304    /**
1305     * Delegation of package access state. This scope grants access to the
1306     * {@link #isApplicationHidden}, {@link #setApplicationHidden}, {@link #isPackageSuspended}, and
1307     * {@link #setPackagesSuspended} APIs.
1308     */
1309    public static final String DELEGATION_PACKAGE_ACCESS = "delegation-package-access";
1310
1311    /**
1312     * Delegation for enabling system apps. This scope grants access to the {@link #enableSystemApp}
1313     * API.
1314     */
1315    public static final String DELEGATION_ENABLE_SYSTEM_APP = "delegation-enable-system-app";
1316
1317    /**
1318     * Delegation of management of uninstalled packages. This scope grants access to the
1319     * {@code #setKeepUninstalledPackages} and {@code #getKeepUninstalledPackages} APIs.
1320     * @hide
1321     */
1322    public static final String DELEGATION_KEEP_UNINSTALLED_PACKAGES =
1323            "delegation-keep-uninstalled-packages";
1324
1325    /**
1326     * No management for current user in-effect. This is the default.
1327     * @hide
1328     */
1329    @SystemApi
1330    public static final int STATE_USER_UNMANAGED = 0;
1331
1332    /**
1333     * Management partially setup, user setup needs to be completed.
1334     * @hide
1335     */
1336    @SystemApi
1337    public static final int STATE_USER_SETUP_INCOMPLETE = 1;
1338
1339    /**
1340     * Management partially setup, user setup completed.
1341     * @hide
1342     */
1343    @SystemApi
1344    public static final int STATE_USER_SETUP_COMPLETE = 2;
1345
1346    /**
1347     * Management setup and active on current user.
1348     * @hide
1349     */
1350    @SystemApi
1351    public static final int STATE_USER_SETUP_FINALIZED = 3;
1352
1353    /**
1354     * Management partially setup on a managed profile.
1355     * @hide
1356     */
1357    @SystemApi
1358    public static final int STATE_USER_PROFILE_COMPLETE = 4;
1359
1360    /**
1361     * @hide
1362     */
1363    @IntDef({STATE_USER_UNMANAGED, STATE_USER_SETUP_INCOMPLETE, STATE_USER_SETUP_COMPLETE,
1364            STATE_USER_SETUP_FINALIZED, STATE_USER_PROFILE_COMPLETE})
1365    @Retention(RetentionPolicy.SOURCE)
1366    public @interface UserProvisioningState {}
1367
1368    /**
1369     * Result code for {@link #checkProvisioningPreCondition}.
1370     *
1371     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE},
1372     * {@link #ACTION_PROVISION_MANAGED_PROFILE}, {@link #ACTION_PROVISION_MANAGED_USER} and
1373     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} when provisioning is allowed.
1374     *
1375     * @hide
1376     */
1377    public static final int CODE_OK = 0;
1378
1379    /**
1380     * Result code for {@link #checkProvisioningPreCondition}.
1381     *
1382     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE} and
1383     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} when the device already has a device
1384     * owner.
1385     *
1386     * @hide
1387     */
1388    public static final int CODE_HAS_DEVICE_OWNER = 1;
1389
1390    /**
1391     * Result code for {@link #checkProvisioningPreCondition}.
1392     *
1393     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE},
1394     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} when the user has a profile owner and for
1395     * {@link #ACTION_PROVISION_MANAGED_PROFILE} when the profile owner is already set.
1396     *
1397     * @hide
1398     */
1399    public static final int CODE_USER_HAS_PROFILE_OWNER = 2;
1400
1401    /**
1402     * Result code for {@link #checkProvisioningPreCondition}.
1403     *
1404     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE} and
1405     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} when the user isn't running.
1406     *
1407     * @hide
1408     */
1409    public static final int CODE_USER_NOT_RUNNING = 3;
1410
1411    /**
1412     * Result code for {@link #checkProvisioningPreCondition}.
1413     *
1414     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE},
1415     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} if the device has already been setup and
1416     * for {@link #ACTION_PROVISION_MANAGED_USER} if the user has already been setup.
1417     *
1418     * @hide
1419     */
1420    public static final int CODE_USER_SETUP_COMPLETED = 4;
1421
1422    /**
1423     * Code used to indicate that the device also has a user other than the system user.
1424     *
1425     * @hide
1426     */
1427    public static final int CODE_NONSYSTEM_USER_EXISTS = 5;
1428
1429    /**
1430     * Code used to indicate that device has an account that prevents provisioning.
1431     *
1432     * @hide
1433     */
1434    public static final int CODE_ACCOUNTS_NOT_EMPTY = 6;
1435
1436    /**
1437     * Result code for {@link #checkProvisioningPreCondition}.
1438     *
1439     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE} and
1440     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} if the user is not a system user.
1441     *
1442     * @hide
1443     */
1444    public static final int CODE_NOT_SYSTEM_USER = 7;
1445
1446    /**
1447     * Result code for {@link #checkProvisioningPreCondition}.
1448     *
1449     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE},
1450     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} and {@link #ACTION_PROVISION_MANAGED_USER}
1451     * when the device is a watch and is already paired.
1452     *
1453     * @hide
1454     */
1455    public static final int CODE_HAS_PAIRED = 8;
1456
1457    /**
1458     * Result code for {@link #checkProvisioningPreCondition}.
1459     *
1460     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_PROFILE} and
1461     * {@link #ACTION_PROVISION_MANAGED_USER} on devices which do not support managed users.
1462     *
1463     * @see {@link PackageManager#FEATURE_MANAGED_USERS}
1464     * @hide
1465     */
1466    public static final int CODE_MANAGED_USERS_NOT_SUPPORTED = 9;
1467
1468    /**
1469     * Result code for {@link #checkProvisioningPreCondition}.
1470     *
1471     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_USER} if the user is a system user.
1472     *
1473     * @hide
1474     */
1475    public static final int CODE_SYSTEM_USER = 10;
1476
1477    /**
1478     * Result code for {@link #checkProvisioningPreCondition}.
1479     *
1480     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_PROFILE} when the user cannot have more
1481     * managed profiles.
1482     *
1483     * @hide
1484     */
1485    public static final int CODE_CANNOT_ADD_MANAGED_PROFILE = 11;
1486
1487    /**
1488     * Result code for {@link #checkProvisioningPreCondition}.
1489     *
1490     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_USER} and
1491     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} on devices not running with split system
1492     * user.
1493     *
1494     * @hide
1495     */
1496    public static final int CODE_NOT_SYSTEM_USER_SPLIT = 12;
1497
1498    /**
1499     * Result code for {@link #checkProvisioningPreCondition}.
1500     *
1501     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_DEVICE},
1502     * {@link #ACTION_PROVISION_MANAGED_PROFILE}, {@link #ACTION_PROVISION_MANAGED_USER} and
1503     * {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE} on devices which do no support device
1504     * admins.
1505     *
1506     * @hide
1507     */
1508    public static final int CODE_DEVICE_ADMIN_NOT_SUPPORTED = 13;
1509
1510    /**
1511     * Result code for {@link #checkProvisioningPreCondition}.
1512     *
1513     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_PROFILE} when the device the user is a
1514     * system user on a split system user device.
1515     *
1516     * @hide
1517     */
1518    public static final int CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER = 14;
1519
1520    /**
1521     * Result code for {@link #checkProvisioningPreCondition}.
1522     *
1523     * <p>Returned for {@link #ACTION_PROVISION_MANAGED_PROFILE} when adding a managed profile is
1524     * disallowed by {@link UserManager#DISALLOW_ADD_MANAGED_PROFILE}.
1525     *
1526     * @hide
1527     */
1528    public static final int CODE_ADD_MANAGED_PROFILE_DISALLOWED = 15;
1529
1530    /**
1531     * Result codes for {@link #checkProvisioningPreCondition} indicating all the provisioning pre
1532     * conditions.
1533     *
1534     * @hide
1535     */
1536    @Retention(RetentionPolicy.SOURCE)
1537    @IntDef({CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING,
1538            CODE_USER_SETUP_COMPLETED, CODE_NOT_SYSTEM_USER, CODE_HAS_PAIRED,
1539            CODE_MANAGED_USERS_NOT_SUPPORTED, CODE_SYSTEM_USER, CODE_CANNOT_ADD_MANAGED_PROFILE,
1540            CODE_NOT_SYSTEM_USER_SPLIT, CODE_DEVICE_ADMIN_NOT_SUPPORTED,
1541            CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER, CODE_ADD_MANAGED_PROFILE_DISALLOWED})
1542    public @interface ProvisioningPreCondition {}
1543
1544    /**
1545     * Service action: Action for a service that device owner and profile owner can optionally
1546     * own.  If a device owner or a profile owner has such a service, the system tries to keep
1547     * a bound connection to it, in order to keep their process always running.
1548     * The service must be protected with the {@link android.Manifest.permission#BIND_DEVICE_ADMIN}
1549     * permission.
1550     */
1551    @SdkConstant(SdkConstantType.SERVICE_ACTION)
1552    public static final String ACTION_DEVICE_ADMIN_SERVICE
1553            = "android.app.action.DEVICE_ADMIN_SERVICE";
1554
1555    /**
1556     * Return true if the given administrator component is currently active (enabled) in the system.
1557     *
1558     * @param admin The administrator component to check for.
1559     * @return {@code true} if {@code admin} is currently enabled in the system, {@code false}
1560     *         otherwise
1561     */
1562    public boolean isAdminActive(@NonNull ComponentName admin) {
1563        throwIfParentInstance("isAdminActive");
1564        return isAdminActiveAsUser(admin, myUserId());
1565    }
1566
1567    /**
1568     * @see #isAdminActive(ComponentName)
1569     * @hide
1570     */
1571    public boolean isAdminActiveAsUser(@NonNull ComponentName admin, int userId) {
1572        if (mService != null) {
1573            try {
1574                return mService.isAdminActive(admin, userId);
1575            } catch (RemoteException e) {
1576                throw e.rethrowFromSystemServer();
1577            }
1578        }
1579        return false;
1580    }
1581
1582    /**
1583     * Return true if the given administrator component is currently being removed
1584     * for the user.
1585     * @hide
1586     */
1587    public boolean isRemovingAdmin(@NonNull ComponentName admin, int userId) {
1588        if (mService != null) {
1589            try {
1590                return mService.isRemovingAdmin(admin, userId);
1591            } catch (RemoteException e) {
1592                throw e.rethrowFromSystemServer();
1593            }
1594        }
1595        return false;
1596    }
1597
1598    /**
1599     * Return a list of all currently active device administrators' component
1600     * names.  If there are no administrators {@code null} may be
1601     * returned.
1602     */
1603    public @Nullable List<ComponentName> getActiveAdmins() {
1604        throwIfParentInstance("getActiveAdmins");
1605        return getActiveAdminsAsUser(myUserId());
1606    }
1607
1608    /**
1609     * @see #getActiveAdmins()
1610     * @hide
1611     */
1612    public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId) {
1613        if (mService != null) {
1614            try {
1615                return mService.getActiveAdmins(userId);
1616            } catch (RemoteException e) {
1617                throw e.rethrowFromSystemServer();
1618            }
1619        }
1620        return null;
1621    }
1622
1623    /**
1624     * Used by package administration code to determine if a package can be stopped
1625     * or uninstalled.
1626     * @hide
1627     */
1628    @SystemApi
1629    @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
1630    public boolean packageHasActiveAdmins(String packageName) {
1631        return packageHasActiveAdmins(packageName, myUserId());
1632    }
1633
1634    /**
1635     * Used by package administration code to determine if a package can be stopped
1636     * or uninstalled.
1637     * @hide
1638     */
1639    public boolean packageHasActiveAdmins(String packageName, int userId) {
1640        if (mService != null) {
1641            try {
1642                return mService.packageHasActiveAdmins(packageName, userId);
1643            } catch (RemoteException e) {
1644                throw e.rethrowFromSystemServer();
1645            }
1646        }
1647        return false;
1648    }
1649
1650    /**
1651     * Remove a current administration component.  This can only be called
1652     * by the application that owns the administration component; if you
1653     * try to remove someone else's component, a security exception will be
1654     * thrown.
1655     *
1656     * <p>Note that the operation is not synchronous and the admin might still be active (as
1657     * indicated by {@link #getActiveAdmins()}) by the time this method returns.
1658     *
1659     * @param admin The administration compononent to remove.
1660     * @throws SecurityException if the caller is not in the owner application of {@code admin}.
1661     */
1662    public void removeActiveAdmin(@NonNull ComponentName admin) {
1663        throwIfParentInstance("removeActiveAdmin");
1664        if (mService != null) {
1665            try {
1666                mService.removeActiveAdmin(admin, myUserId());
1667            } catch (RemoteException e) {
1668                throw e.rethrowFromSystemServer();
1669            }
1670        }
1671    }
1672
1673    /**
1674     * Returns true if an administrator has been granted a particular device policy. This can be
1675     * used to check whether the administrator was activated under an earlier set of policies, but
1676     * requires additional policies after an upgrade.
1677     *
1678     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be an
1679     *            active administrator, or an exception will be thrown.
1680     * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}.
1681     * @throws SecurityException if {@code admin} is not an active administrator.
1682     */
1683    public boolean hasGrantedPolicy(@NonNull ComponentName admin, int usesPolicy) {
1684        throwIfParentInstance("hasGrantedPolicy");
1685        if (mService != null) {
1686            try {
1687                return mService.hasGrantedPolicy(admin, usesPolicy, myUserId());
1688            } catch (RemoteException e) {
1689                throw e.rethrowFromSystemServer();
1690            }
1691        }
1692        return false;
1693    }
1694
1695    /**
1696     * Returns true if the Profile Challenge is available to use for the given profile user.
1697     *
1698     * @hide
1699     */
1700    public boolean isSeparateProfileChallengeAllowed(int userHandle) {
1701        if (mService != null) {
1702            try {
1703                return mService.isSeparateProfileChallengeAllowed(userHandle);
1704            } catch (RemoteException e) {
1705                throw e.rethrowFromSystemServer();
1706            }
1707        }
1708        return false;
1709    }
1710
1711    /**
1712     * Constant for {@link #setPasswordQuality}: the policy has no requirements
1713     * for the password.  Note that quality constants are ordered so that higher
1714     * values are more restrictive.
1715     */
1716    public static final int PASSWORD_QUALITY_UNSPECIFIED = 0;
1717
1718    /**
1719     * Constant for {@link #setPasswordQuality}: the policy allows for low-security biometric
1720     * recognition technology.  This implies technologies that can recognize the identity of
1721     * an individual to about a 3 digit PIN (false detection is less than 1 in 1,000).
1722     * Note that quality constants are ordered so that higher values are more restrictive.
1723     */
1724    public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 0x8000;
1725
1726    /**
1727     * Constant for {@link #setPasswordQuality}: the policy requires some kind
1728     * of password or pattern, but doesn't care what it is. Note that quality constants
1729     * are ordered so that higher values are more restrictive.
1730     */
1731    public static final int PASSWORD_QUALITY_SOMETHING = 0x10000;
1732
1733    /**
1734     * Constant for {@link #setPasswordQuality}: the user must have entered a
1735     * password containing at least numeric characters.  Note that quality
1736     * constants are ordered so that higher values are more restrictive.
1737     */
1738    public static final int PASSWORD_QUALITY_NUMERIC = 0x20000;
1739
1740    /**
1741     * Constant for {@link #setPasswordQuality}: the user must have entered a
1742     * password containing at least numeric characters with no repeating (4444)
1743     * or ordered (1234, 4321, 2468) sequences.  Note that quality
1744     * constants are ordered so that higher values are more restrictive.
1745     */
1746    public static final int PASSWORD_QUALITY_NUMERIC_COMPLEX = 0x30000;
1747
1748    /**
1749     * Constant for {@link #setPasswordQuality}: the user must have entered a
1750     * password containing at least alphabetic (or other symbol) characters.
1751     * Note that quality constants are ordered so that higher values are more
1752     * restrictive.
1753     */
1754    public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000;
1755
1756    /**
1757     * Constant for {@link #setPasswordQuality}: the user must have entered a
1758     * password containing at least <em>both></em> numeric <em>and</em>
1759     * alphabetic (or other symbol) characters.  Note that quality constants are
1760     * ordered so that higher values are more restrictive.
1761     */
1762    public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000;
1763
1764    /**
1765     * Constant for {@link #setPasswordQuality}: the user must have entered a
1766     * password containing at least a letter, a numerical digit and a special
1767     * symbol, by default. With this password quality, passwords can be
1768     * restricted to contain various sets of characters, like at least an
1769     * uppercase letter, etc. These are specified using various methods,
1770     * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note
1771     * that quality constants are ordered so that higher values are more
1772     * restrictive.
1773     */
1774    public static final int PASSWORD_QUALITY_COMPLEX = 0x60000;
1775
1776    /**
1777     * Constant for {@link #setPasswordQuality}: the user is not allowed to
1778     * modify password. In case this password quality is set, the password is
1779     * managed by a profile owner. The profile owner can set any password,
1780     * as if {@link #PASSWORD_QUALITY_UNSPECIFIED} is used. Note
1781     * that quality constants are ordered so that higher values are more
1782     * restrictive. The value of {@link #PASSWORD_QUALITY_MANAGED} is
1783     * the highest.
1784     * @hide
1785     */
1786    public static final int PASSWORD_QUALITY_MANAGED = 0x80000;
1787
1788    /**
1789     * @hide
1790     *
1791     * adb shell dpm set-{device,profile}-owner will normally not allow installing an owner to
1792     * a user with accounts.  {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED}
1793     * and {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} are the account features
1794     * used by authenticator to exempt their accounts from this:
1795     *
1796     * <ul>
1797     *     <li>Non-test-only DO/PO still can't be installed when there are accounts.
1798     *     <p>In order to make an apk test-only, add android:testOnly="true" to the
1799     *     &lt;application&gt; tag in the manifest.
1800     *
1801     *     <li>Test-only DO/PO can be installed even when there are accounts, as long as all the
1802     *     accounts have the {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} feature.
1803     *     Some authenticators claim to have any features, so to detect it, we also check
1804     *     {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} and disallow installing
1805     *     if any of the accounts have it.
1806     * </ul>
1807     */
1808    @SystemApi
1809    @TestApi
1810    public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED =
1811            "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
1812
1813    /** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */
1814    @SystemApi
1815    @TestApi
1816    public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED =
1817            "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED";
1818
1819    /**
1820     * Called by an application that is administering the device to set the password restrictions it
1821     * is imposing. After setting this, the user will not be able to enter a new password that is
1822     * not at least as restrictive as what has been set. Note that the current password will remain
1823     * until the user has set a new one, so the change does not take place immediately. To prompt
1824     * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1825     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after calling this method.
1826     * <p>
1827     * Quality constants are ordered so that higher values are more restrictive; thus the highest
1828     * requested quality constant (between the policy set here, the user's preference, and any other
1829     * considerations) is the one that is in effect.
1830     * <p>
1831     * The calling device admin must have requested
1832     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1833     * not, a security exception will be thrown.
1834     * <p>
1835     * This method can be called on the {@link DevicePolicyManager} instance returned by
1836     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1837     * profile.
1838     *
1839     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1840     * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED},
1841     *            {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC},
1842     *            {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC},
1843     *            {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}.
1844     * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin}
1845     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1846     */
1847    public void setPasswordQuality(@NonNull ComponentName admin, int quality) {
1848        if (mService != null) {
1849            try {
1850                mService.setPasswordQuality(admin, quality, mParentInstance);
1851            } catch (RemoteException e) {
1852                throw e.rethrowFromSystemServer();
1853            }
1854        }
1855    }
1856
1857    /**
1858     * Retrieve the current minimum password quality for a particular admin or all admins that set
1859     * restrictions on this user and its participating profiles. Restrictions on profiles that have
1860     * a separate challenge are not taken into account.
1861     *
1862     * <p>This method can be called on the {@link DevicePolicyManager} instance
1863     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1864     * restrictions on the parent profile.
1865     *
1866     * @param admin The name of the admin component to check, or {@code null} to aggregate
1867     * all admins.
1868     */
1869    public int getPasswordQuality(@Nullable ComponentName admin) {
1870        return getPasswordQuality(admin, myUserId());
1871    }
1872
1873    /** @hide per-user version */
1874    public int getPasswordQuality(@Nullable ComponentName admin, int userHandle) {
1875        if (mService != null) {
1876            try {
1877                return mService.getPasswordQuality(admin, userHandle, mParentInstance);
1878            } catch (RemoteException e) {
1879                throw e.rethrowFromSystemServer();
1880            }
1881        }
1882        return PASSWORD_QUALITY_UNSPECIFIED;
1883    }
1884
1885    /**
1886     * Called by an application that is administering the device to set the minimum allowed password
1887     * length. After setting this, the user will not be able to enter a new password that is not at
1888     * least as restrictive as what has been set. Note that the current password will remain until
1889     * the user has set a new one, so the change does not take place immediately. To prompt the user
1890     * for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
1891     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
1892     * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC}
1893     * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC},
1894     * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} with
1895     * {@link #setPasswordQuality}.
1896     * <p>
1897     * The calling device admin must have requested
1898     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1899     * not, a security exception will be thrown.
1900     * <p>
1901     * This method can be called on the {@link DevicePolicyManager} instance returned by
1902     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1903     * profile.
1904     *
1905     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1906     * @param length The new desired minimum password length. A value of 0 means there is no
1907     *            restriction.
1908     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1909     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1910     */
1911    public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) {
1912        if (mService != null) {
1913            try {
1914                mService.setPasswordMinimumLength(admin, length, mParentInstance);
1915            } catch (RemoteException e) {
1916                throw e.rethrowFromSystemServer();
1917            }
1918        }
1919    }
1920
1921    /**
1922     * Retrieve the current minimum password length for a particular admin or all admins that set
1923     * restrictions on this user and its participating profiles. Restrictions on profiles that have
1924     * a separate challenge are not taken into account.
1925     *
1926     * <p>This method can be called on the {@link DevicePolicyManager} instance
1927     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1928     * restrictions on the parent profile.
1929     *
1930     * user and its profiles or a particular one.
1931     * @param admin The name of the admin component to check, or {@code null} to aggregate
1932     * all admins.
1933     */
1934    public int getPasswordMinimumLength(@Nullable ComponentName admin) {
1935        return getPasswordMinimumLength(admin, myUserId());
1936    }
1937
1938    /** @hide per-user version */
1939    public int getPasswordMinimumLength(@Nullable ComponentName admin, int userHandle) {
1940        if (mService != null) {
1941            try {
1942                return mService.getPasswordMinimumLength(admin, userHandle, mParentInstance);
1943            } catch (RemoteException e) {
1944                throw e.rethrowFromSystemServer();
1945            }
1946        }
1947        return 0;
1948    }
1949
1950    /**
1951     * Called by an application that is administering the device to set the minimum number of upper
1952     * case letters required in the password. After setting this, the user will not be able to enter
1953     * a new password that is not at least as restrictive as what has been set. Note that the
1954     * current password will remain until the user has set a new one, so the change does not take
1955     * place immediately. To prompt the user for a new password, use
1956     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
1957     * setting this value. This constraint is only imposed if the administrator has also requested
1958     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
1959     * <p>
1960     * The calling device admin must have requested
1961     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
1962     * not, a security exception will be thrown.
1963     * <p>
1964     * This method can be called on the {@link DevicePolicyManager} instance returned by
1965     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
1966     * profile.
1967     *
1968     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1969     * @param length The new desired minimum number of upper case letters required in the password.
1970     *            A value of 0 means there is no restriction.
1971     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
1972     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
1973     */
1974    public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) {
1975        if (mService != null) {
1976            try {
1977                mService.setPasswordMinimumUpperCase(admin, length, mParentInstance);
1978            } catch (RemoteException e) {
1979                throw e.rethrowFromSystemServer();
1980            }
1981        }
1982    }
1983
1984    /**
1985     * Retrieve the current number of upper case letters required in the password
1986     * for a particular admin or all admins that set restrictions on this user and
1987     * its participating profiles. Restrictions on profiles that have a separate challenge
1988     * are not taken into account.
1989     * This is the same value as set by
1990     * {@link #setPasswordMinimumUpperCase(ComponentName, int)}
1991     * and only applies when the password quality is
1992     * {@link #PASSWORD_QUALITY_COMPLEX}.
1993     *
1994     * <p>This method can be called on the {@link DevicePolicyManager} instance
1995     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
1996     * restrictions on the parent profile.
1997     *
1998     * @param admin The name of the admin component to check, or {@code null} to
1999     *            aggregate all admins.
2000     * @return The minimum number of upper case letters required in the
2001     *         password.
2002     */
2003    public int getPasswordMinimumUpperCase(@Nullable ComponentName admin) {
2004        return getPasswordMinimumUpperCase(admin, myUserId());
2005    }
2006
2007    /** @hide per-user version */
2008    public int getPasswordMinimumUpperCase(@Nullable ComponentName admin, int userHandle) {
2009        if (mService != null) {
2010            try {
2011                return mService.getPasswordMinimumUpperCase(admin, userHandle, mParentInstance);
2012            } catch (RemoteException e) {
2013                throw e.rethrowFromSystemServer();
2014            }
2015        }
2016        return 0;
2017    }
2018
2019    /**
2020     * Called by an application that is administering the device to set the minimum number of lower
2021     * case letters required in the password. After setting this, the user will not be able to enter
2022     * a new password that is not at least as restrictive as what has been set. Note that the
2023     * current password will remain until the user has set a new one, so the change does not take
2024     * place immediately. To prompt the user for a new password, use
2025     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
2026     * setting this value. This constraint is only imposed if the administrator has also requested
2027     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
2028     * <p>
2029     * The calling device admin must have requested
2030     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2031     * not, a security exception will be thrown.
2032     * <p>
2033     * This method can be called on the {@link DevicePolicyManager} instance returned by
2034     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2035     * profile.
2036     *
2037     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2038     * @param length The new desired minimum number of lower case letters required in the password.
2039     *            A value of 0 means there is no restriction.
2040     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2041     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2042     */
2043    public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) {
2044        if (mService != null) {
2045            try {
2046                mService.setPasswordMinimumLowerCase(admin, length, mParentInstance);
2047            } catch (RemoteException e) {
2048                throw e.rethrowFromSystemServer();
2049            }
2050        }
2051    }
2052
2053    /**
2054     * Retrieve the current number of lower case letters required in the password
2055     * for a particular admin or all admins that set restrictions on this user
2056     * and its participating profiles. Restrictions on profiles that have
2057     * a separate challenge are not taken into account.
2058     * This is the same value as set by
2059     * {@link #setPasswordMinimumLowerCase(ComponentName, int)}
2060     * and only applies when the password quality is
2061     * {@link #PASSWORD_QUALITY_COMPLEX}.
2062     *
2063     * <p>This method can be called on the {@link DevicePolicyManager} instance
2064     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2065     * restrictions on the parent profile.
2066     *
2067     * @param admin The name of the admin component to check, or {@code null} to
2068     *            aggregate all admins.
2069     * @return The minimum number of lower case letters required in the
2070     *         password.
2071     */
2072    public int getPasswordMinimumLowerCase(@Nullable ComponentName admin) {
2073        return getPasswordMinimumLowerCase(admin, myUserId());
2074    }
2075
2076    /** @hide per-user version */
2077    public int getPasswordMinimumLowerCase(@Nullable ComponentName admin, int userHandle) {
2078        if (mService != null) {
2079            try {
2080                return mService.getPasswordMinimumLowerCase(admin, userHandle, mParentInstance);
2081            } catch (RemoteException e) {
2082                throw e.rethrowFromSystemServer();
2083            }
2084        }
2085        return 0;
2086    }
2087
2088    /**
2089     * Called by an application that is administering the device to set the minimum number of
2090     * letters required in the password. After setting this, the user will not be able to enter a
2091     * new password that is not at least as restrictive as what has been set. Note that the current
2092     * password will remain until the user has set a new one, so the change does not take place
2093     * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
2094     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
2095     * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with
2096     * {@link #setPasswordQuality}. The default value is 1.
2097     * <p>
2098     * The calling device admin must have requested
2099     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2100     * not, a security exception will be thrown.
2101     * <p>
2102     * This method can be called on the {@link DevicePolicyManager} instance returned by
2103     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2104     * profile.
2105     *
2106     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2107     * @param length The new desired minimum number of letters required in the password. A value of
2108     *            0 means there is no restriction.
2109     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2110     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2111     */
2112    public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) {
2113        if (mService != null) {
2114            try {
2115                mService.setPasswordMinimumLetters(admin, length, mParentInstance);
2116            } catch (RemoteException e) {
2117                throw e.rethrowFromSystemServer();
2118            }
2119        }
2120    }
2121
2122    /**
2123     * Retrieve the current number of letters required in the password
2124     * for a particular admin or all admins that set restrictions on this user
2125     * and its participating profiles. Restrictions on profiles that have
2126     * a separate challenge are not taken into account.
2127     * This is the same value as set by
2128     * {@link #setPasswordMinimumLetters(ComponentName, int)}
2129     * and only applies when the password quality is
2130     * {@link #PASSWORD_QUALITY_COMPLEX}.
2131     *
2132     * <p>This method can be called on the {@link DevicePolicyManager} instance
2133     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2134     * restrictions on the parent profile.
2135     *
2136     * @param admin The name of the admin component to check, or {@code null} to
2137     *            aggregate all admins.
2138     * @return The minimum number of letters required in the password.
2139     */
2140    public int getPasswordMinimumLetters(@Nullable ComponentName admin) {
2141        return getPasswordMinimumLetters(admin, myUserId());
2142    }
2143
2144    /** @hide per-user version */
2145    public int getPasswordMinimumLetters(@Nullable ComponentName admin, int userHandle) {
2146        if (mService != null) {
2147            try {
2148                return mService.getPasswordMinimumLetters(admin, userHandle, mParentInstance);
2149            } catch (RemoteException e) {
2150                throw e.rethrowFromSystemServer();
2151            }
2152        }
2153        return 0;
2154    }
2155
2156    /**
2157     * Called by an application that is administering the device to set the minimum number of
2158     * numerical digits required in the password. After setting this, the user will not be able to
2159     * enter a new password that is not at least as restrictive as what has been set. Note that the
2160     * current password will remain until the user has set a new one, so the change does not take
2161     * place immediately. To prompt the user for a new password, use
2162     * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
2163     * setting this value. This constraint is only imposed if the administrator has also requested
2164     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 1.
2165     * <p>
2166     * The calling device admin must have requested
2167     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2168     * not, a security exception will be thrown.
2169     * <p>
2170     * This method can be called on the {@link DevicePolicyManager} instance returned by
2171     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2172     * profile.
2173     *
2174     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2175     * @param length The new desired minimum number of numerical digits required in the password. A
2176     *            value of 0 means there is no restriction.
2177     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2178     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2179     */
2180    public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) {
2181        if (mService != null) {
2182            try {
2183                mService.setPasswordMinimumNumeric(admin, length, mParentInstance);
2184            } catch (RemoteException e) {
2185                throw e.rethrowFromSystemServer();
2186            }
2187        }
2188    }
2189
2190    /**
2191     * Retrieve the current number of numerical digits required in the password
2192     * for a particular admin or all admins that set restrictions on this user
2193     * and its participating profiles. Restrictions on profiles that have
2194     * a separate challenge are not taken into account.
2195     * This is the same value as set by
2196     * {@link #setPasswordMinimumNumeric(ComponentName, int)}
2197     * and only applies when the password quality is
2198     * {@link #PASSWORD_QUALITY_COMPLEX}.
2199     *
2200     * <p>This method can be called on the {@link DevicePolicyManager} instance
2201     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2202     * restrictions on the parent profile.
2203     *
2204     * @param admin The name of the admin component to check, or {@code null} to
2205     *            aggregate all admins.
2206     * @return The minimum number of numerical digits required in the password.
2207     */
2208    public int getPasswordMinimumNumeric(@Nullable ComponentName admin) {
2209        return getPasswordMinimumNumeric(admin, myUserId());
2210    }
2211
2212    /** @hide per-user version */
2213    public int getPasswordMinimumNumeric(@Nullable ComponentName admin, int userHandle) {
2214        if (mService != null) {
2215            try {
2216                return mService.getPasswordMinimumNumeric(admin, userHandle, mParentInstance);
2217            } catch (RemoteException e) {
2218                throw e.rethrowFromSystemServer();
2219            }
2220        }
2221        return 0;
2222    }
2223
2224    /**
2225     * Called by an application that is administering the device to set the minimum number of
2226     * symbols required in the password. After setting this, the user will not be able to enter a
2227     * new password that is not at least as restrictive as what has been set. Note that the current
2228     * password will remain until the user has set a new one, so the change does not take place
2229     * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
2230     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
2231     * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with
2232     * {@link #setPasswordQuality}. The default value is 1.
2233     * <p>
2234     * The calling device admin must have requested
2235     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2236     * not, a security exception will be thrown.
2237     * <p>
2238     * This method can be called on the {@link DevicePolicyManager} instance returned by
2239     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2240     * profile.
2241     *
2242     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2243     * @param length The new desired minimum number of symbols required in the password. A value of
2244     *            0 means there is no restriction.
2245     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2246     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2247     */
2248    public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) {
2249        if (mService != null) {
2250            try {
2251                mService.setPasswordMinimumSymbols(admin, length, mParentInstance);
2252            } catch (RemoteException e) {
2253                throw e.rethrowFromSystemServer();
2254            }
2255        }
2256    }
2257
2258    /**
2259     * Retrieve the current number of symbols required in the password
2260     * for a particular admin or all admins that set restrictions on this user
2261     * and its participating profiles. Restrictions on profiles that have
2262     * a separate challenge are not taken into account. This is the same value as
2263     * set by {@link #setPasswordMinimumSymbols(ComponentName, int)}
2264     * and only applies when the password quality is
2265     * {@link #PASSWORD_QUALITY_COMPLEX}.
2266     *
2267     * <p>This method can be called on the {@link DevicePolicyManager} instance
2268     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2269     * restrictions on the parent profile.
2270     *
2271     * @param admin The name of the admin component to check, or {@code null} to
2272     *            aggregate all admins.
2273     * @return The minimum number of symbols required in the password.
2274     */
2275    public int getPasswordMinimumSymbols(@Nullable ComponentName admin) {
2276        return getPasswordMinimumSymbols(admin, myUserId());
2277    }
2278
2279    /** @hide per-user version */
2280    public int getPasswordMinimumSymbols(@Nullable ComponentName admin, int userHandle) {
2281        if (mService != null) {
2282            try {
2283                return mService.getPasswordMinimumSymbols(admin, userHandle, mParentInstance);
2284            } catch (RemoteException e) {
2285                throw e.rethrowFromSystemServer();
2286            }
2287        }
2288        return 0;
2289    }
2290
2291    /**
2292     * Called by an application that is administering the device to set the minimum number of
2293     * non-letter characters (numerical digits or symbols) required in the password. After setting
2294     * this, the user will not be able to enter a new password that is not at least as restrictive
2295     * as what has been set. Note that the current password will remain until the user has set a new
2296     * one, so the change does not take place immediately. To prompt the user for a new password,
2297     * use {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after
2298     * setting this value. This constraint is only imposed if the administrator has also requested
2299     * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0.
2300     * <p>
2301     * The calling device admin must have requested
2302     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2303     * not, a security exception will be thrown.
2304     * <p>
2305     * This method can be called on the {@link DevicePolicyManager} instance returned by
2306     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2307     * profile.
2308     *
2309     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2310     * @param length The new desired minimum number of letters required in the password. A value of
2311     *            0 means there is no restriction.
2312     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2313     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2314     */
2315    public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) {
2316        if (mService != null) {
2317            try {
2318                mService.setPasswordMinimumNonLetter(admin, length, mParentInstance);
2319            } catch (RemoteException e) {
2320                throw e.rethrowFromSystemServer();
2321            }
2322        }
2323    }
2324
2325    /**
2326     * Retrieve the current number of non-letter characters required in the password
2327     * for a particular admin or all admins that set restrictions on this user
2328     * and its participating profiles. Restrictions on profiles that have
2329     * a separate challenge are not taken into account.
2330     * This is the same value as set by
2331     * {@link #setPasswordMinimumNonLetter(ComponentName, int)}
2332     * and only applies when the password quality is
2333     * {@link #PASSWORD_QUALITY_COMPLEX}.
2334     *
2335     * <p>This method can be called on the {@link DevicePolicyManager} instance
2336     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2337     * restrictions on the parent profile.
2338     *
2339     * @param admin The name of the admin component to check, or {@code null} to
2340     *            aggregate all admins.
2341     * @return The minimum number of letters required in the password.
2342     */
2343    public int getPasswordMinimumNonLetter(@Nullable ComponentName admin) {
2344        return getPasswordMinimumNonLetter(admin, myUserId());
2345    }
2346
2347    /** @hide per-user version */
2348    public int getPasswordMinimumNonLetter(@Nullable ComponentName admin, int userHandle) {
2349        if (mService != null) {
2350            try {
2351                return mService.getPasswordMinimumNonLetter(admin, userHandle, mParentInstance);
2352            } catch (RemoteException e) {
2353                throw e.rethrowFromSystemServer();
2354            }
2355        }
2356        return 0;
2357    }
2358
2359    /**
2360     * Called by an application that is administering the device to set the length of the password
2361     * history. After setting this, the user will not be able to enter a new password that is the
2362     * same as any password in the history. Note that the current password will remain until the
2363     * user has set a new one, so the change does not take place immediately. To prompt the user for
2364     * a new password, use {@link #ACTION_SET_NEW_PASSWORD} or
2365     * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is
2366     * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC}
2367     * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX} {@link #PASSWORD_QUALITY_ALPHABETIC}, or
2368     * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}.
2369     * <p>
2370     * The calling device admin must have requested
2371     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2372     * not, a security exception will be thrown.
2373     * <p>
2374     * This method can be called on the {@link DevicePolicyManager} instance returned by
2375     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2376     * profile.
2377     *
2378     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2379     * @param length The new desired length of password history. A value of 0 means there is no
2380     *            restriction.
2381     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2382     *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2383     */
2384    public void setPasswordHistoryLength(@NonNull ComponentName admin, int length) {
2385        if (mService != null) {
2386            try {
2387                mService.setPasswordHistoryLength(admin, length, mParentInstance);
2388            } catch (RemoteException e) {
2389                throw e.rethrowFromSystemServer();
2390            }
2391        }
2392    }
2393
2394    /**
2395     * Called by a device admin to set the password expiration timeout. Calling this method will
2396     * restart the countdown for password expiration for the given admin, as will changing the
2397     * device password (for all admins).
2398     * <p>
2399     * The provided timeout is the time delta in ms and will be added to the current time. For
2400     * example, to have the password expire 5 days from now, timeout would be 5 * 86400 * 1000 =
2401     * 432000000 ms for timeout.
2402     * <p>
2403     * To disable password expiration, a value of 0 may be used for timeout.
2404     * <p>
2405     * The calling device admin must have requested
2406     * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this method; if it has
2407     * not, a security exception will be thrown.
2408     * <p>
2409     * Note that setting the password will automatically reset the expiration time for all active
2410     * admins. Active admins do not need to explicitly call this method in that case.
2411     * <p>
2412     * This method can be called on the {@link DevicePolicyManager} instance returned by
2413     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2414     * profile.
2415     *
2416     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2417     * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 means
2418     *            there is no restriction (unlimited).
2419     * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
2420     *             does not use {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD}
2421     */
2422    public void setPasswordExpirationTimeout(@NonNull ComponentName admin, long timeout) {
2423        if (mService != null) {
2424            try {
2425                mService.setPasswordExpirationTimeout(admin, timeout, mParentInstance);
2426            } catch (RemoteException e) {
2427                throw e.rethrowFromSystemServer();
2428            }
2429        }
2430    }
2431
2432    /**
2433     * Get the password expiration timeout for the given admin. The expiration timeout is the
2434     * recurring expiration timeout provided in the call to
2435     * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the
2436     * aggregate of all participating policy administrators if {@code admin} is null. Admins that
2437     * have set restrictions on profiles that have a separate challenge are not taken into account.
2438     *
2439     * <p>This method can be called on the {@link DevicePolicyManager} instance
2440     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2441     * restrictions on the parent profile.
2442     *
2443     * @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
2444     * @return The timeout for the given admin or the minimum of all timeouts
2445     */
2446    public long getPasswordExpirationTimeout(@Nullable ComponentName admin) {
2447        if (mService != null) {
2448            try {
2449                return mService.getPasswordExpirationTimeout(admin, myUserId(), mParentInstance);
2450            } catch (RemoteException e) {
2451                throw e.rethrowFromSystemServer();
2452            }
2453        }
2454        return 0;
2455    }
2456
2457    /**
2458     * Get the current password expiration time for a particular admin or all admins that set
2459     * restrictions on this user and its participating profiles. Restrictions on profiles that have
2460     * a separate challenge are not taken into account. If admin is {@code null}, then a composite
2461     * of all expiration times is returned - which will be the minimum of all of them.
2462     *
2463     * <p>This method can be called on the {@link DevicePolicyManager} instance
2464     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2465     * the password expiration for the parent profile.
2466     *
2467     * @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
2468     * @return The password expiration time, in milliseconds since epoch.
2469     */
2470    public long getPasswordExpiration(@Nullable ComponentName admin) {
2471        if (mService != null) {
2472            try {
2473                return mService.getPasswordExpiration(admin, myUserId(), mParentInstance);
2474            } catch (RemoteException e) {
2475                throw e.rethrowFromSystemServer();
2476            }
2477        }
2478        return 0;
2479    }
2480
2481    /**
2482     * Retrieve the current password history length for a particular admin or all admins that
2483     * set restrictions on this user and its participating profiles. Restrictions on profiles that
2484     * have a separate challenge are not taken into account.
2485     *
2486     * <p>This method can be called on the {@link DevicePolicyManager} instance
2487     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2488     * restrictions on the parent profile.
2489     *
2490     * @param admin The name of the admin component to check, or {@code null} to aggregate
2491     * all admins.
2492     * @return The length of the password history
2493     */
2494    public int getPasswordHistoryLength(@Nullable ComponentName admin) {
2495        return getPasswordHistoryLength(admin, myUserId());
2496    }
2497
2498    /** @hide per-user version */
2499    public int getPasswordHistoryLength(@Nullable ComponentName admin, int userHandle) {
2500        if (mService != null) {
2501            try {
2502                return mService.getPasswordHistoryLength(admin, userHandle, mParentInstance);
2503            } catch (RemoteException e) {
2504                throw e.rethrowFromSystemServer();
2505            }
2506        }
2507        return 0;
2508    }
2509
2510    /**
2511     * Return the maximum password length that the device supports for a
2512     * particular password quality.
2513     * @param quality The quality being interrogated.
2514     * @return Returns the maximum length that the user can enter.
2515     */
2516    public int getPasswordMaximumLength(int quality) {
2517        // Kind-of arbitrary.
2518        return 16;
2519    }
2520
2521    /**
2522     * Determine whether the current password the user has set is sufficient to meet the policy
2523     * requirements (e.g. quality, minimum length) that have been requested by the admins of this
2524     * user and its participating profiles. Restrictions on profiles that have a separate challenge
2525     * are not taken into account. The user must be unlocked in order to perform the check.
2526     * <p>
2527     * The calling device admin must have requested
2528     * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
2529     * not, a security exception will be thrown.
2530     * <p>
2531     * This method can be called on the {@link DevicePolicyManager} instance returned by
2532     * {@link #getParentProfileInstance(ComponentName)} in order to determine if the password set on
2533     * the parent profile is sufficient.
2534     *
2535     * @return Returns true if the password meets the current requirements, else false.
2536     * @throws SecurityException if the calling application does not own an active administrator
2537     *             that uses {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
2538     * @throws IllegalStateException if the user is not unlocked.
2539     */
2540    public boolean isActivePasswordSufficient() {
2541        if (mService != null) {
2542            try {
2543                return mService.isActivePasswordSufficient(myUserId(), mParentInstance);
2544            } catch (RemoteException e) {
2545                throw e.rethrowFromSystemServer();
2546            }
2547        }
2548        return false;
2549    }
2550
2551    /**
2552     * Determine whether the current profile password the user has set is sufficient
2553     * to meet the policy requirements (e.g. quality, minimum length) that have been
2554     * requested by the admins of the parent user and its profiles.
2555     *
2556     * @param userHandle the userId of the profile to check the password for.
2557     * @return Returns true if the password would meet the current requirements, else false.
2558     * @throws SecurityException if {@code userHandle} is not a managed profile.
2559     * @hide
2560     */
2561    public boolean isProfileActivePasswordSufficientForParent(int userHandle) {
2562        if (mService != null) {
2563            try {
2564                return mService.isProfileActivePasswordSufficientForParent(userHandle);
2565            } catch (RemoteException e) {
2566                throw e.rethrowFromSystemServer();
2567            }
2568        }
2569        return false;
2570    }
2571
2572    /**
2573     * Retrieve the number of times the user has failed at entering a password since that last
2574     * successful password entry.
2575     * <p>
2576     * This method can be called on the {@link DevicePolicyManager} instance returned by
2577     * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the number of failed
2578     * password attemts for the parent user.
2579     * <p>
2580     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN}
2581     * to be able to call this method; if it has not, a security exception will be thrown.
2582     *
2583     * @return The number of times user has entered an incorrect password since the last correct
2584     *         password entry.
2585     * @throws SecurityException if the calling application does not own an active administrator
2586     *             that uses {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN}
2587     */
2588    public int getCurrentFailedPasswordAttempts() {
2589        return getCurrentFailedPasswordAttempts(myUserId());
2590    }
2591
2592    /**
2593     * Retrieve the number of times the given user has failed at entering a
2594     * password since that last successful password entry.
2595     *
2596     * <p>The calling device admin must have requested
2597     * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call this method; if it has
2598     * not and it is not the system uid, a security exception will be thrown.
2599     *
2600     * @hide
2601     */
2602    public int getCurrentFailedPasswordAttempts(int userHandle) {
2603        if (mService != null) {
2604            try {
2605                return mService.getCurrentFailedPasswordAttempts(userHandle, mParentInstance);
2606            } catch (RemoteException e) {
2607                throw e.rethrowFromSystemServer();
2608            }
2609        }
2610        return -1;
2611    }
2612
2613    /**
2614     * Queries whether {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT} flag is set.
2615     *
2616     * @return true if RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set.
2617     * @hide
2618     */
2619    public boolean getDoNotAskCredentialsOnBoot() {
2620        if (mService != null) {
2621            try {
2622                return mService.getDoNotAskCredentialsOnBoot();
2623            } catch (RemoteException e) {
2624                throw e.rethrowFromSystemServer();
2625            }
2626        }
2627        return false;
2628    }
2629
2630    /**
2631     * Setting this to a value greater than zero enables a built-in policy that will perform a
2632     * device or profile wipe after too many incorrect device-unlock passwords have been entered.
2633     * This built-in policy combines watching for failed passwords and wiping the device, and
2634     * requires that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and
2635     * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}.
2636     * <p>
2637     * To implement any other policy (e.g. wiping data for a particular application only, erasing or
2638     * revoking credentials, or reporting the failure to a server), you should implement
2639     * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} instead. Do not
2640     * use this API, because if the maximum count is reached, the device or profile will be wiped
2641     * immediately, and your callback will not be invoked.
2642     * <p>
2643     * This method can be called on the {@link DevicePolicyManager} instance returned by
2644     * {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent
2645     * profile.
2646     *
2647     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2648     * @param num The number of failed password attempts at which point the device or profile will
2649     *            be wiped.
2650     * @throws SecurityException if {@code admin} is not an active administrator or does not use
2651     *             both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and
2652     *             {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}.
2653     */
2654    public void setMaximumFailedPasswordsForWipe(@NonNull ComponentName admin, int num) {
2655        if (mService != null) {
2656            try {
2657                mService.setMaximumFailedPasswordsForWipe(admin, num, mParentInstance);
2658            } catch (RemoteException e) {
2659                throw e.rethrowFromSystemServer();
2660            }
2661        }
2662    }
2663
2664    /**
2665     * Retrieve the current maximum number of login attempts that are allowed before the device
2666     * or profile is wiped, for a particular admin or all admins that set restrictions on this user
2667     * and its participating profiles. Restrictions on profiles that have a separate challenge are
2668     * not taken into account.
2669     *
2670     * <p>This method can be called on the {@link DevicePolicyManager} instance
2671     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2672     * the value for the parent profile.
2673     *
2674     * @param admin The name of the admin component to check, or {@code null} to aggregate
2675     * all admins.
2676     */
2677    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin) {
2678        return getMaximumFailedPasswordsForWipe(admin, myUserId());
2679    }
2680
2681    /** @hide per-user version */
2682    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
2683        if (mService != null) {
2684            try {
2685                return mService.getMaximumFailedPasswordsForWipe(
2686                        admin, userHandle, mParentInstance);
2687            } catch (RemoteException e) {
2688                throw e.rethrowFromSystemServer();
2689            }
2690        }
2691        return 0;
2692    }
2693
2694    /**
2695     * Returns the profile with the smallest maximum failed passwords for wipe,
2696     * for the given user. So for primary user, it might return the primary or
2697     * a managed profile. For a secondary user, it would be the same as the
2698     * user passed in.
2699     * @hide Used only by Keyguard
2700     */
2701    public int getProfileWithMinimumFailedPasswordsForWipe(int userHandle) {
2702        if (mService != null) {
2703            try {
2704                return mService.getProfileWithMinimumFailedPasswordsForWipe(
2705                        userHandle, mParentInstance);
2706            } catch (RemoteException e) {
2707                throw e.rethrowFromSystemServer();
2708            }
2709        }
2710        return UserHandle.USER_NULL;
2711    }
2712
2713    /**
2714     * Flag for {@link #resetPasswordWithToken} and {@link #resetPassword}: don't allow other admins
2715     * to change the password again until the user has entered it.
2716     */
2717    public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001;
2718
2719    /**
2720     * Flag for {@link #resetPasswordWithToken} and {@link #resetPassword}: don't ask for user
2721     * credentials on device boot.
2722     * If the flag is set, the device can be booted without asking for user password.
2723     * The absence of this flag does not change the current boot requirements. This flag
2724     * can be set by the device owner only. If the app is not the device owner, the flag
2725     * is ignored. Once the flag is set, it cannot be reverted back without resetting the
2726     * device to factory defaults.
2727     */
2728    public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002;
2729
2730    /**
2731     * Force a new password for device unlock (the password needed to access the entire device) or
2732     * the work profile challenge on the current user. This takes effect immediately.
2733     * <p>
2734     * <em>For device owner and profile owners targeting SDK level
2735     * {@link android.os.Build.VERSION_CODES#O} or above, this API is no longer available and will
2736     * throw {@link SecurityException}. Please use the new API {@link #resetPasswordWithToken}
2737     * instead. </em>
2738     * <p>
2739     * <em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for
2740     * device admins that are not device owner and not profile owner.
2741     * The password can now only be changed if there is currently no password set.  Device owner
2742     * and profile owner can still do this when user is unlocked and does not have a managed
2743     * profile.</em>
2744     * <p>
2745     * The given password must be sufficient for the current password quality and length constraints
2746     * as returned by {@link #getPasswordQuality(ComponentName)} and
2747     * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then
2748     * it will be rejected and false returned. Note that the password may be a stronger quality
2749     * (containing alphanumeric characters when the requested quality is only numeric), in which
2750     * case the currently active quality will be increased to match.
2751     * <p>
2752     * Calling with a null or empty password will clear any existing PIN, pattern or password if the
2753     * current password constraints allow it. <em>Note: This will not work in
2754     * {@link android.os.Build.VERSION_CODES#N} and later for managed profiles, or for device admins
2755     * that are not device owner or profile owner.  Once set, the password cannot be changed to null
2756     * or empty except by these admins.</em>
2757     * <p>
2758     * The calling device admin must have requested
2759     * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call this method; if it has
2760     * not, a security exception will be thrown.
2761     *
2762     * @param password The new password for the user. Null or empty clears the password.
2763     * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and
2764     *            {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}.
2765     * @return Returns true if the password was applied, or false if it is not acceptable for the
2766     *         current constraints or if the user has not been decrypted yet.
2767     * @throws SecurityException if the calling application does not own an active administrator
2768     *             that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD}
2769     * @throws IllegalStateException if the calling user is locked or has a managed profile.
2770     */
2771    public boolean resetPassword(String password, int flags) {
2772        throwIfParentInstance("resetPassword");
2773        if (mService != null) {
2774            try {
2775                return mService.resetPassword(password, flags);
2776            } catch (RemoteException e) {
2777                throw e.rethrowFromSystemServer();
2778            }
2779        }
2780        return false;
2781    }
2782
2783    /**
2784     * Called by a profile or device owner to provision a token which can later be used to reset the
2785     * device lockscreen password (if called by device owner), or managed profile challenge (if
2786     * called by profile owner), via {@link #resetPasswordWithToken}.
2787     * <p>
2788     * If the user currently has a lockscreen password, the provisioned token will not be
2789     * immediately usable; it only becomes active after the user performs a confirm credential
2790     * operation, which can be triggered by {@link KeyguardManager#createConfirmDeviceCredentialIntent}.
2791     * If the user has no lockscreen password, the token is activated immediately. In all cases,
2792     * the active state of the current token can be checked by {@link #isResetPasswordTokenActive}.
2793     * For security reasons, un-activated tokens are only stored in memory and will be lost once
2794     * the device reboots. In this case a new token needs to be provisioned again.
2795     * <p>
2796     * Once provisioned and activated, the token will remain effective even if the user changes
2797     * or clears the lockscreen password.
2798     * <p>
2799     * <em>This token is highly sensitive and should be treated at the same level as user
2800     * credentials. In particular, NEVER store this token on device in plaintext. Do not store
2801     * the plaintext token in device-encrypted storage if it will be needed to reset password on
2802     * file-based encryption devices before user unlocks. Consider carefully how any password token
2803     * will be stored on your server and who will need access to them. Tokens may be the subject of
2804     * legal access requests.
2805     * </em>
2806     *
2807     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2808     * @param token a secure token a least 32-byte long, which must be generated by a
2809     *        cryptographically strong random number generator.
2810     * @return true if the operation is successful, false otherwise.
2811     * @throws SecurityException if admin is not a device or profile owner.
2812     * @throws IllegalArgumentException if the supplied token is invalid.
2813     */
2814    public boolean setResetPasswordToken(ComponentName admin, byte[] token) {
2815        throwIfParentInstance("setResetPasswordToken");
2816        if (mService != null) {
2817            try {
2818                return mService.setResetPasswordToken(admin, token);
2819            } catch (RemoteException e) {
2820                throw e.rethrowFromSystemServer();
2821            }
2822        }
2823        return false;
2824    }
2825
2826    /**
2827     * Called by a profile or device owner to revoke the current password reset token.
2828     *
2829     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2830     * @return true if the operation is successful, false otherwise.
2831     * @throws SecurityException if admin is not a device or profile owner.
2832     */
2833    public boolean clearResetPasswordToken(ComponentName admin) {
2834        throwIfParentInstance("clearResetPasswordToken");
2835        if (mService != null) {
2836            try {
2837                return mService.clearResetPasswordToken(admin);
2838            } catch (RemoteException e) {
2839                throw e.rethrowFromSystemServer();
2840            }
2841        }
2842        return false;
2843    }
2844
2845    /**
2846     * Called by a profile or device owner to check if the current reset password token is active.
2847     *
2848     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2849     * @return true if the token is active, false otherwise.
2850     * @throws SecurityException if admin is not a device or profile owner.
2851     * @throws IllegalStateException if no token has been set.
2852     */
2853    public boolean isResetPasswordTokenActive(ComponentName admin) {
2854        throwIfParentInstance("isResetPasswordTokenActive");
2855        if (mService != null) {
2856            try {
2857                return mService.isResetPasswordTokenActive(admin);
2858            } catch (RemoteException e) {
2859                throw e.rethrowFromSystemServer();
2860            }
2861        }
2862        return false;
2863    }
2864
2865    /**
2866     * Called by device or profile owner to force set a new device unlock password or a managed
2867     * profile challenge on current user. This takes effect immediately.
2868     * <p>
2869     * Unlike {@link #resetPassword}, this API can change the password even before the user or
2870     * device is unlocked or decrypted. The supplied token must have been previously provisioned via
2871     * {@link #setResetPasswordToken}, and in active state {@link #isResetPasswordTokenActive}.
2872     * <p>
2873     * The given password must be sufficient for the current password quality and length constraints
2874     * as returned by {@link #getPasswordQuality(ComponentName)} and
2875     * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then
2876     * it will be rejected and false returned. Note that the password may be a stronger quality, for
2877     * example, a password containing alphanumeric characters when the requested quality is only
2878     * numeric.
2879     * <p>
2880     * Calling with a {@code null} or empty password will clear any existing PIN, pattern or
2881     * password if the current password constraints allow it.
2882     *
2883     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2884     * @param password The new password for the user. {@code null} or empty clears the password.
2885     * @param token the password reset token previously provisioned by
2886     *        {@link #setResetPasswordToken}.
2887     * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and
2888     *        {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}.
2889     * @return Returns true if the password was applied, or false if it is not acceptable for the
2890     *         current constraints.
2891     * @throws SecurityException if admin is not a device or profile owner.
2892     * @throws IllegalStateException if the provided token is not valid.
2893     */
2894    public boolean resetPasswordWithToken(@NonNull ComponentName admin, String password,
2895            byte[] token, int flags) {
2896        throwIfParentInstance("resetPassword");
2897        if (mService != null) {
2898            try {
2899                return mService.resetPasswordWithToken(admin, password, token, flags);
2900            } catch (RemoteException e) {
2901                throw e.rethrowFromSystemServer();
2902            }
2903        }
2904        return false;
2905    }
2906
2907    /**
2908     * Called by an application that is administering the device to set the maximum time for user
2909     * activity until the device will lock. This limits the length that the user can set. It takes
2910     * effect immediately.
2911     * <p>
2912     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2913     * to be able to call this method; if it has not, a security exception will be thrown.
2914     * <p>
2915     * This method can be called on the {@link DevicePolicyManager} instance returned by
2916     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
2917     * profile.
2918     *
2919     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2920     * @param timeMs The new desired maximum time to lock in milliseconds. A value of 0 means there
2921     *            is no restriction.
2922     * @throws SecurityException if {@code admin} is not an active administrator or it does not use
2923     *             {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
2924     */
2925    public void setMaximumTimeToLock(@NonNull ComponentName admin, long timeMs) {
2926        if (mService != null) {
2927            try {
2928                mService.setMaximumTimeToLock(admin, timeMs, mParentInstance);
2929            } catch (RemoteException e) {
2930                throw e.rethrowFromSystemServer();
2931            }
2932        }
2933    }
2934
2935    /**
2936     * Retrieve the current maximum time to unlock for a particular admin or all admins that set
2937     * restrictions on this user and its participating profiles. Restrictions on profiles that have
2938     * a separate challenge are not taken into account.
2939     *
2940     * <p>This method can be called on the {@link DevicePolicyManager} instance
2941     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
2942     * restrictions on the parent profile.
2943     *
2944     * @param admin The name of the admin component to check, or {@code null} to aggregate
2945     * all admins.
2946     * @return time in milliseconds for the given admin or the minimum value (strictest) of
2947     * all admins if admin is null. Returns 0 if there are no restrictions.
2948     */
2949    public long getMaximumTimeToLock(@Nullable ComponentName admin) {
2950        return getMaximumTimeToLock(admin, myUserId());
2951    }
2952
2953    /** @hide per-user version */
2954    public long getMaximumTimeToLock(@Nullable ComponentName admin, int userHandle) {
2955        if (mService != null) {
2956            try {
2957                return mService.getMaximumTimeToLock(admin, userHandle, mParentInstance);
2958            } catch (RemoteException e) {
2959                throw e.rethrowFromSystemServer();
2960            }
2961        }
2962        return 0;
2963    }
2964
2965    /**
2966     * Returns maximum time to lock that applied by all profiles in this user. We do this because we
2967     * do not have a separate timeout to lock for work challenge only.
2968     *
2969     * @hide
2970     */
2971    public long getMaximumTimeToLockForUserAndProfiles(int userHandle) {
2972        if (mService != null) {
2973            try {
2974                return mService.getMaximumTimeToLockForUserAndProfiles(userHandle);
2975            } catch (RemoteException e) {
2976                throw e.rethrowFromSystemServer();
2977            }
2978        }
2979        return 0;
2980    }
2981
2982    /**
2983     * Called by a device/profile owner to set the timeout after which unlocking with secondary, non
2984     * strong auth (e.g. fingerprint, trust agents) times out, i.e. the user has to use a strong
2985     * authentication method like password, pin or pattern.
2986     *
2987     * <p>This timeout is used internally to reset the timer to require strong auth again after
2988     * specified timeout each time it has been successfully used.
2989     *
2990     * <p>Fingerprint can also be disabled altogether using {@link #KEYGUARD_DISABLE_FINGERPRINT}.
2991     *
2992     * <p>Trust agents can also be disabled altogether using {@link #KEYGUARD_DISABLE_TRUST_AGENTS}.
2993     *
2994     * <p>The calling device admin must be a device or profile owner. If it is not,
2995     * a {@link SecurityException} will be thrown.
2996     *
2997     * <p>The calling device admin can verify the value it has set by calling
2998     * {@link #getRequiredStrongAuthTimeout(ComponentName)} and passing in its instance.
2999     *
3000     * <p>This method can be called on the {@link DevicePolicyManager} instance returned by
3001     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
3002     * profile.
3003     *
3004     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3005     * @param timeoutMs The new timeout in milliseconds, after which the user will have to unlock
3006     *         with strong authentication method. A value of 0 means the admin is not participating
3007     *         in controlling the timeout.
3008     *         The minimum and maximum timeouts are platform-defined and are typically 1 hour and
3009     *         72 hours, respectively. Though discouraged, the admin may choose to require strong
3010     *         auth at all times using {@link #KEYGUARD_DISABLE_FINGERPRINT} and/or
3011     *         {@link #KEYGUARD_DISABLE_TRUST_AGENTS}.
3012     *
3013     * @throws SecurityException if {@code admin} is not a device or profile owner.
3014     */
3015    public void setRequiredStrongAuthTimeout(@NonNull ComponentName admin,
3016            long timeoutMs) {
3017        if (mService != null) {
3018            try {
3019                mService.setRequiredStrongAuthTimeout(admin, timeoutMs, mParentInstance);
3020            } catch (RemoteException e) {
3021                throw e.rethrowFromSystemServer();
3022            }
3023        }
3024    }
3025
3026    /**
3027     * Determine for how long the user will be able to use secondary, non strong auth for
3028     * authentication, since last strong method authentication (password, pin or pattern) was used.
3029     * After the returned timeout the user is required to use strong authentication method.
3030     *
3031     * <p>This method can be called on the {@link DevicePolicyManager} instance
3032     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
3033     * restrictions on the parent profile.
3034     *
3035     * @param admin The name of the admin component to check, or {@code null} to aggregate
3036     *         accross all participating admins.
3037     * @return The timeout in milliseconds or 0 if not configured for the provided admin.
3038     */
3039    public long getRequiredStrongAuthTimeout(@Nullable ComponentName admin) {
3040        return getRequiredStrongAuthTimeout(admin, myUserId());
3041    }
3042
3043    /** @hide per-user version */
3044    public long getRequiredStrongAuthTimeout(@Nullable ComponentName admin, @UserIdInt int userId) {
3045        if (mService != null) {
3046            try {
3047                return mService.getRequiredStrongAuthTimeout(admin, userId, mParentInstance);
3048            } catch (RemoteException e) {
3049                throw e.rethrowFromSystemServer();
3050            }
3051        }
3052        return DEFAULT_STRONG_AUTH_TIMEOUT_MS;
3053    }
3054
3055    /**
3056     * Flag for {@link #lockNow(int)}: also evict the user's credential encryption key from the
3057     * keyring. The user's credential will need to be entered again in order to derive the
3058     * credential encryption key that will be stored back in the keyring for future use.
3059     * <p>
3060     * This flag can only be used by a profile owner when locking a managed profile when
3061     * {@link #getStorageEncryptionStatus} returns {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
3062     * <p>
3063     * In order to secure user data, the user will be stopped and restarted so apps should wait
3064     * until they are next run to perform further actions.
3065     */
3066    public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1;
3067
3068    /** @hide */
3069    @Retention(RetentionPolicy.SOURCE)
3070    @IntDef(flag=true, value={FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY})
3071    public @interface LockNowFlag {}
3072
3073    /**
3074     * Make the device lock immediately, as if the lock screen timeout has expired at the point of
3075     * this call.
3076     * <p>
3077     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
3078     * to be able to call this method; if it has not, a security exception will be thrown.
3079     * <p>
3080     * This method can be called on the {@link DevicePolicyManager} instance returned by
3081     * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
3082     * <p>
3083     * Equivalent to calling {@link #lockNow(int)} with no flags.
3084     *
3085     * @throws SecurityException if the calling application does not own an active administrator
3086     *             that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
3087     */
3088    public void lockNow() {
3089        lockNow(0);
3090    }
3091
3092    /**
3093     * Make the device lock immediately, as if the lock screen timeout has expired at the point of
3094     * this call.
3095     * <p>
3096     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK}
3097     * to be able to call this method; if it has not, a security exception will be thrown.
3098     * <p>
3099     * This method can be called on the {@link DevicePolicyManager} instance returned by
3100     * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
3101     *
3102     * @param flags May be 0 or {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}.
3103     * @throws SecurityException if the calling application does not own an active administrator
3104     *             that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} or the
3105     *             {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is passed by an application
3106     *             that is not a profile
3107     *             owner of a managed profile.
3108     * @throws IllegalArgumentException if the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is
3109     *             passed when locking the parent profile.
3110     * @throws UnsupportedOperationException if the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}
3111     *             flag is passed when {@link #getStorageEncryptionStatus} does not return
3112     *             {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
3113     */
3114    public void lockNow(@LockNowFlag int flags) {
3115        if (mService != null) {
3116            try {
3117                mService.lockNow(flags, mParentInstance);
3118            } catch (RemoteException e) {
3119                throw e.rethrowFromSystemServer();
3120            }
3121        }
3122    }
3123
3124    /**
3125     * Flag for {@link #wipeData(int)}: also erase the device's external
3126     * storage (such as SD cards).
3127     */
3128    public static final int WIPE_EXTERNAL_STORAGE = 0x0001;
3129
3130    /**
3131     * Flag for {@link #wipeData(int)}: also erase the factory reset protection
3132     * data.
3133     *
3134     * <p>This flag may only be set by device owner admins; if it is set by
3135     * other admins a {@link SecurityException} will be thrown.
3136     */
3137    public static final int WIPE_RESET_PROTECTION_DATA = 0x0002;
3138
3139    /**
3140     * Flag for {@link #wipeData(int)}: also erase the device's eUICC data.
3141     *
3142     * TODO(b/35851809): make this public.
3143     * @hide
3144     */
3145    public static final int WIPE_EUICC = 0x0004;
3146
3147
3148    /**
3149     * Ask that all user data be wiped. If called as a secondary user, the user will be removed and
3150     * other users will remain unaffected. Calling from the primary user will cause the device to
3151     * reboot, erasing all device data - including all the secondary users and their data - while
3152     * booting up.
3153     * <p>
3154     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to
3155     * be able to call this method; if it has not, a security exception will be thrown.
3156     *
3157     * @param flags Bit mask of additional options: currently supported flags are
3158     *            {@link #WIPE_EXTERNAL_STORAGE} and {@link #WIPE_RESET_PROTECTION_DATA}.
3159     * @throws SecurityException if the calling application does not own an active administrator
3160     *             that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
3161     */
3162    public void wipeData(int flags) {
3163        final String wipeReasonForUser = mContext.getString(
3164                R.string.work_profile_deleted_description_dpm_wipe);
3165        wipeDataInternal(flags, wipeReasonForUser);
3166    }
3167
3168    /**
3169     * Ask that all user data be wiped. If called as a secondary user, the user will be removed and
3170     * other users will remain unaffected, the provided reason for wiping data can be shown to
3171     * user. Calling from the primary user will cause the device to reboot, erasing all device data
3172     * - including all the secondary users and their data - while booting up. In this case, we don't
3173     * show the reason to the user since the device would be factory reset.
3174     * <p>
3175     * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to
3176     * be able to call this method; if it has not, a security exception will be thrown.
3177     *
3178     * @param flags Bit mask of additional options: currently supported flags are
3179     *            {@link #WIPE_EXTERNAL_STORAGE} and {@link #WIPE_RESET_PROTECTION_DATA}.
3180     * @param reason a string that contains the reason for wiping data, which can be
3181     *                          presented to the user.
3182     * @throws SecurityException if the calling application does not own an active administrator
3183     *             that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
3184     * @throws IllegalArgumentException if the input reason string is null or empty.
3185     */
3186    public void wipeDataWithReason(int flags, @NonNull CharSequence reason) {
3187        Preconditions.checkNotNull(reason, "CharSequence is null");
3188        wipeDataInternal(flags, reason.toString());
3189    }
3190
3191    /**
3192     * Internal function for both {@link #wipeData(int)} and
3193     * {@link #wipeDataWithReason(int, CharSequence)} to call.
3194     *
3195     * @see #wipeData(int)
3196     * @see #wipeDataWithReason(int, CharSequence)
3197     * @hide
3198     */
3199    private void wipeDataInternal(int flags, @NonNull String wipeReasonForUser) {
3200        throwIfParentInstance("wipeDataWithReason");
3201        if (mService != null) {
3202            try {
3203                mService.wipeDataWithReason(flags, wipeReasonForUser);
3204            } catch (RemoteException e) {
3205                throw e.rethrowFromSystemServer();
3206            }
3207        }
3208    }
3209
3210    /**
3211     * Called by an application that is administering the device to set the
3212     * global proxy and exclusion list.
3213     * <p>
3214     * The calling device admin must have requested
3215     * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call
3216     * this method; if it has not, a security exception will be thrown.
3217     * Only the first device admin can set the proxy. If a second admin attempts
3218     * to set the proxy, the {@link ComponentName} of the admin originally setting the
3219     * proxy will be returned. If successful in setting the proxy, {@code null} will
3220     * be returned.
3221     * The method can be called repeatedly by the device admin alrady setting the
3222     * proxy to update the proxy and exclusion list.
3223     *
3224     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3225     * @param proxySpec the global proxy desired. Must be an HTTP Proxy.
3226     *            Pass Proxy.NO_PROXY to reset the proxy.
3227     * @param exclusionList a list of domains to be excluded from the global proxy.
3228     * @return {@code null} if the proxy was successfully set, or otherwise a {@link ComponentName}
3229     *            of the device admin that sets the proxy.
3230     * @hide
3231     */
3232    public @Nullable ComponentName setGlobalProxy(@NonNull ComponentName admin, Proxy proxySpec,
3233            List<String> exclusionList ) {
3234        throwIfParentInstance("setGlobalProxy");
3235        if (proxySpec == null) {
3236            throw new NullPointerException();
3237        }
3238        if (mService != null) {
3239            try {
3240                String hostSpec;
3241                String exclSpec;
3242                if (proxySpec.equals(Proxy.NO_PROXY)) {
3243                    hostSpec = null;
3244                    exclSpec = null;
3245                } else {
3246                    if (!proxySpec.type().equals(Proxy.Type.HTTP)) {
3247                        throw new IllegalArgumentException();
3248                    }
3249                    InetSocketAddress sa = (InetSocketAddress)proxySpec.address();
3250                    String hostName = sa.getHostName();
3251                    int port = sa.getPort();
3252                    StringBuilder hostBuilder = new StringBuilder();
3253                    hostSpec = hostBuilder.append(hostName)
3254                        .append(":").append(Integer.toString(port)).toString();
3255                    if (exclusionList == null) {
3256                        exclSpec = "";
3257                    } else {
3258                        StringBuilder listBuilder = new StringBuilder();
3259                        boolean firstDomain = true;
3260                        for (String exclDomain : exclusionList) {
3261                            if (!firstDomain) {
3262                                listBuilder = listBuilder.append(",");
3263                            } else {
3264                                firstDomain = false;
3265                            }
3266                            listBuilder = listBuilder.append(exclDomain.trim());
3267                        }
3268                        exclSpec = listBuilder.toString();
3269                    }
3270                    if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec)
3271                            != android.net.Proxy.PROXY_VALID)
3272                        throw new IllegalArgumentException();
3273                }
3274                return mService.setGlobalProxy(admin, hostSpec, exclSpec);
3275            } catch (RemoteException e) {
3276                throw e.rethrowFromSystemServer();
3277            }
3278        }
3279        return null;
3280    }
3281
3282    /**
3283     * Set a network-independent global HTTP proxy. This is not normally what you want for typical
3284     * HTTP proxies - they are generally network dependent. However if you're doing something
3285     * unusual like general internal filtering this may be useful. On a private network where the
3286     * proxy is not accessible, you may break HTTP using this.
3287     * <p>
3288     * This method requires the caller to be the device owner.
3289     * <p>
3290     * This proxy is only a recommendation and it is possible that some apps will ignore it.
3291     *
3292     * @see ProxyInfo
3293     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3294     * @param proxyInfo The a {@link ProxyInfo} object defining the new global HTTP proxy. A
3295     *            {@code null} value will clear the global HTTP proxy.
3296     * @throws SecurityException if {@code admin} is not the device owner.
3297     */
3298    public void setRecommendedGlobalProxy(@NonNull ComponentName admin, @Nullable ProxyInfo
3299            proxyInfo) {
3300        throwIfParentInstance("setRecommendedGlobalProxy");
3301        if (mService != null) {
3302            try {
3303                mService.setRecommendedGlobalProxy(admin, proxyInfo);
3304            } catch (RemoteException e) {
3305                throw e.rethrowFromSystemServer();
3306            }
3307        }
3308    }
3309
3310    /**
3311     * Returns the component name setting the global proxy.
3312     * @return ComponentName object of the device admin that set the global proxy, or {@code null}
3313     *         if no admin has set the proxy.
3314     * @hide
3315     */
3316    public @Nullable ComponentName getGlobalProxyAdmin() {
3317        if (mService != null) {
3318            try {
3319                return mService.getGlobalProxyAdmin(myUserId());
3320            } catch (RemoteException e) {
3321                throw e.rethrowFromSystemServer();
3322            }
3323        }
3324        return null;
3325    }
3326
3327    /**
3328     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
3329     * indicating that encryption is not supported.
3330     */
3331    public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0;
3332
3333    /**
3334     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
3335     * indicating that encryption is supported, but is not currently active.
3336     */
3337    public static final int ENCRYPTION_STATUS_INACTIVE = 1;
3338
3339    /**
3340     * Result code for {@link #getStorageEncryptionStatus}:
3341     * indicating that encryption is not currently active, but is currently
3342     * being activated.  This is only reported by devices that support
3343     * encryption of data and only when the storage is currently
3344     * undergoing a process of becoming encrypted.  A device that must reboot and/or wipe data
3345     * to become encrypted will never return this value.
3346     */
3347    public static final int ENCRYPTION_STATUS_ACTIVATING = 2;
3348
3349    /**
3350     * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
3351     * indicating that encryption is active.
3352     * <p>
3353     * Also see {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
3354     */
3355    public static final int ENCRYPTION_STATUS_ACTIVE = 3;
3356
3357    /**
3358     * Result code for {@link #getStorageEncryptionStatus}:
3359     * indicating that encryption is active, but an encryption key has not
3360     * been set by the user.
3361     */
3362    public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4;
3363
3364    /**
3365     * Result code for {@link #getStorageEncryptionStatus}:
3366     * indicating that encryption is active and the encryption key is tied to the user or profile.
3367     * <p>
3368     * This value is only returned to apps targeting API level 24 and above. For apps targeting
3369     * earlier API levels, {@link #ENCRYPTION_STATUS_ACTIVE} is returned, even if the
3370     * encryption key is specific to the user or profile.
3371     */
3372    public static final int ENCRYPTION_STATUS_ACTIVE_PER_USER = 5;
3373
3374    /**
3375     * Activity action: begin the process of encrypting data on the device.  This activity should
3376     * be launched after using {@link #setStorageEncryption} to request encryption be activated.
3377     * After resuming from this activity, use {@link #getStorageEncryption}
3378     * to check encryption status.  However, on some devices this activity may never return, as
3379     * it may trigger a reboot and in some cases a complete data wipe of the device.
3380     */
3381    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3382    public static final String ACTION_START_ENCRYPTION
3383            = "android.app.action.START_ENCRYPTION";
3384    /**
3385     * Widgets are enabled in keyguard
3386     */
3387    public static final int KEYGUARD_DISABLE_FEATURES_NONE = 0;
3388
3389    /**
3390     * Disable all keyguard widgets. Has no effect.
3391     */
3392    public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1 << 0;
3393
3394    /**
3395     * Disable the camera on secure keyguard screens (e.g. PIN/Pattern/Password)
3396     */
3397    public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 1 << 1;
3398
3399    /**
3400     * Disable showing all notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
3401     */
3402    public static final int KEYGUARD_DISABLE_SECURE_NOTIFICATIONS = 1 << 2;
3403
3404    /**
3405     * Only allow redacted notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
3406     */
3407    public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 1 << 3;
3408
3409    /**
3410     * Ignore trust agent state on secure keyguard screens
3411     * (e.g. PIN/Pattern/Password).
3412     */
3413    public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4;
3414
3415    /**
3416     * Disable fingerprint sensor on keyguard secure screens (e.g. PIN/Pattern/Password).
3417     */
3418    public static final int KEYGUARD_DISABLE_FINGERPRINT = 1 << 5;
3419
3420    /**
3421     * Disable text entry into notifications on secure keyguard screens (e.g. PIN/Pattern/Password).
3422     */
3423    public static final int KEYGUARD_DISABLE_REMOTE_INPUT = 1 << 6;
3424
3425    /**
3426     * Disable all current and future keyguard customizations.
3427     */
3428    public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff;
3429
3430    /**
3431     * Keyguard features that when set on a managed profile that doesn't have its own challenge will
3432     * affect the profile's parent user. These can also be set on the managed profile's parent
3433     * {@link DevicePolicyManager} instance.
3434     *
3435     * @hide
3436     */
3437    public static final int PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER =
3438            DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS
3439            | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
3440
3441    /**
3442     * Called by an application that is administering the device to request that the storage system
3443     * be encrypted.
3444     * <p>
3445     * When multiple device administrators attempt to control device encryption, the most secure,
3446     * supported setting will always be used. If any device administrator requests device
3447     * encryption, it will be enabled; Conversely, if a device administrator attempts to disable
3448     * device encryption while another device administrator has enabled it, the call to disable will
3449     * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}).
3450     * <p>
3451     * This policy controls encryption of the secure (application data) storage area. Data written
3452     * to other storage areas may or may not be encrypted, and this policy does not require or
3453     * control the encryption of any other storage areas. There is one exception: If
3454     * {@link android.os.Environment#isExternalStorageEmulated()} is {@code true}, then the
3455     * directory returned by {@link android.os.Environment#getExternalStorageDirectory()} must be
3456     * written to disk within the encrypted storage area.
3457     * <p>
3458     * Important Note: On some devices, it is possible to encrypt storage without requiring the user
3459     * to create a device PIN or Password. In this case, the storage is encrypted, but the
3460     * encryption key may not be fully secured. For maximum security, the administrator should also
3461     * require (and check for) a pattern, PIN, or password.
3462     *
3463     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3464     * @param encrypt true to request encryption, false to release any previous request
3465     * @return the new request status (for all active admins) - will be one of
3466     *         {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or
3467     *         {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use
3468     *         {@link #getStorageEncryptionStatus()} to query the actual device state.
3469     * @throws SecurityException if {@code admin} is not an active administrator or does not use
3470     *             {@link DeviceAdminInfo#USES_ENCRYPTED_STORAGE}
3471     */
3472    public int setStorageEncryption(@NonNull ComponentName admin, boolean encrypt) {
3473        throwIfParentInstance("setStorageEncryption");
3474        if (mService != null) {
3475            try {
3476                return mService.setStorageEncryption(admin, encrypt);
3477            } catch (RemoteException e) {
3478                throw e.rethrowFromSystemServer();
3479            }
3480        }
3481        return ENCRYPTION_STATUS_UNSUPPORTED;
3482    }
3483
3484    /**
3485     * Called by an application that is administering the device to
3486     * determine the requested setting for secure storage.
3487     *
3488     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.  If null,
3489     * this will return the requested encryption setting as an aggregate of all active
3490     * administrators.
3491     * @return true if the admin(s) are requesting encryption, false if not.
3492     */
3493    public boolean getStorageEncryption(@Nullable ComponentName admin) {
3494        throwIfParentInstance("getStorageEncryption");
3495        if (mService != null) {
3496            try {
3497                return mService.getStorageEncryption(admin, myUserId());
3498            } catch (RemoteException e) {
3499                throw e.rethrowFromSystemServer();
3500            }
3501        }
3502        return false;
3503    }
3504
3505    /**
3506     * Called by an application that is administering the device to
3507     * determine the current encryption status of the device.
3508     * <p>
3509     * Depending on the returned status code, the caller may proceed in different
3510     * ways.  If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the
3511     * storage system does not support encryption.  If the
3512     * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link
3513     * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the
3514     * storage.  If the result is {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY}, the
3515     * storage system has enabled encryption but no password is set so further action
3516     * may be required.  If the result is {@link #ENCRYPTION_STATUS_ACTIVATING},
3517     * {@link #ENCRYPTION_STATUS_ACTIVE} or {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER},
3518     * no further action is required.
3519     *
3520     * @return current status of encryption. The value will be one of
3521     * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE},
3522     * {@link #ENCRYPTION_STATUS_ACTIVATING}, {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY},
3523     * {@link #ENCRYPTION_STATUS_ACTIVE}, or {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
3524     */
3525    public int getStorageEncryptionStatus() {
3526        throwIfParentInstance("getStorageEncryptionStatus");
3527        return getStorageEncryptionStatus(myUserId());
3528    }
3529
3530    /** @hide per-user version */
3531    public int getStorageEncryptionStatus(int userHandle) {
3532        if (mService != null) {
3533            try {
3534                return mService.getStorageEncryptionStatus(mContext.getPackageName(), userHandle);
3535            } catch (RemoteException e) {
3536                throw e.rethrowFromSystemServer();
3537            }
3538        }
3539        return ENCRYPTION_STATUS_UNSUPPORTED;
3540    }
3541
3542    /**
3543     * Mark a CA certificate as approved by the device user. This means that they have been notified
3544     * of the installation, were made aware of the risks, viewed the certificate and still wanted to
3545     * keep the certificate on the device.
3546     *
3547     * Calling with {@param approval} as {@code true} will cancel any ongoing warnings related to
3548     * this certificate.
3549     *
3550     * @hide
3551     */
3552    public boolean approveCaCert(String alias, int userHandle, boolean approval) {
3553        if (mService != null) {
3554            try {
3555                return mService.approveCaCert(alias, userHandle, approval);
3556            } catch (RemoteException e) {
3557                throw e.rethrowFromSystemServer();
3558            }
3559        }
3560        return false;
3561    }
3562
3563    /**
3564     * Check whether a CA certificate has been approved by the device user.
3565     *
3566     * @hide
3567     */
3568    public boolean isCaCertApproved(String alias, int userHandle) {
3569        if (mService != null) {
3570            try {
3571                return mService.isCaCertApproved(alias, userHandle);
3572            } catch (RemoteException e) {
3573                throw e.rethrowFromSystemServer();
3574            }
3575        }
3576        return false;
3577    }
3578
3579    /**
3580     * Installs the given certificate as a user CA.
3581     *
3582     * The caller must be a profile or device owner on that user, or a delegate package given the
3583     * {@link #DELEGATION_CERT_INSTALL} scope via {@link #setDelegatedScopes}; otherwise a
3584     * security exception will be thrown.
3585     *
3586     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3587     *              {@code null} if calling from a delegated certificate installer.
3588     * @param certBuffer encoded form of the certificate to install.
3589     *
3590     * @return false if the certBuffer cannot be parsed or installation is
3591     *         interrupted, true otherwise.
3592     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3593     *         owner.
3594     * @see #setDelegatedScopes
3595     * @see #DELEGATION_CERT_INSTALL
3596     */
3597    public boolean installCaCert(@Nullable ComponentName admin, byte[] certBuffer) {
3598        throwIfParentInstance("installCaCert");
3599        if (mService != null) {
3600            try {
3601                return mService.installCaCert(admin, mContext.getPackageName(), certBuffer);
3602            } catch (RemoteException e) {
3603                throw e.rethrowFromSystemServer();
3604            }
3605        }
3606        return false;
3607    }
3608
3609    /**
3610     * Uninstalls the given certificate from trusted user CAs, if present.
3611     *
3612     * The caller must be a profile or device owner on that user, or a delegate package given the
3613     * {@link #DELEGATION_CERT_INSTALL} scope via {@link #setDelegatedScopes}; otherwise a
3614     * security exception will be thrown.
3615     *
3616     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3617     *              {@code null} if calling from a delegated certificate installer.
3618     * @param certBuffer encoded form of the certificate to remove.
3619     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3620     *         owner.
3621     * @see #setDelegatedScopes
3622     * @see #DELEGATION_CERT_INSTALL
3623     */
3624    public void uninstallCaCert(@Nullable ComponentName admin, byte[] certBuffer) {
3625        throwIfParentInstance("uninstallCaCert");
3626        if (mService != null) {
3627            try {
3628                final String alias = getCaCertAlias(certBuffer);
3629                mService.uninstallCaCerts(admin, mContext.getPackageName(), new String[] {alias});
3630            } catch (CertificateException e) {
3631                Log.w(TAG, "Unable to parse certificate", e);
3632            } catch (RemoteException e) {
3633                throw e.rethrowFromSystemServer();
3634            }
3635        }
3636    }
3637
3638    /**
3639     * Returns all CA certificates that are currently trusted, excluding system CA certificates.
3640     * If a user has installed any certificates by other means than device policy these will be
3641     * included too.
3642     *
3643     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3644     *              {@code null} if calling from a delegated certificate installer.
3645     * @return a List of byte[] arrays, each encoding one user CA certificate.
3646     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3647     *         owner.
3648     */
3649    public @NonNull List<byte[]> getInstalledCaCerts(@Nullable ComponentName admin) {
3650        final List<byte[]> certs = new ArrayList<byte[]>();
3651        throwIfParentInstance("getInstalledCaCerts");
3652        if (mService != null) {
3653            try {
3654                mService.enforceCanManageCaCerts(admin, mContext.getPackageName());
3655                final TrustedCertificateStore certStore = new TrustedCertificateStore();
3656                for (String alias : certStore.userAliases()) {
3657                    try {
3658                        certs.add(certStore.getCertificate(alias).getEncoded());
3659                    } catch (CertificateException ce) {
3660                        Log.w(TAG, "Could not encode certificate: " + alias, ce);
3661                    }
3662                }
3663            } catch (RemoteException re) {
3664                throw re.rethrowFromSystemServer();
3665            }
3666        }
3667        return certs;
3668    }
3669
3670    /**
3671     * Uninstalls all custom trusted CA certificates from the profile. Certificates installed by
3672     * means other than device policy will also be removed, except for system CA certificates.
3673     *
3674     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3675     *              {@code null} if calling from a delegated certificate installer.
3676     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3677     *         owner.
3678     */
3679    public void uninstallAllUserCaCerts(@Nullable ComponentName admin) {
3680        throwIfParentInstance("uninstallAllUserCaCerts");
3681        if (mService != null) {
3682            try {
3683                mService.uninstallCaCerts(admin, mContext.getPackageName(),
3684                        new TrustedCertificateStore().userAliases() .toArray(new String[0]));
3685            } catch (RemoteException re) {
3686                throw re.rethrowFromSystemServer();
3687            }
3688        }
3689    }
3690
3691    /**
3692     * Returns whether this certificate is installed as a trusted CA.
3693     *
3694     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3695     *              {@code null} if calling from a delegated certificate installer.
3696     * @param certBuffer encoded form of the certificate to look up.
3697     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3698     *         owner.
3699     */
3700    public boolean hasCaCertInstalled(@Nullable ComponentName admin, byte[] certBuffer) {
3701        throwIfParentInstance("hasCaCertInstalled");
3702        if (mService != null) {
3703            try {
3704                mService.enforceCanManageCaCerts(admin, mContext.getPackageName());
3705                return getCaCertAlias(certBuffer) != null;
3706            } catch (RemoteException re) {
3707                throw re.rethrowFromSystemServer();
3708            } catch (CertificateException ce) {
3709                Log.w(TAG, "Could not parse certificate", ce);
3710            }
3711        }
3712        return false;
3713    }
3714
3715    /**
3716     * Called by a device or profile owner, or delegated certificate installer, to install a
3717     * certificate and corresponding private key. All apps within the profile will be able to access
3718     * the certificate and use the private key, given direct user approval.
3719     *
3720     * <p>Access to the installed credentials will not be granted to the caller of this API without
3721     * direct user approval. This is for security - should a certificate installer become
3722     * compromised, certificates it had already installed will be protected.
3723     *
3724     * <p>If the installer must have access to the credentials, call
3725     * {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, boolean)} instead.
3726     *
3727     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3728     *            {@code null} if calling from a delegated certificate installer.
3729     * @param privKey The private key to install.
3730     * @param cert The certificate to install.
3731     * @param alias The private key alias under which to install the certificate. If a certificate
3732     * with that alias already exists, it will be overwritten.
3733     * @return {@code true} if the keys were installed, {@code false} otherwise.
3734     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3735     *         owner.
3736     * @see #setDelegatedScopes
3737     * @see #DELEGATION_CERT_INSTALL
3738     */
3739    public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
3740            @NonNull Certificate cert, @NonNull String alias) {
3741        return installKeyPair(admin, privKey, new Certificate[] {cert}, alias, false);
3742    }
3743
3744    /**
3745     * Called by a device or profile owner, or delegated certificate installer, to install a
3746     * certificate chain and corresponding private key for the leaf certificate. All apps within the
3747     * profile will be able to access the certificate chain and use the private key, given direct
3748     * user approval.
3749     *
3750     * <p>The caller of this API may grant itself access to the certificate and private key
3751     * immediately, without user approval. It is a best practice not to request this unless strictly
3752     * necessary since it opens up additional security vulnerabilities.
3753     *
3754     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3755     *        {@code null} if calling from a delegated certificate installer.
3756     * @param privKey The private key to install.
3757     * @param certs The certificate chain to install. The chain should start with the leaf
3758     *        certificate and include the chain of trust in order. This will be returned by
3759     *        {@link android.security.KeyChain#getCertificateChain}.
3760     * @param alias The private key alias under which to install the certificate. If a certificate
3761     *        with that alias already exists, it will be overwritten.
3762     * @param requestAccess {@code true} to request that the calling app be granted access to the
3763     *        credentials immediately. Otherwise, access to the credentials will be gated by user
3764     *        approval.
3765     * @return {@code true} if the keys were installed, {@code false} otherwise.
3766     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3767     *         owner.
3768     * @see android.security.KeyChain#getCertificateChain
3769     * @see #setDelegatedScopes
3770     * @see #DELEGATION_CERT_INSTALL
3771     */
3772    public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey,
3773            @NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess) {
3774        throwIfParentInstance("installKeyPair");
3775        try {
3776            final byte[] pemCert = Credentials.convertToPem(certs[0]);
3777            byte[] pemChain = null;
3778            if (certs.length > 1) {
3779                pemChain = Credentials.convertToPem(Arrays.copyOfRange(certs, 1, certs.length));
3780            }
3781            final byte[] pkcs8Key = KeyFactory.getInstance(privKey.getAlgorithm())
3782                    .getKeySpec(privKey, PKCS8EncodedKeySpec.class).getEncoded();
3783            return mService.installKeyPair(admin, mContext.getPackageName(), pkcs8Key, pemCert,
3784                    pemChain, alias, requestAccess);
3785        } catch (RemoteException e) {
3786            throw e.rethrowFromSystemServer();
3787        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
3788            Log.w(TAG, "Failed to obtain private key material", e);
3789        } catch (CertificateException | IOException e) {
3790            Log.w(TAG, "Could not pem-encode certificate", e);
3791        }
3792        return false;
3793    }
3794
3795    /**
3796     * Called by a device or profile owner, or delegated certificate installer, to remove a
3797     * certificate and private key pair installed under a given alias.
3798     *
3799     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3800     *        {@code null} if calling from a delegated certificate installer.
3801     * @param alias The private key alias under which the certificate is installed.
3802     * @return {@code true} if the private key alias no longer exists, {@code false} otherwise.
3803     * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile
3804     *         owner.
3805     * @see #setDelegatedScopes
3806     * @see #DELEGATION_CERT_INSTALL
3807     */
3808    public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) {
3809        throwIfParentInstance("removeKeyPair");
3810        try {
3811            return mService.removeKeyPair(admin, mContext.getPackageName(), alias);
3812        } catch (RemoteException e) {
3813            throw e.rethrowFromSystemServer();
3814        }
3815    }
3816
3817    /**
3818     * @return the alias of a given CA certificate in the certificate store, or {@code null} if it
3819     * doesn't exist.
3820     */
3821    private static String getCaCertAlias(byte[] certBuffer) throws CertificateException {
3822        final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
3823        final X509Certificate cert = (X509Certificate) certFactory.generateCertificate(
3824                              new ByteArrayInputStream(certBuffer));
3825        return new TrustedCertificateStore().getCertificateAlias(cert);
3826    }
3827
3828    /**
3829     * Called by a profile owner or device owner to grant access to privileged certificate
3830     * manipulation APIs to a third-party certificate installer app. Granted APIs include
3831     * {@link #getInstalledCaCerts}, {@link #hasCaCertInstalled}, {@link #installCaCert},
3832     * {@link #uninstallCaCert}, {@link #uninstallAllUserCaCerts} and {@link #installKeyPair}.
3833     * <p>
3834     * Delegated certificate installer is a per-user state. The delegated access is persistent until
3835     * it is later cleared by calling this method with a null value or uninstallling the certificate
3836     * installer.
3837     * <p>
3838     * <b>Note:</b>Starting from {@link android.os.Build.VERSION_CODES#N}, if the caller
3839     * application's target SDK version is {@link android.os.Build.VERSION_CODES#N} or newer, the
3840     * supplied certificate installer package must be installed when calling this API, otherwise an
3841     * {@link IllegalArgumentException} will be thrown.
3842     *
3843     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3844     * @param installerPackage The package name of the certificate installer which will be given
3845     *            access. If {@code null} is given the current package will be cleared.
3846     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3847     *
3848     * @deprecated From {@link android.os.Build.VERSION_CODES#O}. Use {@link #setDelegatedScopes}
3849     * with the {@link #DELEGATION_CERT_INSTALL} scope instead.
3850     */
3851    @Deprecated
3852    public void setCertInstallerPackage(@NonNull ComponentName admin, @Nullable String
3853            installerPackage) throws SecurityException {
3854        throwIfParentInstance("setCertInstallerPackage");
3855        if (mService != null) {
3856            try {
3857                mService.setCertInstallerPackage(admin, installerPackage);
3858            } catch (RemoteException e) {
3859                throw e.rethrowFromSystemServer();
3860            }
3861        }
3862    }
3863
3864    /**
3865     * Called by a profile owner or device owner to retrieve the certificate installer for the user,
3866     * or {@code null} if none is set. If there are multiple delegates this function will return one
3867     * of them.
3868     *
3869     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3870     * @return The package name of the current delegated certificate installer, or {@code null} if
3871     *         none is set.
3872     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3873     *
3874     * @deprecated From {@link android.os.Build.VERSION_CODES#O}. Use {@link #getDelegatePackages}
3875     * with the {@link #DELEGATION_CERT_INSTALL} scope instead.
3876     */
3877    @Deprecated
3878    public @Nullable String getCertInstallerPackage(@NonNull ComponentName admin)
3879            throws SecurityException {
3880        throwIfParentInstance("getCertInstallerPackage");
3881        if (mService != null) {
3882            try {
3883                return mService.getCertInstallerPackage(admin);
3884            } catch (RemoteException e) {
3885                throw e.rethrowFromSystemServer();
3886            }
3887        }
3888        return null;
3889    }
3890
3891    /**
3892     * Called by a profile owner or device owner to grant access to privileged APIs to another app.
3893     * Granted APIs are determined by {@code scopes}, which is a list of the {@code DELEGATION_*}
3894     * constants.
3895     * <p>
3896     * A broadcast with the {@link #ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED} action will be
3897     * sent to the {@code delegatePackage} with its new scopes in an {@code ArrayList<String>} extra
3898     * under the {@link #EXTRA_DELEGATION_SCOPES} key. The broadcast is sent with the
3899     * {@link Intent#FLAG_RECEIVER_REGISTERED_ONLY} flag.
3900     * <p>
3901     * Delegated scopes are a per-user state. The delegated access is persistent until it is later
3902     * cleared by calling this method with an empty {@code scopes} list or uninstalling the
3903     * {@code delegatePackage}.
3904     *
3905     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3906     * @param delegatePackage The package name of the app which will be given access.
3907     * @param scopes The groups of privileged APIs whose access should be granted to
3908     *            {@code delegatedPackage}.
3909     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3910     */
3911     public void setDelegatedScopes(@NonNull ComponentName admin, @NonNull String delegatePackage,
3912            @NonNull List<String> scopes) {
3913        throwIfParentInstance("setDelegatedScopes");
3914        if (mService != null) {
3915            try {
3916                mService.setDelegatedScopes(admin, delegatePackage, scopes);
3917            } catch (RemoteException e) {
3918                throw e.rethrowFromSystemServer();
3919            }
3920        }
3921    }
3922
3923    /**
3924     * Called by a profile owner or device owner to retrieve a list of the scopes given to a
3925     * delegate package. Other apps can use this method to retrieve their own delegated scopes by
3926     * passing {@code null} for {@code admin} and their own package name as
3927     * {@code delegatedPackage}.
3928     *
3929     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
3930     *            {@code null} if the caller is {@code delegatedPackage}.
3931     * @param delegatedPackage The package name of the app whose scopes should be retrieved.
3932     * @return A list containing the scopes given to {@code delegatedPackage}.
3933     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3934     */
3935     @NonNull
3936     public List<String> getDelegatedScopes(@Nullable ComponentName admin,
3937             @NonNull String delegatedPackage) {
3938         throwIfParentInstance("getDelegatedScopes");
3939         if (mService != null) {
3940             try {
3941                 return mService.getDelegatedScopes(admin, delegatedPackage);
3942             } catch (RemoteException e) {
3943                 throw e.rethrowFromSystemServer();
3944             }
3945         }
3946         return null;
3947    }
3948
3949    /**
3950     * Called by a profile owner or device owner to retrieve a list of delegate packages that were
3951     * granted a delegation scope.
3952     *
3953     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3954     * @param delegationScope The scope whose delegates should be retrieved.
3955     * @return A list of package names of the current delegated packages for
3956               {@code delegationScope}.
3957     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3958     */
3959     @Nullable
3960     public List<String> getDelegatePackages(@NonNull ComponentName admin,
3961             @NonNull String delegationScope) {
3962        throwIfParentInstance("getDelegatePackages");
3963        if (mService != null) {
3964            try {
3965                return mService.getDelegatePackages(admin, delegationScope);
3966            } catch (RemoteException e) {
3967                throw e.rethrowFromSystemServer();
3968            }
3969        }
3970        return null;
3971    }
3972
3973    /**
3974     * Called by a device or profile owner to configure an always-on VPN connection through a
3975     * specific application for the current user. This connection is automatically granted and
3976     * persisted after a reboot.
3977     * <p>
3978     * To support the always-on feature, an app must
3979     * <ul>
3980     *     <li>declare a {@link android.net.VpnService} in its manifest, guarded by
3981     *         {@link android.Manifest.permission#BIND_VPN_SERVICE};</li>
3982     *     <li>target {@link android.os.Build.VERSION_CODES#N API 24} or above; and</li>
3983     *     <li><i>not</i> explicitly opt out of the feature through
3984     *         {@link android.net.VpnService#SERVICE_META_DATA_SUPPORTS_ALWAYS_ON}.</li>
3985     * </ul>
3986     * The call will fail if called with the package name of an unsupported VPN app.
3987     *
3988     * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to
3989     *        remove an existing always-on VPN configuration.
3990     * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
3991     *        {@code false} otherwise. This carries the risk that any failure of the VPN provider
3992     *        could break networking for all apps. This has no effect when clearing.
3993     * @throws SecurityException if {@code admin} is not a device or a profile owner.
3994     * @throws NameNotFoundException if {@code vpnPackage} is not installed.
3995     * @throws UnsupportedOperationException if {@code vpnPackage} exists but does not support being
3996     *         set as always-on, or if always-on VPN is not available.
3997     */
3998    public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage,
3999            boolean lockdownEnabled)
4000            throws NameNotFoundException, UnsupportedOperationException {
4001        throwIfParentInstance("setAlwaysOnVpnPackage");
4002        if (mService != null) {
4003            try {
4004                if (!mService.setAlwaysOnVpnPackage(admin, vpnPackage, lockdownEnabled)) {
4005                    throw new NameNotFoundException(vpnPackage);
4006                }
4007            } catch (RemoteException e) {
4008                throw e.rethrowFromSystemServer();
4009            }
4010        }
4011    }
4012
4013    /**
4014     * Called by a device or profile owner to read the name of the package administering an
4015     * always-on VPN connection for the current user. If there is no such package, or the always-on
4016     * VPN is provided by the system instead of by an application, {@code null} will be returned.
4017     *
4018     * @return Package name of VPN controller responsible for always-on VPN, or {@code null} if none
4019     *         is set.
4020     * @throws SecurityException if {@code admin} is not a device or a profile owner.
4021     */
4022    public @Nullable String getAlwaysOnVpnPackage(@NonNull ComponentName admin) {
4023        throwIfParentInstance("getAlwaysOnVpnPackage");
4024        if (mService != null) {
4025            try {
4026                return mService.getAlwaysOnVpnPackage(admin);
4027            } catch (RemoteException e) {
4028                throw e.rethrowFromSystemServer();
4029            }
4030        }
4031        return null;
4032    }
4033
4034    /**
4035     * Called by an application that is administering the device to disable all cameras on the
4036     * device, for this user. After setting this, no applications running as this user will be able
4037     * to access any cameras on the device.
4038     * <p>
4039     * If the caller is device owner, then the restriction will be applied to all users.
4040     * <p>
4041     * The calling device admin must have requested
4042     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call this method; if it has
4043     * not, a security exception will be thrown.
4044     *
4045     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4046     * @param disabled Whether or not the camera should be disabled.
4047     * @throws SecurityException if {@code admin} is not an active administrator or does not use
4048     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA}.
4049     */
4050    public void setCameraDisabled(@NonNull ComponentName admin, boolean disabled) {
4051        throwIfParentInstance("setCameraDisabled");
4052        if (mService != null) {
4053            try {
4054                mService.setCameraDisabled(admin, disabled);
4055            } catch (RemoteException e) {
4056                throw e.rethrowFromSystemServer();
4057            }
4058        }
4059    }
4060
4061    /**
4062     * Determine whether or not the device's cameras have been disabled for this user,
4063     * either by the calling admin, if specified, or all admins.
4064     * @param admin The name of the admin component to check, or {@code null} to check whether any admins
4065     * have disabled the camera
4066     */
4067    public boolean getCameraDisabled(@Nullable ComponentName admin) {
4068        throwIfParentInstance("getCameraDisabled");
4069        return getCameraDisabled(admin, myUserId());
4070    }
4071
4072    /** @hide per-user version */
4073    public boolean getCameraDisabled(@Nullable ComponentName admin, int userHandle) {
4074        if (mService != null) {
4075            try {
4076                return mService.getCameraDisabled(admin, userHandle);
4077            } catch (RemoteException e) {
4078                throw e.rethrowFromSystemServer();
4079            }
4080        }
4081        return false;
4082    }
4083
4084    /**
4085     * Called by a device owner to request a bugreport.
4086     * <p>
4087     * If the device contains secondary users or profiles, they must be affiliated with the device
4088     * owner user. Otherwise a {@link SecurityException} will be thrown. See
4089     * {@link #setAffiliationIds}.
4090     *
4091     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4092     * @return {@code true} if the bugreport collection started successfully, or {@code false} if it
4093     *         wasn't triggered because a previous bugreport operation is still active (either the
4094     *         bugreport is still running or waiting for the user to share or decline)
4095     * @throws SecurityException if {@code admin} is not a device owner, or there is at least one
4096     *         profile or secondary user that is not affiliated with the device owner user.
4097     */
4098    public boolean requestBugreport(@NonNull ComponentName admin) {
4099        throwIfParentInstance("requestBugreport");
4100        if (mService != null) {
4101            try {
4102                return mService.requestBugreport(admin);
4103            } catch (RemoteException e) {
4104                throw e.rethrowFromSystemServer();
4105            }
4106        }
4107        return false;
4108    }
4109
4110    /**
4111     * Determine whether or not creating a guest user has been disabled for the device
4112     *
4113     * @hide
4114     */
4115    public boolean getGuestUserDisabled(@Nullable ComponentName admin) {
4116        // Currently guest users can always be created if multi-user is enabled
4117        // TODO introduce a policy for guest user creation
4118        return false;
4119    }
4120
4121    /**
4122     * Called by a device/profile owner to set whether the screen capture is disabled. Disabling
4123     * screen capture also prevents the content from being shown on display devices that do not have
4124     * a secure video output. See {@link android.view.Display#FLAG_SECURE} for more details about
4125     * secure surfaces and secure displays.
4126     * <p>
4127     * The calling device admin must be a device or profile owner. If it is not, a security
4128     * exception will be thrown.
4129     * <p>
4130     * From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also blocks
4131     * assist requests for all activities of the relevant user.
4132     *
4133     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4134     * @param disabled Whether screen capture is disabled or not.
4135     * @throws SecurityException if {@code admin} is not a device or profile owner.
4136     */
4137    public void setScreenCaptureDisabled(@NonNull ComponentName admin, boolean disabled) {
4138        throwIfParentInstance("setScreenCaptureDisabled");
4139        if (mService != null) {
4140            try {
4141                mService.setScreenCaptureDisabled(admin, disabled);
4142            } catch (RemoteException e) {
4143                throw e.rethrowFromSystemServer();
4144            }
4145        }
4146    }
4147
4148    /**
4149     * Determine whether or not screen capture has been disabled by the calling
4150     * admin, if specified, or all admins.
4151     * @param admin The name of the admin component to check, or {@code null} to check whether any admins
4152     * have disabled screen capture.
4153     */
4154    public boolean getScreenCaptureDisabled(@Nullable ComponentName admin) {
4155        throwIfParentInstance("getScreenCaptureDisabled");
4156        return getScreenCaptureDisabled(admin, myUserId());
4157    }
4158
4159    /** @hide per-user version */
4160    public boolean getScreenCaptureDisabled(@Nullable ComponentName admin, int userHandle) {
4161        if (mService != null) {
4162            try {
4163                return mService.getScreenCaptureDisabled(admin, userHandle);
4164            } catch (RemoteException e) {
4165                throw e.rethrowFromSystemServer();
4166            }
4167        }
4168        return false;
4169    }
4170
4171    /**
4172     * Called by a device or profile owner to set whether auto time is required. If auto time is
4173     * required, no user will be able set the date and time and network date and time will be used.
4174     * <p>
4175     * Note: if auto time is required the user can still manually set the time zone.
4176     * <p>
4177     * The calling device admin must be a device or profile owner. If it is not, a security
4178     * exception will be thrown.
4179     *
4180     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4181     * @param required Whether auto time is set required or not.
4182     * @throws SecurityException if {@code admin} is not a device owner.
4183     */
4184    public void setAutoTimeRequired(@NonNull ComponentName admin, boolean required) {
4185        throwIfParentInstance("setAutoTimeRequired");
4186        if (mService != null) {
4187            try {
4188                mService.setAutoTimeRequired(admin, required);
4189            } catch (RemoteException e) {
4190                throw e.rethrowFromSystemServer();
4191            }
4192        }
4193    }
4194
4195    /**
4196     * @return true if auto time is required.
4197     */
4198    public boolean getAutoTimeRequired() {
4199        throwIfParentInstance("getAutoTimeRequired");
4200        if (mService != null) {
4201            try {
4202                return mService.getAutoTimeRequired();
4203            } catch (RemoteException e) {
4204                throw e.rethrowFromSystemServer();
4205            }
4206        }
4207        return false;
4208    }
4209
4210    /**
4211     * Called by a device owner to set whether all users created on the device should be ephemeral.
4212     * <p>
4213     * The system user is exempt from this policy - it is never ephemeral.
4214     * <p>
4215     * The calling device admin must be the device owner. If it is not, a security exception will be
4216     * thrown.
4217     *
4218     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4219     * @param forceEphemeralUsers If true, all the existing users will be deleted and all
4220     *            subsequently created users will be ephemeral.
4221     * @throws SecurityException if {@code admin} is not a device owner.
4222     * @hide
4223     */
4224    public void setForceEphemeralUsers(
4225            @NonNull ComponentName admin, boolean forceEphemeralUsers) {
4226        throwIfParentInstance("setForceEphemeralUsers");
4227        if (mService != null) {
4228            try {
4229                mService.setForceEphemeralUsers(admin, forceEphemeralUsers);
4230            } catch (RemoteException e) {
4231                throw e.rethrowFromSystemServer();
4232            }
4233        }
4234    }
4235
4236    /**
4237     * @return true if all users are created ephemeral.
4238     * @throws SecurityException if {@code admin} is not a device owner.
4239     * @hide
4240     */
4241    public boolean getForceEphemeralUsers(@NonNull ComponentName admin) {
4242        throwIfParentInstance("getForceEphemeralUsers");
4243        if (mService != null) {
4244            try {
4245                return mService.getForceEphemeralUsers(admin);
4246            } catch (RemoteException e) {
4247                throw e.rethrowFromSystemServer();
4248            }
4249        }
4250        return false;
4251    }
4252
4253    /**
4254     * Called by an application that is administering the device to disable keyguard customizations,
4255     * such as widgets. After setting this, keyguard features will be disabled according to the
4256     * provided feature list.
4257     * <p>
4258     * The calling device admin must have requested
4259     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method;
4260     * if it has not, a security exception will be thrown.
4261     * <p>
4262     * Calling this from a managed profile before version {@link android.os.Build.VERSION_CODES#M}
4263     * will throw a security exception. From version {@link android.os.Build.VERSION_CODES#M} the
4264     * profile owner of a managed profile can set:
4265     * <ul>
4266     * <li>{@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which affects the parent user, but only if there
4267     * is no separate challenge set on the managed profile.
4268     * <li>{@link #KEYGUARD_DISABLE_FINGERPRINT} which affects the managed profile challenge if
4269     * there is one, or the parent user otherwise.
4270     * <li>{@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS} which affects notifications generated
4271     * by applications in the managed profile.
4272     * </ul>
4273     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} and {@link #KEYGUARD_DISABLE_FINGERPRINT} can also be
4274     * set on the {@link DevicePolicyManager} instance returned by
4275     * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
4276     * profile.
4277     * <p>
4278     * Requests to disable other features on a managed profile will be ignored.
4279     * <p>
4280     * The admin can check which features have been disabled by calling
4281     * {@link #getKeyguardDisabledFeatures(ComponentName)}
4282     *
4283     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4284     * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default),
4285     *            {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA},
4286     *            {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS},
4287     *            {@link #KEYGUARD_DISABLE_TRUST_AGENTS},
4288     *            {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},
4289     *            {@link #KEYGUARD_DISABLE_FINGERPRINT}, {@link #KEYGUARD_DISABLE_FEATURES_ALL}
4290     * @throws SecurityException if {@code admin} is not an active administrator or does not user
4291     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES}
4292     */
4293    public void setKeyguardDisabledFeatures(@NonNull ComponentName admin, int which) {
4294        if (mService != null) {
4295            try {
4296                mService.setKeyguardDisabledFeatures(admin, which, mParentInstance);
4297            } catch (RemoteException e) {
4298                throw e.rethrowFromSystemServer();
4299            }
4300        }
4301    }
4302
4303    /**
4304     * Determine whether or not features have been disabled in keyguard either by the calling
4305     * admin, if specified, or all admins that set restrictions on this user and its participating
4306     * profiles. Restrictions on profiles that have a separate challenge are not taken into account.
4307     *
4308     * <p>This method can be called on the {@link DevicePolicyManager} instance
4309     * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
4310     * restrictions on the parent profile.
4311     *
4312     * @param admin The name of the admin component to check, or {@code null} to check whether any
4313     * admins have disabled features in keyguard.
4314     * @return bitfield of flags. See {@link #setKeyguardDisabledFeatures(ComponentName, int)}
4315     * for a list.
4316     */
4317    public int getKeyguardDisabledFeatures(@Nullable ComponentName admin) {
4318        return getKeyguardDisabledFeatures(admin, myUserId());
4319    }
4320
4321    /** @hide per-user version */
4322    public int getKeyguardDisabledFeatures(@Nullable ComponentName admin, int userHandle) {
4323        if (mService != null) {
4324            try {
4325                return mService.getKeyguardDisabledFeatures(admin, userHandle, mParentInstance);
4326            } catch (RemoteException e) {
4327                throw e.rethrowFromSystemServer();
4328            }
4329        }
4330        return KEYGUARD_DISABLE_FEATURES_NONE;
4331    }
4332
4333    /**
4334     * @hide
4335     */
4336    public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing,
4337            int userHandle) {
4338        if (mService != null) {
4339            try {
4340                mService.setActiveAdmin(policyReceiver, refreshing, userHandle);
4341            } catch (RemoteException e) {
4342                throw e.rethrowFromSystemServer();
4343            }
4344        }
4345    }
4346
4347    /**
4348     * @hide
4349     */
4350    public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing) {
4351        setActiveAdmin(policyReceiver, refreshing, myUserId());
4352    }
4353
4354    /**
4355     * @hide
4356     */
4357    public void getRemoveWarning(@Nullable ComponentName admin, RemoteCallback result) {
4358        if (mService != null) {
4359            try {
4360                mService.getRemoveWarning(admin, result, myUserId());
4361            } catch (RemoteException e) {
4362                throw e.rethrowFromSystemServer();
4363            }
4364        }
4365    }
4366
4367    /**
4368     * @hide
4369     */
4370    public void setActivePasswordState(PasswordMetrics metrics, int userHandle) {
4371        if (mService != null) {
4372            try {
4373                mService.setActivePasswordState(metrics, userHandle);
4374            } catch (RemoteException e) {
4375                throw e.rethrowFromSystemServer();
4376            }
4377        }
4378    }
4379
4380    /**
4381     * @hide
4382     */
4383    public void reportPasswordChanged(@UserIdInt int userId) {
4384        if (mService != null) {
4385            try {
4386                mService.reportPasswordChanged(userId);
4387            } catch (RemoteException e) {
4388                throw e.rethrowFromSystemServer();
4389            }
4390        }
4391    }
4392
4393    /**
4394     * @hide
4395     */
4396    public void reportFailedPasswordAttempt(int userHandle) {
4397        if (mService != null) {
4398            try {
4399                mService.reportFailedPasswordAttempt(userHandle);
4400            } catch (RemoteException e) {
4401                throw e.rethrowFromSystemServer();
4402            }
4403        }
4404    }
4405
4406    /**
4407     * @hide
4408     */
4409    public void reportSuccessfulPasswordAttempt(int userHandle) {
4410        if (mService != null) {
4411            try {
4412                mService.reportSuccessfulPasswordAttempt(userHandle);
4413            } catch (RemoteException e) {
4414                throw e.rethrowFromSystemServer();
4415            }
4416        }
4417    }
4418
4419    /**
4420     * @hide
4421     */
4422    public void reportFailedFingerprintAttempt(int userHandle) {
4423        if (mService != null) {
4424            try {
4425                mService.reportFailedFingerprintAttempt(userHandle);
4426            } catch (RemoteException e) {
4427                throw e.rethrowFromSystemServer();
4428            }
4429        }
4430    }
4431
4432    /**
4433     * @hide
4434     */
4435    public void reportSuccessfulFingerprintAttempt(int userHandle) {
4436        if (mService != null) {
4437            try {
4438                mService.reportSuccessfulFingerprintAttempt(userHandle);
4439            } catch (RemoteException e) {
4440                throw e.rethrowFromSystemServer();
4441            }
4442        }
4443    }
4444
4445    /**
4446     * Should be called when keyguard has been dismissed.
4447     * @hide
4448     */
4449    public void reportKeyguardDismissed(int userHandle) {
4450        if (mService != null) {
4451            try {
4452                mService.reportKeyguardDismissed(userHandle);
4453            } catch (RemoteException e) {
4454                throw e.rethrowFromSystemServer();
4455            }
4456        }
4457    }
4458
4459    /**
4460     * Should be called when keyguard view has been shown to the user.
4461     * @hide
4462     */
4463    public void reportKeyguardSecured(int userHandle) {
4464        if (mService != null) {
4465            try {
4466                mService.reportKeyguardSecured(userHandle);
4467            } catch (RemoteException e) {
4468                throw e.rethrowFromSystemServer();
4469            }
4470        }
4471    }
4472
4473    /**
4474     * @hide
4475     * Sets the given package as the device owner.
4476     * Same as {@link #setDeviceOwner(ComponentName, String)} but without setting a device owner name.
4477     * @param who the component name to be registered as device owner.
4478     * @return whether the package was successfully registered as the device owner.
4479     * @throws IllegalArgumentException if the package name is null or invalid
4480     * @throws IllegalStateException If the preconditions mentioned are not met.
4481     */
4482    public boolean setDeviceOwner(ComponentName who) {
4483        return setDeviceOwner(who, null);
4484    }
4485
4486    /**
4487     * @hide
4488     */
4489    public boolean setDeviceOwner(ComponentName who, int userId)  {
4490        return setDeviceOwner(who, null, userId);
4491    }
4492
4493    /**
4494     * @hide
4495     */
4496    public boolean setDeviceOwner(ComponentName who, String ownerName) {
4497        return setDeviceOwner(who, ownerName, UserHandle.USER_SYSTEM);
4498    }
4499
4500    /**
4501     * @hide
4502     * Sets the given package as the device owner. The package must already be installed. There
4503     * must not already be a device owner.
4504     * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call
4505     * this method.
4506     * Calling this after the setup phase of the primary user has completed is allowed only if
4507     * the caller is the shell uid, and there are no additional users and no accounts.
4508     * @param who the component name to be registered as device owner.
4509     * @param ownerName the human readable name of the institution that owns this device.
4510     * @param userId ID of the user on which the device owner runs.
4511     * @return whether the package was successfully registered as the device owner.
4512     * @throws IllegalArgumentException if the package name is null or invalid
4513     * @throws IllegalStateException If the preconditions mentioned are not met.
4514     */
4515    public boolean setDeviceOwner(ComponentName who, String ownerName, int userId)
4516            throws IllegalArgumentException, IllegalStateException {
4517        if (mService != null) {
4518            try {
4519                return mService.setDeviceOwner(who, ownerName, userId);
4520            } catch (RemoteException re) {
4521                throw re.rethrowFromSystemServer();
4522            }
4523        }
4524        return false;
4525    }
4526
4527    /**
4528     * Used to determine if a particular package has been registered as a Device Owner app.
4529     * A device owner app is a special device admin that cannot be deactivated by the user, once
4530     * activated as a device admin. It also cannot be uninstalled. To check whether a particular
4531     * package is currently registered as the device owner app, pass in the package name from
4532     * {@link Context#getPackageName()} to this method.<p/>This is useful for device
4533     * admin apps that want to check whether they are also registered as the device owner app. The
4534     * exact mechanism by which a device admin app is registered as a device owner app is defined by
4535     * the setup process.
4536     * @param packageName the package name of the app, to compare with the registered device owner
4537     * app, if any.
4538     * @return whether or not the package is registered as the device owner app.
4539     */
4540    public boolean isDeviceOwnerApp(String packageName) {
4541        throwIfParentInstance("isDeviceOwnerApp");
4542        return isDeviceOwnerAppOnCallingUser(packageName);
4543    }
4544
4545    /**
4546     * @return true if a package is registered as device owner, only when it's running on the
4547     * calling user.
4548     *
4549     * <p>Same as {@link #isDeviceOwnerApp}, but bundled code should use it for clarity.
4550     * @hide
4551     */
4552    public boolean isDeviceOwnerAppOnCallingUser(String packageName) {
4553        return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ true);
4554    }
4555
4556    /**
4557     * @return true if a package is registered as device owner, even if it's running on a different
4558     * user.
4559     *
4560     * <p>Requires the MANAGE_USERS permission.
4561     *
4562     * @hide
4563     */
4564    public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
4565        return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ false);
4566    }
4567
4568    /**
4569     * @return device owner component name, only when it's running on the calling user.
4570     *
4571     * @hide
4572     */
4573    public ComponentName getDeviceOwnerComponentOnCallingUser() {
4574        return getDeviceOwnerComponentInner(/* callingUserOnly =*/ true);
4575    }
4576
4577    /**
4578     * @return device owner component name, even if it's running on a different user.
4579     *
4580     * @hide
4581     */
4582    @SystemApi
4583    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
4584    public ComponentName getDeviceOwnerComponentOnAnyUser() {
4585        return getDeviceOwnerComponentInner(/* callingUserOnly =*/ false);
4586    }
4587
4588    private boolean isDeviceOwnerAppOnAnyUserInner(String packageName, boolean callingUserOnly) {
4589        if (packageName == null) {
4590            return false;
4591        }
4592        final ComponentName deviceOwner = getDeviceOwnerComponentInner(callingUserOnly);
4593        if (deviceOwner == null) {
4594            return false;
4595        }
4596        return packageName.equals(deviceOwner.getPackageName());
4597    }
4598
4599    private ComponentName getDeviceOwnerComponentInner(boolean callingUserOnly) {
4600        if (mService != null) {
4601            try {
4602                return mService.getDeviceOwnerComponent(callingUserOnly);
4603            } catch (RemoteException re) {
4604                throw re.rethrowFromSystemServer();
4605            }
4606        }
4607        return null;
4608    }
4609
4610    /**
4611     * @return ID of the user who runs device owner, or {@link UserHandle#USER_NULL} if there's
4612     * no device owner.
4613     *
4614     * <p>Requires the MANAGE_USERS permission.
4615     *
4616     * @hide
4617     */
4618    public int getDeviceOwnerUserId() {
4619        if (mService != null) {
4620            try {
4621                return mService.getDeviceOwnerUserId();
4622            } catch (RemoteException re) {
4623                throw re.rethrowFromSystemServer();
4624            }
4625        }
4626        return UserHandle.USER_NULL;
4627    }
4628
4629    /**
4630     * Clears the current device owner. The caller must be the device owner. This function should be
4631     * used cautiously as once it is called it cannot be undone. The device owner can only be set as
4632     * a part of device setup, before it completes.
4633     * <p>
4634     * While some policies previously set by the device owner will be cleared by this method, it is
4635     * a best-effort process and some other policies will still remain in place after the device
4636     * owner is cleared.
4637     *
4638     * @param packageName The package name of the device owner.
4639     * @throws SecurityException if the caller is not in {@code packageName} or {@code packageName}
4640     *             does not own the current device owner component.
4641     *
4642     * @deprecated This method is expected to be used for testing purposes only. The device owner
4643     * will lose control of the device and its data after calling it. In order to protect any
4644     * sensitive data that remains on the device, it is advised that the device owner factory resets
4645     * the device instead of calling this method. See {@link #wipeData(int)}.
4646     */
4647    @Deprecated
4648    public void clearDeviceOwnerApp(String packageName) {
4649        throwIfParentInstance("clearDeviceOwnerApp");
4650        if (mService != null) {
4651            try {
4652                mService.clearDeviceOwner(packageName);
4653            } catch (RemoteException re) {
4654                throw re.rethrowFromSystemServer();
4655            }
4656        }
4657    }
4658
4659    /**
4660     * Returns the device owner package name, only if it's running on the calling user.
4661     *
4662     * <p>Bundled components should use {@code getDeviceOwnerComponentOnCallingUser()} for clarity.
4663     *
4664     * @hide
4665     */
4666    @SystemApi
4667    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
4668    public @Nullable String getDeviceOwner() {
4669        throwIfParentInstance("getDeviceOwner");
4670        final ComponentName name = getDeviceOwnerComponentOnCallingUser();
4671        return name != null ? name.getPackageName() : null;
4672    }
4673
4674    /**
4675     * Called by the system to find out whether the device is managed by a Device Owner.
4676     *
4677     * @return whether the device is managed by a Device Owner.
4678     * @throws SecurityException if the caller is not the device owner, does not hold the
4679     *         MANAGE_USERS permission and is not the system.
4680     *
4681     * @hide
4682     */
4683    @SystemApi
4684    @TestApi
4685    @SuppressLint("Doclava125")
4686    public boolean isDeviceManaged() {
4687        try {
4688            return mService.hasDeviceOwner();
4689        } catch (RemoteException re) {
4690            throw re.rethrowFromSystemServer();
4691        }
4692    }
4693
4694    /**
4695     * Returns the device owner name.  Note this method *will* return the device owner
4696     * name when it's running on a different user.
4697     *
4698     * @hide
4699     */
4700    @SystemApi
4701    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
4702    public String getDeviceOwnerNameOnAnyUser() {
4703        throwIfParentInstance("getDeviceOwnerNameOnAnyUser");
4704        if (mService != null) {
4705            try {
4706                return mService.getDeviceOwnerName();
4707            } catch (RemoteException re) {
4708                throw re.rethrowFromSystemServer();
4709            }
4710        }
4711        return null;
4712    }
4713
4714    /**
4715     * @hide
4716     * @deprecated Do not use
4717     * @removed
4718     */
4719    @Deprecated
4720    @SystemApi
4721    @SuppressLint("Doclava125")
4722    public @Nullable String getDeviceInitializerApp() {
4723        return null;
4724    }
4725
4726    /**
4727     * @hide
4728     * @deprecated Do not use
4729     * @removed
4730     */
4731    @Deprecated
4732    @SystemApi
4733    @SuppressLint("Doclava125")
4734    public @Nullable ComponentName getDeviceInitializerComponent() {
4735        return null;
4736    }
4737
4738    /**
4739     * @hide
4740     * @deprecated Use #ACTION_SET_PROFILE_OWNER
4741     * Sets the given component as an active admin and registers the package as the profile
4742     * owner for this user. The package must already be installed and there shouldn't be
4743     * an existing profile owner registered for this user. Also, this method must be called
4744     * before the user setup has been completed.
4745     * <p>
4746     * This method can only be called by system apps that hold MANAGE_USERS permission and
4747     * MANAGE_DEVICE_ADMINS permission.
4748     * @param admin The component to register as an active admin and profile owner.
4749     * @param ownerName The user-visible name of the entity that is managing this user.
4750     * @return whether the admin was successfully registered as the profile owner.
4751     * @throws IllegalArgumentException if packageName is null, the package isn't installed, or
4752     *         the user has already been set up.
4753     */
4754    @Deprecated
4755    @SystemApi
4756    @RequiresPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS)
4757    public boolean setActiveProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName)
4758            throws IllegalArgumentException {
4759        throwIfParentInstance("setActiveProfileOwner");
4760        if (mService != null) {
4761            try {
4762                final int myUserId = myUserId();
4763                mService.setActiveAdmin(admin, false, myUserId);
4764                return mService.setProfileOwner(admin, ownerName, myUserId);
4765            } catch (RemoteException re) {
4766                throw re.rethrowFromSystemServer();
4767            }
4768        }
4769        return false;
4770    }
4771
4772    /**
4773     * Clears the active profile owner. The caller must be the profile owner of this user, otherwise
4774     * a SecurityException will be thrown. This method is not available to managed profile owners.
4775     * <p>
4776     * While some policies previously set by the profile owner will be cleared by this method, it is
4777     * a best-effort process and some other policies will still remain in place after the profile
4778     * owner is cleared.
4779     *
4780     * @param admin The component to remove as the profile owner.
4781     * @throws SecurityException if {@code admin} is not an active profile owner, or the method is
4782     * being called from a managed profile.
4783     *
4784     * @deprecated This method is expected to be used for testing purposes only. The profile owner
4785     * will lose control of the user and its data after calling it. In order to protect any
4786     * sensitive data that remains on this user, it is advised that the profile owner deletes it
4787     * instead of calling this method. See {@link #wipeData(int)}.
4788     */
4789    @Deprecated
4790    public void clearProfileOwner(@NonNull ComponentName admin) {
4791        throwIfParentInstance("clearProfileOwner");
4792        if (mService != null) {
4793            try {
4794                mService.clearProfileOwner(admin);
4795            } catch (RemoteException re) {
4796                throw re.rethrowFromSystemServer();
4797            }
4798        }
4799    }
4800
4801    /**
4802     * @hide
4803     * Checks whether the user was already setup.
4804     */
4805    public boolean hasUserSetupCompleted() {
4806        if (mService != null) {
4807            try {
4808                return mService.hasUserSetupCompleted();
4809            } catch (RemoteException re) {
4810                throw re.rethrowFromSystemServer();
4811            }
4812        }
4813        return true;
4814    }
4815
4816    /**
4817     * @hide
4818     * Sets the given component as the profile owner of the given user profile. The package must
4819     * already be installed. There must not already be a profile owner for this user.
4820     * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call
4821     * this method.
4822     * Calling this after the setup phase of the specified user has completed is allowed only if:
4823     * - the caller is SYSTEM_UID.
4824     * - or the caller is the shell uid, and there are no accounts on the specified user.
4825     * @param admin the component name to be registered as profile owner.
4826     * @param ownerName the human readable name of the organisation associated with this DPM.
4827     * @param userHandle the userId to set the profile owner for.
4828     * @return whether the component was successfully registered as the profile owner.
4829     * @throws IllegalArgumentException if admin is null, the package isn't installed, or the
4830     * preconditions mentioned are not met.
4831     */
4832    public boolean setProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName,
4833            int userHandle) throws IllegalArgumentException {
4834        if (mService != null) {
4835            try {
4836                if (ownerName == null) {
4837                    ownerName = "";
4838                }
4839                return mService.setProfileOwner(admin, ownerName, userHandle);
4840            } catch (RemoteException re) {
4841                throw re.rethrowFromSystemServer();
4842            }
4843        }
4844        return false;
4845    }
4846
4847    /**
4848     * Sets the device owner information to be shown on the lock screen.
4849     * <p>
4850     * If the device owner information is {@code null} or empty then the device owner info is
4851     * cleared and the user owner info is shown on the lock screen if it is set.
4852     * <p>
4853     * If the device owner information contains only whitespaces then the message on the lock screen
4854     * will be blank and the user will not be allowed to change it.
4855     * <p>
4856     * If the device owner information needs to be localized, it is the responsibility of the
4857     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
4858     * and set a new version of this string accordingly.
4859     *
4860     * @param admin The name of the admin component to check.
4861     * @param info Device owner information which will be displayed instead of the user owner info.
4862     * @throws SecurityException if {@code admin} is not a device owner.
4863     */
4864    public void setDeviceOwnerLockScreenInfo(@NonNull ComponentName admin, CharSequence info) {
4865        throwIfParentInstance("setDeviceOwnerLockScreenInfo");
4866        if (mService != null) {
4867            try {
4868                mService.setDeviceOwnerLockScreenInfo(admin, info);
4869            } catch (RemoteException re) {
4870                throw re.rethrowFromSystemServer();
4871            }
4872        }
4873    }
4874
4875    /**
4876     * @return The device owner information. If it is not set returns {@code null}.
4877     */
4878    public CharSequence getDeviceOwnerLockScreenInfo() {
4879        throwIfParentInstance("getDeviceOwnerLockScreenInfo");
4880        if (mService != null) {
4881            try {
4882                return mService.getDeviceOwnerLockScreenInfo();
4883            } catch (RemoteException re) {
4884                throw re.rethrowFromSystemServer();
4885            }
4886        }
4887        return null;
4888    }
4889
4890    /**
4891     * Called by device or profile owners to suspend packages for this user. This function can be
4892     * called by a device owner, profile owner, or by a delegate given the
4893     * {@link #DELEGATION_PACKAGE_ACCESS} scope via {@link #setDelegatedScopes}.
4894     * <p>
4895     * A suspended package will not be able to start activities. Its notifications will be hidden,
4896     * it will not show up in recents, will not be able to show toasts or dialogs or ring the
4897     * device.
4898     * <p>
4899     * The package must already be installed. If the package is uninstalled while suspended the
4900     * package will no longer be suspended. The admin can block this by using
4901     * {@link #setUninstallBlocked}.
4902     *
4903     * @param admin The name of the admin component to check, or {@code null} if the caller is a
4904     *            package access delegate.
4905     * @param packageNames The package names to suspend or unsuspend.
4906     * @param suspended If set to {@code true} than the packages will be suspended, if set to
4907     *            {@code false} the packages will be unsuspended.
4908     * @return an array of package names for which the suspended status is not set as requested in
4909     *         this method.
4910     * @throws SecurityException if {@code admin} is not a device or profile owner.
4911     * @see #setDelegatedScopes
4912     * @see #DELEGATION_PACKAGE_ACCESS
4913     */
4914    public @NonNull String[] setPackagesSuspended(@NonNull ComponentName admin,
4915            @NonNull String[] packageNames, boolean suspended) {
4916        throwIfParentInstance("setPackagesSuspended");
4917        if (mService != null) {
4918            try {
4919                return mService.setPackagesSuspended(admin, mContext.getPackageName(), packageNames,
4920                        suspended);
4921            } catch (RemoteException re) {
4922                throw re.rethrowFromSystemServer();
4923            }
4924        }
4925        return packageNames;
4926    }
4927
4928    /**
4929     * Determine if a package is suspended. This function can be called by a device owner, profile
4930     * owner, or by a delegate given the {@link #DELEGATION_PACKAGE_ACCESS} scope via
4931     * {@link #setDelegatedScopes}.
4932     *
4933     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
4934     *            {@code null} if the caller is a package access delegate.
4935     * @param packageName The name of the package to retrieve the suspended status of.
4936     * @return {@code true} if the package is suspended or {@code false} if the package is not
4937     *         suspended, could not be found or an error occurred.
4938     * @throws SecurityException if {@code admin} is not a device or profile owner.
4939     * @throws NameNotFoundException if the package could not be found.
4940     * @see #setDelegatedScopes
4941     * @see #DELEGATION_PACKAGE_ACCESS
4942     */
4943    public boolean isPackageSuspended(@NonNull ComponentName admin, String packageName)
4944            throws NameNotFoundException {
4945        throwIfParentInstance("isPackageSuspended");
4946        if (mService != null) {
4947            try {
4948                return mService.isPackageSuspended(admin, mContext.getPackageName(), packageName);
4949            } catch (RemoteException e) {
4950                throw e.rethrowFromSystemServer();
4951            } catch (IllegalArgumentException ex) {
4952                throw new NameNotFoundException(packageName);
4953            }
4954        }
4955        return false;
4956    }
4957
4958    /**
4959     * Sets the enabled state of the profile. A profile should be enabled only once it is ready to
4960     * be used. Only the profile owner can call this.
4961     *
4962     * @see #isProfileOwnerApp
4963     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
4964     * @throws SecurityException if {@code admin} is not a profile owner.
4965     */
4966    public void setProfileEnabled(@NonNull ComponentName admin) {
4967        throwIfParentInstance("setProfileEnabled");
4968        if (mService != null) {
4969            try {
4970                mService.setProfileEnabled(admin);
4971            } catch (RemoteException e) {
4972                throw e.rethrowFromSystemServer();
4973            }
4974        }
4975    }
4976
4977    /**
4978     * Sets the name of the profile. In the device owner case it sets the name of the user which it
4979     * is called from. Only a profile owner or device owner can call this. If this is never called
4980     * by the profile or device owner, the name will be set to default values.
4981     *
4982     * @see #isProfileOwnerApp
4983     * @see #isDeviceOwnerApp
4984     * @param admin Which {@link DeviceAdminReceiver} this request is associate with.
4985     * @param profileName The name of the profile.
4986     * @throws SecurityException if {@code admin} is not a device or profile owner.
4987     */
4988    public void setProfileName(@NonNull ComponentName admin, String profileName) {
4989        throwIfParentInstance("setProfileName");
4990        if (mService != null) {
4991            try {
4992                mService.setProfileName(admin, profileName);
4993            } catch (RemoteException e) {
4994                throw e.rethrowFromSystemServer();
4995            }
4996        }
4997    }
4998
4999    /**
5000     * Used to determine if a particular package is registered as the profile owner for the
5001     * user. A profile owner is a special device admin that has additional privileges
5002     * within the profile.
5003     *
5004     * @param packageName The package name of the app to compare with the registered profile owner.
5005     * @return Whether or not the package is registered as the profile owner.
5006     */
5007    public boolean isProfileOwnerApp(String packageName) {
5008        throwIfParentInstance("isProfileOwnerApp");
5009        if (mService != null) {
5010            try {
5011                ComponentName profileOwner = mService.getProfileOwner(myUserId());
5012                return profileOwner != null
5013                        && profileOwner.getPackageName().equals(packageName);
5014            } catch (RemoteException re) {
5015                throw re.rethrowFromSystemServer();
5016            }
5017        }
5018        return false;
5019    }
5020
5021    /**
5022     * @hide
5023     * @return the packageName of the owner of the given user profile or {@code null} if no profile
5024     * owner has been set for that user.
5025     * @throws IllegalArgumentException if the userId is invalid.
5026     */
5027    @SystemApi
5028    public @Nullable ComponentName getProfileOwner() throws IllegalArgumentException {
5029        throwIfParentInstance("getProfileOwner");
5030        return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier());
5031    }
5032
5033    /**
5034     * @see #getProfileOwner()
5035     * @hide
5036     */
5037    public @Nullable ComponentName getProfileOwnerAsUser(final int userId)
5038            throws IllegalArgumentException {
5039        if (mService != null) {
5040            try {
5041                return mService.getProfileOwner(userId);
5042            } catch (RemoteException re) {
5043                throw re.rethrowFromSystemServer();
5044            }
5045        }
5046        return null;
5047    }
5048
5049    /**
5050     * @hide
5051     * @return the human readable name of the organisation associated with this DPM or {@code null}
5052     *         if one is not set.
5053     * @throws IllegalArgumentException if the userId is invalid.
5054     */
5055    public @Nullable String getProfileOwnerName() throws IllegalArgumentException {
5056        if (mService != null) {
5057            try {
5058                return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier());
5059            } catch (RemoteException re) {
5060                throw re.rethrowFromSystemServer();
5061            }
5062        }
5063        return null;
5064    }
5065
5066    /**
5067     * @hide
5068     * @param userId The user for whom to fetch the profile owner name, if any.
5069     * @return the human readable name of the organisation associated with this profile owner or
5070     *         null if one is not set.
5071     * @throws IllegalArgumentException if the userId is invalid.
5072     */
5073    @SystemApi
5074    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
5075    public @Nullable String getProfileOwnerNameAsUser(int userId) throws IllegalArgumentException {
5076        throwIfParentInstance("getProfileOwnerNameAsUser");
5077        if (mService != null) {
5078            try {
5079                return mService.getProfileOwnerName(userId);
5080            } catch (RemoteException re) {
5081                throw re.rethrowFromSystemServer();
5082            }
5083        }
5084        return null;
5085    }
5086
5087    /**
5088     * Called by a profile owner or device owner to add a default intent handler activity for
5089     * intents that match a certain intent filter. This activity will remain the default intent
5090     * handler even if the set of potential event handlers for the intent filter changes and if the
5091     * intent preferences are reset.
5092     * <p>
5093     * The default disambiguation mechanism takes over if the activity is not installed (anymore).
5094     * When the activity is (re)installed, it is automatically reset as default intent handler for
5095     * the filter.
5096     * <p>
5097     * The calling device admin must be a profile owner or device owner. If it is not, a security
5098     * exception will be thrown.
5099     *
5100     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5101     * @param filter The IntentFilter for which a default handler is added.
5102     * @param activity The Activity that is added as default intent handler.
5103     * @throws SecurityException if {@code admin} is not a device or profile owner.
5104     */
5105    public void addPersistentPreferredActivity(@NonNull ComponentName admin, IntentFilter filter,
5106            @NonNull ComponentName activity) {
5107        throwIfParentInstance("addPersistentPreferredActivity");
5108        if (mService != null) {
5109            try {
5110                mService.addPersistentPreferredActivity(admin, filter, activity);
5111            } catch (RemoteException e) {
5112                throw e.rethrowFromSystemServer();
5113            }
5114        }
5115    }
5116
5117    /**
5118     * Called by a profile owner or device owner to remove all persistent intent handler preferences
5119     * associated with the given package that were set by {@link #addPersistentPreferredActivity}.
5120     * <p>
5121     * The calling device admin must be a profile owner. If it is not, a security exception will be
5122     * thrown.
5123     *
5124     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5125     * @param packageName The name of the package for which preferences are removed.
5126     * @throws SecurityException if {@code admin} is not a device or profile owner.
5127     */
5128    public void clearPackagePersistentPreferredActivities(@NonNull ComponentName admin,
5129            String packageName) {
5130        throwIfParentInstance("clearPackagePersistentPreferredActivities");
5131        if (mService != null) {
5132            try {
5133                mService.clearPackagePersistentPreferredActivities(admin, packageName);
5134            } catch (RemoteException e) {
5135                throw e.rethrowFromSystemServer();
5136            }
5137        }
5138    }
5139
5140    /**
5141     * Called by a profile owner or device owner to grant permission to a package to manage
5142     * application restrictions for the calling user via {@link #setApplicationRestrictions} and
5143     * {@link #getApplicationRestrictions}.
5144     * <p>
5145     * This permission is persistent until it is later cleared by calling this method with a
5146     * {@code null} value or uninstalling the managing package.
5147     * <p>
5148     * The supplied application restriction managing package must be installed when calling this
5149     * API, otherwise an {@link NameNotFoundException} will be thrown.
5150     *
5151     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5152     * @param packageName The package name which will be given access to application restrictions
5153     *            APIs. If {@code null} is given the current package will be cleared.
5154     * @throws SecurityException if {@code admin} is not a device or profile owner.
5155     * @throws NameNotFoundException if {@code packageName} is not found
5156     *
5157     * @deprecated From {@link android.os.Build.VERSION_CODES#O}. Use {@link #setDelegatedScopes}
5158     * with the {@link #DELEGATION_APP_RESTRICTIONS} scope instead.
5159     */
5160    @Deprecated
5161    public void setApplicationRestrictionsManagingPackage(@NonNull ComponentName admin,
5162            @Nullable String packageName) throws NameNotFoundException {
5163        throwIfParentInstance("setApplicationRestrictionsManagingPackage");
5164        if (mService != null) {
5165            try {
5166                if (!mService.setApplicationRestrictionsManagingPackage(admin, packageName)) {
5167                    throw new NameNotFoundException(packageName);
5168                }
5169            } catch (RemoteException e) {
5170                throw e.rethrowFromSystemServer();
5171            }
5172        }
5173    }
5174
5175    /**
5176     * Called by a profile owner or device owner to retrieve the application restrictions managing
5177     * package for the current user, or {@code null} if none is set. If there are multiple
5178     * delegates this function will return one of them.
5179     *
5180     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5181     * @return The package name allowed to manage application restrictions on the current user, or
5182     *         {@code null} if none is set.
5183     * @throws SecurityException if {@code admin} is not a device or profile owner.
5184     *
5185     * @deprecated From {@link android.os.Build.VERSION_CODES#O}. Use {@link #getDelegatePackages}
5186     * with the {@link #DELEGATION_APP_RESTRICTIONS} scope instead.
5187     */
5188    @Deprecated
5189    @Nullable
5190    public String getApplicationRestrictionsManagingPackage(
5191            @NonNull ComponentName admin) {
5192        throwIfParentInstance("getApplicationRestrictionsManagingPackage");
5193        if (mService != null) {
5194            try {
5195                return mService.getApplicationRestrictionsManagingPackage(admin);
5196            } catch (RemoteException e) {
5197                throw e.rethrowFromSystemServer();
5198            }
5199        }
5200        return null;
5201    }
5202
5203    /**
5204     * Called by any application to find out whether it has been granted permission via
5205     * {@link #setApplicationRestrictionsManagingPackage} to manage application restrictions
5206     * for the calling user.
5207     *
5208     * <p>This is done by comparing the calling Linux uid with the uid of the package specified by
5209     * that method.
5210     *
5211     * @deprecated From {@link android.os.Build.VERSION_CODES#O}. Use {@link #getDelegatedScopes}
5212     * instead.
5213     */
5214    @Deprecated
5215    public boolean isCallerApplicationRestrictionsManagingPackage() {
5216        throwIfParentInstance("isCallerApplicationRestrictionsManagingPackage");
5217        if (mService != null) {
5218            try {
5219                return mService.isCallerApplicationRestrictionsManagingPackage(
5220                        mContext.getPackageName());
5221            } catch (RemoteException e) {
5222                throw e.rethrowFromSystemServer();
5223            }
5224        }
5225        return false;
5226    }
5227
5228    /**
5229     * Sets the application restrictions for a given target application running in the calling user.
5230     * <p>
5231     * The caller must be a profile or device owner on that user, or the package allowed to manage
5232     * application restrictions via {@link #setDelegatedScopes} with the
5233     * {@link #DELEGATION_APP_RESTRICTIONS} scope; otherwise a security exception will be thrown.
5234     * <p>
5235     * The provided {@link Bundle} consists of key-value pairs, where the types of values may be:
5236     * <ul>
5237     * <li>{@code boolean}
5238     * <li>{@code int}
5239     * <li>{@code String} or {@code String[]}
5240     * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]}
5241     * </ul>
5242     * <p>
5243     * If the restrictions are not available yet, but may be applied in the near future, the caller
5244     * can notify the target application of that by adding
5245     * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter.
5246     * <p>
5247     * The application restrictions are only made visible to the target application via
5248     * {@link UserManager#getApplicationRestrictions(String)}, in addition to the profile or device
5249     * owner, and the application restrictions managing package via
5250     * {@link #getApplicationRestrictions}.
5251     *
5252     * <p>NOTE: The method performs disk I/O and shouldn't be called on the main thread
5253     *
5254     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
5255     *            {@code null} if called by the application restrictions managing package.
5256     * @param packageName The name of the package to update restricted settings for.
5257     * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new
5258     *            set of active restrictions.
5259     * @throws SecurityException if {@code admin} is not a device or profile owner.
5260     * @see #setDelegatedScopes
5261     * @see #DELEGATION_APP_RESTRICTIONS
5262     * @see UserManager#KEY_RESTRICTIONS_PENDING
5263     */
5264    @WorkerThread
5265    public void setApplicationRestrictions(@Nullable ComponentName admin, String packageName,
5266            Bundle settings) {
5267        throwIfParentInstance("setApplicationRestrictions");
5268        if (mService != null) {
5269            try {
5270                mService.setApplicationRestrictions(admin, mContext.getPackageName(), packageName,
5271                        settings);
5272            } catch (RemoteException e) {
5273                throw e.rethrowFromSystemServer();
5274            }
5275        }
5276    }
5277
5278    /**
5279     * Sets a list of configuration features to enable for a TrustAgent component. This is meant to
5280     * be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all trust
5281     * agents but those enabled by this function call. If flag
5282     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is not set, then this call has no effect.
5283     * <p>
5284     * The calling device admin must have requested
5285     * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method;
5286     * if not, a security exception will be thrown.
5287     * <p>
5288     * This method can be called on the {@link DevicePolicyManager} instance returned by
5289     * {@link #getParentProfileInstance(ComponentName)} in order to set the configuration for
5290     * the parent profile.
5291     *
5292     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5293     * @param target Component name of the agent to be enabled.
5294     * @param configuration TrustAgent-specific feature bundle. If null for any admin, agent will be
5295     *            strictly disabled according to the state of the
5296     *            {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag.
5297     *            <p>
5298     *            If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all
5299     *            admins, then it's up to the TrustAgent itself to aggregate the values from all
5300     *            device admins.
5301     *            <p>
5302     *            Consult documentation for the specific TrustAgent to determine legal options
5303     *            parameters.
5304     * @throws SecurityException if {@code admin} is not an active administrator or does not use
5305     *             {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES}
5306     */
5307    public void setTrustAgentConfiguration(@NonNull ComponentName admin,
5308            @NonNull ComponentName target, PersistableBundle configuration) {
5309        if (mService != null) {
5310            try {
5311                mService.setTrustAgentConfiguration(admin, target, configuration, mParentInstance);
5312            } catch (RemoteException e) {
5313                throw e.rethrowFromSystemServer();
5314            }
5315        }
5316    }
5317
5318    /**
5319     * Gets configuration for the given trust agent based on aggregating all calls to
5320     * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)} for
5321     * all device admins.
5322     * <p>
5323     * This method can be called on the {@link DevicePolicyManager} instance returned by
5324     * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the configuration set
5325     * on the parent profile.
5326     *
5327     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null,
5328     * this function returns a list of configurations for all admins that declare
5329     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. If any admin declares
5330     * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} but doesn't call
5331     * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)}
5332     * for this {@param agent} or calls it with a null configuration, null is returned.
5333     * @param agent Which component to get enabled features for.
5334     * @return configuration for the given trust agent.
5335     */
5336    public @Nullable List<PersistableBundle> getTrustAgentConfiguration(
5337            @Nullable ComponentName admin, @NonNull ComponentName agent) {
5338        return getTrustAgentConfiguration(admin, agent, myUserId());
5339    }
5340
5341    /** @hide per-user version */
5342    public @Nullable List<PersistableBundle> getTrustAgentConfiguration(
5343            @Nullable ComponentName admin, @NonNull ComponentName agent, int userHandle) {
5344        if (mService != null) {
5345            try {
5346                return mService.getTrustAgentConfiguration(admin, agent, userHandle,
5347                        mParentInstance);
5348            } catch (RemoteException e) {
5349                throw e.rethrowFromSystemServer();
5350            }
5351        }
5352        return new ArrayList<PersistableBundle>(); // empty list
5353    }
5354
5355    /**
5356     * Called by a profile owner of a managed profile to set whether caller-Id information from the
5357     * managed profile will be shown in the parent profile, for incoming calls.
5358     * <p>
5359     * The calling device admin must be a profile owner. If it is not, a security exception will be
5360     * thrown.
5361     *
5362     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5363     * @param disabled If true caller-Id information in the managed profile is not displayed.
5364     * @throws SecurityException if {@code admin} is not a device or profile owner.
5365     */
5366    public void setCrossProfileCallerIdDisabled(@NonNull ComponentName admin, boolean disabled) {
5367        throwIfParentInstance("setCrossProfileCallerIdDisabled");
5368        if (mService != null) {
5369            try {
5370                mService.setCrossProfileCallerIdDisabled(admin, disabled);
5371            } catch (RemoteException e) {
5372                throw e.rethrowFromSystemServer();
5373            }
5374        }
5375    }
5376
5377    /**
5378     * Called by a profile owner of a managed profile to determine whether or not caller-Id
5379     * information has been disabled.
5380     * <p>
5381     * The calling device admin must be a profile owner. If it is not, a security exception will be
5382     * thrown.
5383     *
5384     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5385     * @throws SecurityException if {@code admin} is not a device or profile owner.
5386     */
5387    public boolean getCrossProfileCallerIdDisabled(@NonNull ComponentName admin) {
5388        throwIfParentInstance("getCrossProfileCallerIdDisabled");
5389        if (mService != null) {
5390            try {
5391                return mService.getCrossProfileCallerIdDisabled(admin);
5392            } catch (RemoteException e) {
5393                throw e.rethrowFromSystemServer();
5394            }
5395        }
5396        return false;
5397    }
5398
5399    /**
5400     * Determine whether or not caller-Id information has been disabled.
5401     *
5402     * @param userHandle The user for whom to check the caller-id permission
5403     * @hide
5404     */
5405    public boolean getCrossProfileCallerIdDisabled(UserHandle userHandle) {
5406        if (mService != null) {
5407            try {
5408                return mService.getCrossProfileCallerIdDisabledForUser(userHandle.getIdentifier());
5409            } catch (RemoteException e) {
5410                throw e.rethrowFromSystemServer();
5411            }
5412        }
5413        return false;
5414    }
5415
5416    /**
5417     * Called by a profile owner of a managed profile to set whether contacts search from the
5418     * managed profile will be shown in the parent profile, for incoming calls.
5419     * <p>
5420     * The calling device admin must be a profile owner. If it is not, a security exception will be
5421     * thrown.
5422     *
5423     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5424     * @param disabled If true contacts search in the managed profile is not displayed.
5425     * @throws SecurityException if {@code admin} is not a device or profile owner.
5426     */
5427    public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin,
5428            boolean disabled) {
5429        throwIfParentInstance("setCrossProfileContactsSearchDisabled");
5430        if (mService != null) {
5431            try {
5432                mService.setCrossProfileContactsSearchDisabled(admin, disabled);
5433            } catch (RemoteException e) {
5434                throw e.rethrowFromSystemServer();
5435            }
5436        }
5437    }
5438
5439    /**
5440     * Called by a profile owner of a managed profile to determine whether or not contacts search
5441     * has been disabled.
5442     * <p>
5443     * The calling device admin must be a profile owner. If it is not, a security exception will be
5444     * thrown.
5445     *
5446     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5447     * @throws SecurityException if {@code admin} is not a device or profile owner.
5448     */
5449    public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) {
5450        throwIfParentInstance("getCrossProfileContactsSearchDisabled");
5451        if (mService != null) {
5452            try {
5453                return mService.getCrossProfileContactsSearchDisabled(admin);
5454            } catch (RemoteException e) {
5455                throw e.rethrowFromSystemServer();
5456            }
5457        }
5458        return false;
5459    }
5460
5461
5462    /**
5463     * Determine whether or not contacts search has been disabled.
5464     *
5465     * @param userHandle The user for whom to check the contacts search permission
5466     * @hide
5467     */
5468    public boolean getCrossProfileContactsSearchDisabled(@NonNull UserHandle userHandle) {
5469        if (mService != null) {
5470            try {
5471                return mService
5472                        .getCrossProfileContactsSearchDisabledForUser(userHandle.getIdentifier());
5473            } catch (RemoteException e) {
5474                throw e.rethrowFromSystemServer();
5475            }
5476        }
5477        return false;
5478    }
5479
5480    /**
5481     * Start Quick Contact on the managed profile for the user, if the policy allows.
5482     *
5483     * @hide
5484     */
5485    public void startManagedQuickContact(String actualLookupKey, long actualContactId,
5486            boolean isContactIdIgnored, long directoryId, Intent originalIntent) {
5487        if (mService != null) {
5488            try {
5489                mService.startManagedQuickContact(actualLookupKey, actualContactId,
5490                        isContactIdIgnored, directoryId, originalIntent);
5491            } catch (RemoteException e) {
5492                throw e.rethrowFromSystemServer();
5493            }
5494        }
5495    }
5496
5497    /**
5498     * Start Quick Contact on the managed profile for the user, if the policy allows.
5499     * @hide
5500     */
5501    public void startManagedQuickContact(String actualLookupKey, long actualContactId,
5502            Intent originalIntent) {
5503        startManagedQuickContact(actualLookupKey, actualContactId, false, Directory.DEFAULT,
5504                originalIntent);
5505    }
5506
5507    /**
5508     * Called by a profile owner of a managed profile to set whether bluetooth devices can access
5509     * enterprise contacts.
5510     * <p>
5511     * The calling device admin must be a profile owner. If it is not, a security exception will be
5512     * thrown.
5513     * <p>
5514     * This API works on managed profile only.
5515     *
5516     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5517     * @param disabled If true, bluetooth devices cannot access enterprise contacts.
5518     * @throws SecurityException if {@code admin} is not a device or profile owner.
5519     */
5520    public void setBluetoothContactSharingDisabled(@NonNull ComponentName admin, boolean disabled) {
5521        throwIfParentInstance("setBluetoothContactSharingDisabled");
5522        if (mService != null) {
5523            try {
5524                mService.setBluetoothContactSharingDisabled(admin, disabled);
5525            } catch (RemoteException e) {
5526                throw e.rethrowFromSystemServer();
5527            }
5528        }
5529    }
5530
5531    /**
5532     * Called by a profile owner of a managed profile to determine whether or not Bluetooth devices
5533     * cannot access enterprise contacts.
5534     * <p>
5535     * The calling device admin must be a profile owner. If it is not, a security exception will be
5536     * thrown.
5537     * <p>
5538     * This API works on managed profile only.
5539     *
5540     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5541     * @throws SecurityException if {@code admin} is not a device or profile owner.
5542     */
5543    public boolean getBluetoothContactSharingDisabled(@NonNull ComponentName admin) {
5544        throwIfParentInstance("getBluetoothContactSharingDisabled");
5545        if (mService != null) {
5546            try {
5547                return mService.getBluetoothContactSharingDisabled(admin);
5548            } catch (RemoteException e) {
5549                throw e.rethrowFromSystemServer();
5550            }
5551        }
5552        return true;
5553    }
5554
5555    /**
5556     * Determine whether or not Bluetooth devices cannot access contacts.
5557     * <p>
5558     * This API works on managed profile UserHandle only.
5559     *
5560     * @param userHandle The user for whom to check the caller-id permission
5561     * @hide
5562     */
5563    public boolean getBluetoothContactSharingDisabled(UserHandle userHandle) {
5564        if (mService != null) {
5565            try {
5566                return mService.getBluetoothContactSharingDisabledForUser(userHandle
5567                        .getIdentifier());
5568            } catch (RemoteException e) {
5569                throw e.rethrowFromSystemServer();
5570            }
5571        }
5572        return true;
5573    }
5574
5575    /**
5576     * Called by the profile owner of a managed profile so that some intents sent in the managed
5577     * profile can also be resolved in the parent, or vice versa. Only activity intents are
5578     * supported.
5579     *
5580     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5581     * @param filter The {@link IntentFilter} the intent has to match to be also resolved in the
5582     *            other profile
5583     * @param flags {@link DevicePolicyManager#FLAG_MANAGED_CAN_ACCESS_PARENT} and
5584     *            {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported.
5585     * @throws SecurityException if {@code admin} is not a device or profile owner.
5586     */
5587    public void addCrossProfileIntentFilter(@NonNull ComponentName admin, IntentFilter filter, int flags) {
5588        throwIfParentInstance("addCrossProfileIntentFilter");
5589        if (mService != null) {
5590            try {
5591                mService.addCrossProfileIntentFilter(admin, filter, flags);
5592            } catch (RemoteException e) {
5593                throw e.rethrowFromSystemServer();
5594            }
5595        }
5596    }
5597
5598    /**
5599     * Called by a profile owner of a managed profile to remove the cross-profile intent filters
5600     * that go from the managed profile to the parent, or from the parent to the managed profile.
5601     * Only removes those that have been set by the profile owner.
5602     *
5603     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5604     * @throws SecurityException if {@code admin} is not a device or profile owner.
5605     */
5606    public void clearCrossProfileIntentFilters(@NonNull ComponentName admin) {
5607        throwIfParentInstance("clearCrossProfileIntentFilters");
5608        if (mService != null) {
5609            try {
5610                mService.clearCrossProfileIntentFilters(admin);
5611            } catch (RemoteException e) {
5612                throw e.rethrowFromSystemServer();
5613            }
5614        }
5615    }
5616
5617    /**
5618     * Called by a profile or device owner to set the permitted accessibility services. When set by
5619     * a device owner or profile owner the restriction applies to all profiles of the user the
5620     * device owner or profile owner is an admin for. By default the user can use any accessiblity
5621     * service. When zero or more packages have been added, accessiblity services that are not in
5622     * the list and not part of the system can not be enabled by the user.
5623     * <p>
5624     * Calling with a null value for the list disables the restriction so that all services can be
5625     * used, calling with an empty list only allows the builtin system's services.
5626     * <p>
5627     * System accessibility services are always available to the user the list can't modify this.
5628     *
5629     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5630     * @param packageNames List of accessibility service package names.
5631     * @return true if setting the restriction succeeded. It fail if there is one or more non-system
5632     *         accessibility services enabled, that are not in the list.
5633     * @throws SecurityException if {@code admin} is not a device or profile owner.
5634     */
5635    public boolean setPermittedAccessibilityServices(@NonNull ComponentName admin,
5636            List<String> packageNames) {
5637        throwIfParentInstance("setPermittedAccessibilityServices");
5638        if (mService != null) {
5639            try {
5640                return mService.setPermittedAccessibilityServices(admin, packageNames);
5641            } catch (RemoteException e) {
5642                throw e.rethrowFromSystemServer();
5643            }
5644        }
5645        return false;
5646    }
5647
5648    /**
5649     * Returns the list of permitted accessibility services set by this device or profile owner.
5650     * <p>
5651     * An empty list means no accessibility services except system services are allowed. Null means
5652     * all accessibility services are allowed.
5653     *
5654     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5655     * @return List of accessiblity service package names.
5656     * @throws SecurityException if {@code admin} is not a device or profile owner.
5657     */
5658    public @Nullable List<String> getPermittedAccessibilityServices(@NonNull ComponentName admin) {
5659        throwIfParentInstance("getPermittedAccessibilityServices");
5660        if (mService != null) {
5661            try {
5662                return mService.getPermittedAccessibilityServices(admin);
5663            } catch (RemoteException e) {
5664                throw e.rethrowFromSystemServer();
5665            }
5666        }
5667        return null;
5668    }
5669
5670    /**
5671     * Called by the system to check if a specific accessibility service is disabled by admin.
5672     *
5673     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5674     * @param packageName Accessibility service package name that needs to be checked.
5675     * @param userHandle user id the admin is running as.
5676     * @return true if the accessibility service is permitted, otherwise false.
5677     *
5678     * @hide
5679     */
5680    public boolean isAccessibilityServicePermittedByAdmin(@NonNull ComponentName admin,
5681            @NonNull String packageName, int userHandle) {
5682        if (mService != null) {
5683            try {
5684                return mService.isAccessibilityServicePermittedByAdmin(admin, packageName,
5685                        userHandle);
5686            } catch (RemoteException e) {
5687                throw e.rethrowFromSystemServer();
5688            }
5689        }
5690        return false;
5691    }
5692
5693    /**
5694     * Returns the list of accessibility services permitted by the device or profiles
5695     * owners of this user.
5696     *
5697     * <p>Null means all accessibility services are allowed, if a non-null list is returned
5698     * it will contain the intersection of the permitted lists for any device or profile
5699     * owners that apply to this user. It will also include any system accessibility services.
5700     *
5701     * @param userId which user to check for.
5702     * @return List of accessiblity service package names.
5703     * @hide
5704     */
5705     @SystemApi
5706     public @Nullable List<String> getPermittedAccessibilityServices(int userId) {
5707        throwIfParentInstance("getPermittedAccessibilityServices");
5708        if (mService != null) {
5709            try {
5710                return mService.getPermittedAccessibilityServicesForUser(userId);
5711            } catch (RemoteException e) {
5712                throw e.rethrowFromSystemServer();
5713            }
5714        }
5715        return null;
5716     }
5717
5718    /**
5719     * Called by a profile or device owner to set the permitted input methods services. When set by
5720     * a device owner or profile owner the restriction applies to all profiles of the user the
5721     * device owner or profile owner is an admin for. By default the user can use any input method.
5722     * When zero or more packages have been added, input method that are not in the list and not
5723     * part of the system can not be enabled by the user. This method will fail if it is called for
5724     * a admin that is not for the foreground user or a profile of the foreground user.
5725     * <p>
5726     * Calling with a null value for the list disables the restriction so that all input methods can
5727     * be used, calling with an empty list disables all but the system's own input methods.
5728     * <p>
5729     * System input methods are always available to the user this method can't modify this.
5730     *
5731     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5732     * @param packageNames List of input method package names.
5733     * @return true if setting the restriction succeeded. It will fail if there are one or more
5734     *         non-system input methods currently enabled that are not in the packageNames list.
5735     * @throws SecurityException if {@code admin} is not a device or profile owner.
5736     */
5737    public boolean setPermittedInputMethods(
5738            @NonNull ComponentName admin, List<String> packageNames) {
5739        throwIfParentInstance("setPermittedInputMethods");
5740        if (mService != null) {
5741            try {
5742                return mService.setPermittedInputMethods(admin, packageNames);
5743            } catch (RemoteException e) {
5744                throw e.rethrowFromSystemServer();
5745            }
5746        }
5747        return false;
5748    }
5749
5750
5751    /**
5752     * Returns the list of permitted input methods set by this device or profile owner.
5753     * <p>
5754     * An empty list means no input methods except system input methods are allowed. Null means all
5755     * input methods are allowed.
5756     *
5757     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5758     * @return List of input method package names.
5759     * @throws SecurityException if {@code admin} is not a device or profile owner.
5760     */
5761    public @Nullable List<String> getPermittedInputMethods(@NonNull ComponentName admin) {
5762        throwIfParentInstance("getPermittedInputMethods");
5763        if (mService != null) {
5764            try {
5765                return mService.getPermittedInputMethods(admin);
5766            } catch (RemoteException e) {
5767                throw e.rethrowFromSystemServer();
5768            }
5769        }
5770        return null;
5771    }
5772
5773    /**
5774     * Called by the system to check if a specific input method is disabled by admin.
5775     *
5776     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5777     * @param packageName Input method package name that needs to be checked.
5778     * @param userHandle user id the admin is running as.
5779     * @return true if the input method is permitted, otherwise false.
5780     *
5781     * @hide
5782     */
5783    public boolean isInputMethodPermittedByAdmin(@NonNull ComponentName admin,
5784            @NonNull String packageName, int userHandle) {
5785        if (mService != null) {
5786            try {
5787                return mService.isInputMethodPermittedByAdmin(admin, packageName, userHandle);
5788            } catch (RemoteException e) {
5789                throw e.rethrowFromSystemServer();
5790            }
5791        }
5792        return false;
5793    }
5794
5795    /**
5796     * Returns the list of input methods permitted by the device or profiles
5797     * owners of the current user.  (*Not* calling user, due to a limitation in InputMethodManager.)
5798     *
5799     * <p>Null means all input methods are allowed, if a non-null list is returned
5800     * it will contain the intersection of the permitted lists for any device or profile
5801     * owners that apply to this user. It will also include any system input methods.
5802     *
5803     * @return List of input method package names.
5804     * @hide
5805     */
5806    @SystemApi
5807    public @Nullable List<String> getPermittedInputMethodsForCurrentUser() {
5808        throwIfParentInstance("getPermittedInputMethodsForCurrentUser");
5809        if (mService != null) {
5810            try {
5811                return mService.getPermittedInputMethodsForCurrentUser();
5812            } catch (RemoteException e) {
5813                throw e.rethrowFromSystemServer();
5814            }
5815        }
5816        return null;
5817    }
5818
5819    /**
5820     * Called by a profile owner of a managed profile to set the packages that are allowed to use
5821     * a {@link android.service.notification.NotificationListenerService} in the primary user to
5822     * see notifications from the managed profile. By default all packages are permitted by this
5823     * policy. When zero or more packages have been added, notification listeners installed on the
5824     * primary user that are not in the list and are not part of the system won't receive events
5825     * for managed profile notifications.
5826     * <p>
5827     * Calling with a {@code null} value for the list disables the restriction so that all
5828     * notification listener services be used. Calling with an empty list disables all but the
5829     * system's own notification listeners. System notification listener services are always
5830     * available to the user.
5831     * <p>
5832     * If a device or profile owner want to stop notification listeners in their user from seeing
5833     * that user's notifications they should prevent that service from running instead (e.g. via
5834     * {@link #setApplicationHidden(ComponentName, String, boolean)})
5835     *
5836     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5837     * @param packageList List of package names to whitelist
5838     * @return true if setting the restriction succeeded. It will fail if called outside a managed
5839     * profile
5840     * @throws SecurityException if {@code admin} is not a profile owner.
5841     *
5842     * @see android.service.notification.NotificationListenerService
5843     */
5844    public boolean setPermittedCrossProfileNotificationListeners(
5845            @NonNull ComponentName admin, @Nullable List<String> packageList) {
5846        throwIfParentInstance("setPermittedCrossProfileNotificationListeners");
5847        if (mService != null) {
5848            try {
5849                return mService.setPermittedCrossProfileNotificationListeners(admin, packageList);
5850            } catch (RemoteException e) {
5851                throw e.rethrowFromSystemServer();
5852            }
5853        }
5854        return false;
5855    }
5856
5857    /**
5858     * Returns the list of packages installed on the primary user that allowed to use a
5859     * {@link android.service.notification.NotificationListenerService} to receive
5860     * notifications from this managed profile, as set by the profile owner.
5861     * <p>
5862     * An empty list means no notification listener services except system ones are allowed.
5863     * A {@code null} return value indicates that all notification listeners are allowed.
5864     */
5865    public @Nullable List<String> getPermittedCrossProfileNotificationListeners(
5866            @NonNull ComponentName admin) {
5867        throwIfParentInstance("getPermittedCrossProfileNotificationListeners");
5868        if (mService != null) {
5869            try {
5870                return mService.getPermittedCrossProfileNotificationListeners(admin);
5871            } catch (RemoteException e) {
5872                throw e.rethrowFromSystemServer();
5873            }
5874        }
5875        return null;
5876    }
5877
5878    /**
5879     * Returns true if {@code NotificationListenerServices} from the given package are allowed to
5880     * receive events for notifications from the given user id. Can only be called by the system uid
5881     *
5882     * @see #setPermittedCrossProfileNotificationListeners(ComponentName, List)
5883     *
5884     * @hide
5885     */
5886    public boolean isNotificationListenerServicePermitted(
5887            @NonNull String packageName, @UserIdInt int userId) {
5888        if (mService != null) {
5889            try {
5890                return mService.isNotificationListenerServicePermitted(packageName, userId);
5891            } catch (RemoteException e) {
5892                throw e.rethrowFromSystemServer();
5893            }
5894        }
5895        return true;
5896    }
5897
5898    /**
5899     * Get the list of apps to keep around as APKs even if no user has currently installed it. This
5900     * function can be called by a device owner or by a delegate given the
5901     * {@link #DELEGATION_KEEP_UNINSTALLED_PACKAGES} scope via {@link #setDelegatedScopes}.
5902     * <p>
5903     * Please note that packages returned in this method are not automatically pre-cached.
5904     *
5905     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
5906     *            {@code null} if the caller is a keep uninstalled packages delegate.
5907     * @return List of package names to keep cached.
5908     * @see #setDelegatedScopes
5909     * @see #DELEGATION_KEEP_UNINSTALLED_PACKAGES
5910     * @hide
5911     */
5912    public @Nullable List<String> getKeepUninstalledPackages(@Nullable ComponentName admin) {
5913        throwIfParentInstance("getKeepUninstalledPackages");
5914        if (mService != null) {
5915            try {
5916                return mService.getKeepUninstalledPackages(admin, mContext.getPackageName());
5917            } catch (RemoteException e) {
5918                throw e.rethrowFromSystemServer();
5919            }
5920        }
5921        return null;
5922    }
5923
5924    /**
5925     * Set a list of apps to keep around as APKs even if no user has currently installed it. This
5926     * function can be called by a device owner or by a delegate given the
5927     * {@link #DELEGATION_KEEP_UNINSTALLED_PACKAGES} scope via {@link #setDelegatedScopes}.
5928     *
5929     * <p>Please note that setting this policy does not imply that specified apps will be
5930     * automatically pre-cached.</p>
5931     *
5932     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
5933     *            {@code null} if the caller is a keep uninstalled packages delegate.
5934     * @param packageNames List of package names to keep cached.
5935     * @throws SecurityException if {@code admin} is not a device owner.
5936     * @see #setDelegatedScopes
5937     * @see #DELEGATION_KEEP_UNINSTALLED_PACKAGES
5938     * @hide
5939     */
5940    public void setKeepUninstalledPackages(@Nullable ComponentName admin,
5941            @NonNull List<String> packageNames) {
5942        throwIfParentInstance("setKeepUninstalledPackages");
5943        if (mService != null) {
5944            try {
5945                mService.setKeepUninstalledPackages(admin, mContext.getPackageName(), packageNames);
5946            } catch (RemoteException e) {
5947                throw e.rethrowFromSystemServer();
5948            }
5949        }
5950    }
5951
5952    /**
5953     * Called by a device owner to create a user with the specified name. The UserHandle returned
5954     * by this method should not be persisted as user handles are recycled as users are removed and
5955     * created. If you need to persist an identifier for this user, use
5956     * {@link UserManager#getSerialNumberForUser}.
5957     *
5958     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5959     * @param name the user's name
5960     * @see UserHandle
5961     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
5962     *         user could not be created.
5963     *
5964     * @deprecated From {@link android.os.Build.VERSION_CODES#M}
5965     * @removed From {@link android.os.Build.VERSION_CODES#N}
5966     */
5967    @Deprecated
5968    public @Nullable UserHandle createUser(@NonNull ComponentName admin, String name) {
5969        return null;
5970    }
5971
5972    /**
5973     * Called by a device owner to create a user with the specified name. The UserHandle returned
5974     * by this method should not be persisted as user handles are recycled as users are removed and
5975     * created. If you need to persist an identifier for this user, use
5976     * {@link UserManager#getSerialNumberForUser}.  The new user will be started in the background
5977     * immediately.
5978     *
5979     * <p> profileOwnerComponent is the {@link DeviceAdminReceiver} to be the profile owner as well
5980     * as registered as an active admin on the new user.  The profile owner package will be
5981     * installed on the new user if it already is installed on the device.
5982     *
5983     * <p>If the optionalInitializeData is not null, then the extras will be passed to the
5984     * profileOwnerComponent when onEnable is called.
5985     *
5986     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
5987     * @param name the user's name
5988     * @param ownerName the human readable name of the organisation associated with this DPM.
5989     * @param profileOwnerComponent The {@link DeviceAdminReceiver} that will be an active admin on
5990     *      the user.
5991     * @param adminExtras Extras that will be passed to onEnable of the admin receiver
5992     *      on the new user.
5993     * @see UserHandle
5994     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
5995     *         user could not be created.
5996     *
5997     * @deprecated From {@link android.os.Build.VERSION_CODES#M}
5998     * @removed From {@link android.os.Build.VERSION_CODES#N}
5999     */
6000    @Deprecated
6001    public @Nullable UserHandle createAndInitializeUser(@NonNull ComponentName admin, String name,
6002            String ownerName, @NonNull ComponentName profileOwnerComponent, Bundle adminExtras) {
6003        return null;
6004    }
6005
6006    /**
6007      * Flag used by {@link #createAndManageUser} to skip setup wizard after creating a new user.
6008      */
6009    public static final int SKIP_SETUP_WIZARD = 0x0001;
6010
6011    /**
6012     * Flag used by {@link #createAndManageUser} to specify that the user should be created
6013     * ephemeral.
6014     * @hide
6015     */
6016    public static final int MAKE_USER_EPHEMERAL = 0x0002;
6017
6018    /**
6019     * Flag used by {@link #createAndManageUser} to specify that the user should be created as a
6020     * demo user.
6021     * @hide
6022     */
6023    public static final int MAKE_USER_DEMO = 0x0004;
6024
6025    /**
6026     * Flag used by {@link #createAndManageUser} to specificy that the newly created user should be
6027     * started in the background as part of the user creation.
6028     */
6029    // TODO: Investigate solutions for the case where reboot happens before setup is completed.
6030    public static final int START_USER_IN_BACKGROUND = 0x0008;
6031
6032    /**
6033     * @hide
6034     */
6035    @IntDef(
6036            flag = true,
6037            prefix = {"SKIP_", "MAKE_USER_", "START_"},
6038            value = {SKIP_SETUP_WIZARD, MAKE_USER_EPHEMERAL, MAKE_USER_DEMO,
6039                    START_USER_IN_BACKGROUND}
6040    )
6041    @Retention(RetentionPolicy.SOURCE)
6042    public @interface CreateAndManageUserFlags {}
6043
6044
6045    /**
6046     * Called by a device owner to create a user with the specified name and a given component of
6047     * the calling package as profile owner. The UserHandle returned by this method should not be
6048     * persisted as user handles are recycled as users are removed and created. If you need to
6049     * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new
6050     * user will not be started in the background.
6051     * <p>
6052     * admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also a
6053     * DeviceAdminReceiver in the same package as admin, and will become the profile owner and will
6054     * be registered as an active admin on the new user. The profile owner package will be installed
6055     * on the new user.
6056     * <p>
6057     * If the adminExtras are not null, they will be stored on the device until the user is started
6058     * for the first time. Then the extras will be passed to the admin when onEnable is called.
6059     *
6060     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6061     * @param name The user's name.
6062     * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the
6063     *            same package as admin, otherwise no user is created and an
6064     *            IllegalArgumentException is thrown.
6065     * @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new
6066     *            user.
6067     * @param flags {@link #SKIP_SETUP_WIZARD} is supported.
6068     * @see UserHandle
6069     * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
6070     *         user could not be created.
6071     * @throws SecurityException if {@code admin} is not a device owner.
6072     */
6073    public @Nullable UserHandle createAndManageUser(@NonNull ComponentName admin,
6074            @NonNull String name,
6075            @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras,
6076            @CreateAndManageUserFlags int flags) {
6077        throwIfParentInstance("createAndManageUser");
6078        try {
6079            return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags);
6080        } catch (RemoteException re) {
6081            throw re.rethrowFromSystemServer();
6082        }
6083    }
6084
6085    /**
6086     * Called by a device owner to remove a user and all associated data. The primary user can not
6087     * be removed.
6088     *
6089     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6090     * @param userHandle the user to remove.
6091     * @return {@code true} if the user was removed, {@code false} otherwise.
6092     * @throws SecurityException if {@code admin} is not a device owner.
6093     */
6094    public boolean removeUser(@NonNull ComponentName admin, UserHandle userHandle) {
6095        throwIfParentInstance("removeUser");
6096        try {
6097            return mService.removeUser(admin, userHandle);
6098        } catch (RemoteException re) {
6099            throw re.rethrowFromSystemServer();
6100        }
6101    }
6102
6103    /**
6104     * Called by a device owner to switch the specified user to the foreground.
6105     *
6106     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6107     * @param userHandle the user to switch to; null will switch to primary.
6108     * @return {@code true} if the switch was successful, {@code false} otherwise.
6109     * @throws SecurityException if {@code admin} is not a device owner.
6110     * @see Intent#ACTION_USER_FOREGROUND
6111     */
6112    public boolean switchUser(@NonNull ComponentName admin, @Nullable UserHandle userHandle) {
6113        throwIfParentInstance("switchUser");
6114        try {
6115            return mService.switchUser(admin, userHandle);
6116        } catch (RemoteException re) {
6117            throw re.rethrowFromSystemServer();
6118        }
6119    }
6120
6121    /**
6122     * Retrieves the application restrictions for a given target application running in the calling
6123     * user.
6124     * <p>
6125     * The caller must be a profile or device owner on that user, or the package allowed to manage
6126     * application restrictions via {@link #setDelegatedScopes} with the
6127     * {@link #DELEGATION_APP_RESTRICTIONS} scope; otherwise a security exception will be thrown.
6128     *
6129     * <p>NOTE: The method performs disk I/O and shouldn't be called on the main thread
6130     *
6131     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6132     *            {@code null} if called by the application restrictions managing package.
6133     * @param packageName The name of the package to fetch restricted settings of.
6134     * @return {@link Bundle} of settings corresponding to what was set last time
6135     *         {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty
6136     *         {@link Bundle} if no restrictions have been set.
6137     * @throws SecurityException if {@code admin} is not a device or profile owner.
6138     * @see #setDelegatedScopes
6139     * @see #DELEGATION_APP_RESTRICTIONS
6140     */
6141    @WorkerThread
6142    public @NonNull Bundle getApplicationRestrictions(
6143            @Nullable ComponentName admin, String packageName) {
6144        throwIfParentInstance("getApplicationRestrictions");
6145        if (mService != null) {
6146            try {
6147                return mService.getApplicationRestrictions(admin, mContext.getPackageName(),
6148                        packageName);
6149            } catch (RemoteException e) {
6150                throw e.rethrowFromSystemServer();
6151            }
6152        }
6153        return null;
6154    }
6155
6156    /**
6157     * Called by a profile or device owner to set a user restriction specified by the key.
6158     * <p>
6159     * The calling device admin must be a profile or device owner; if it is not, a security
6160     * exception will be thrown.
6161     *
6162     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6163     * @param key The key of the restriction. See the constants in {@link android.os.UserManager}
6164     *            for the list of keys.
6165     * @throws SecurityException if {@code admin} is not a device or profile owner.
6166     */
6167    public void addUserRestriction(@NonNull ComponentName admin, String key) {
6168        throwIfParentInstance("addUserRestriction");
6169        if (mService != null) {
6170            try {
6171                mService.setUserRestriction(admin, key, true);
6172            } catch (RemoteException e) {
6173                throw e.rethrowFromSystemServer();
6174            }
6175        }
6176    }
6177
6178    /**
6179     * Called by a profile or device owner to clear a user restriction specified by the key.
6180     * <p>
6181     * The calling device admin must be a profile or device owner; if it is not, a security
6182     * exception will be thrown.
6183     *
6184     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6185     * @param key The key of the restriction. See the constants in {@link android.os.UserManager}
6186     *            for the list of keys.
6187     * @throws SecurityException if {@code admin} is not a device or profile owner.
6188     */
6189    public void clearUserRestriction(@NonNull ComponentName admin, String key) {
6190        throwIfParentInstance("clearUserRestriction");
6191        if (mService != null) {
6192            try {
6193                mService.setUserRestriction(admin, key, false);
6194            } catch (RemoteException e) {
6195                throw e.rethrowFromSystemServer();
6196            }
6197        }
6198    }
6199
6200    /**
6201     * Called by a profile or device owner to get user restrictions set with
6202     * {@link #addUserRestriction(ComponentName, String)}.
6203     * <p>
6204     * The target user may have more restrictions set by the system or other device owner / profile
6205     * owner. To get all the user restrictions currently set, use
6206     * {@link UserManager#getUserRestrictions()}.
6207     *
6208     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6209     * @throws SecurityException if {@code admin} is not a device or profile owner.
6210     */
6211    public @NonNull Bundle getUserRestrictions(@NonNull ComponentName admin) {
6212        throwIfParentInstance("getUserRestrictions");
6213        Bundle ret = null;
6214        if (mService != null) {
6215            try {
6216                ret = mService.getUserRestrictions(admin);
6217            } catch (RemoteException e) {
6218                throw e.rethrowFromSystemServer();
6219            }
6220        }
6221        return ret == null ? new Bundle() : ret;
6222    }
6223
6224    /**
6225     * Called by any app to display a support dialog when a feature was disabled by an admin.
6226     * This returns an intent that can be used with {@link Context#startActivity(Intent)} to
6227     * display the dialog. It will tell the user that the feature indicated by {@code restriction}
6228     * was disabled by an admin, and include a link for more information. The default content of
6229     * the dialog can be changed by the restricting admin via
6230     * {@link #setShortSupportMessage(ComponentName, CharSequence)}. If the restriction is not
6231     * set (i.e. the feature is available), then the return value will be {@code null}.
6232     * @param restriction Indicates for which feature the dialog should be displayed. Can be a
6233     *            user restriction from {@link UserManager}, e.g.
6234     *            {@link UserManager#DISALLOW_ADJUST_VOLUME}, or one of the constants
6235     *            {@link #POLICY_DISABLE_CAMERA} or {@link #POLICY_DISABLE_SCREEN_CAPTURE}.
6236     * @return Intent An intent to be used to start the dialog-activity if the restriction is
6237     *            set by an admin, or null if the restriction does not exist or no admin set it.
6238     */
6239    public Intent createAdminSupportIntent(@NonNull String restriction) {
6240        throwIfParentInstance("createAdminSupportIntent");
6241        if (mService != null) {
6242            try {
6243                return mService.createAdminSupportIntent(restriction);
6244            } catch (RemoteException e) {
6245                throw e.rethrowFromSystemServer();
6246            }
6247        }
6248        return null;
6249    }
6250
6251    /**
6252     * Hide or unhide packages. When a package is hidden it is unavailable for use, but the data and
6253     * actual package file remain. This function can be called by a device owner, profile owner, or
6254     * by a delegate given the {@link #DELEGATION_PACKAGE_ACCESS} scope via
6255     * {@link #setDelegatedScopes}.
6256     *
6257     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6258     *            {@code null} if the caller is a package access delegate.
6259     * @param packageName The name of the package to hide or unhide.
6260     * @param hidden {@code true} if the package should be hidden, {@code false} if it should be
6261     *            unhidden.
6262     * @return boolean Whether the hidden setting of the package was successfully updated.
6263     * @throws SecurityException if {@code admin} is not a device or profile owner.
6264     * @see #setDelegatedScopes
6265     * @see #DELEGATION_PACKAGE_ACCESS
6266     */
6267    public boolean setApplicationHidden(@NonNull ComponentName admin, String packageName,
6268            boolean hidden) {
6269        throwIfParentInstance("setApplicationHidden");
6270        if (mService != null) {
6271            try {
6272                return mService.setApplicationHidden(admin, mContext.getPackageName(), packageName,
6273                        hidden);
6274            } catch (RemoteException e) {
6275                throw e.rethrowFromSystemServer();
6276            }
6277        }
6278        return false;
6279    }
6280
6281    /**
6282     * Determine if a package is hidden. This function can be called by a device owner, profile
6283     * owner, or by a delegate given the {@link #DELEGATION_PACKAGE_ACCESS} scope via
6284     * {@link #setDelegatedScopes}.
6285     *
6286     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6287     *            {@code null} if the caller is a package access delegate.
6288     * @param packageName The name of the package to retrieve the hidden status of.
6289     * @return boolean {@code true} if the package is hidden, {@code false} otherwise.
6290     * @throws SecurityException if {@code admin} is not a device or profile owner.
6291     * @see #setDelegatedScopes
6292     * @see #DELEGATION_PACKAGE_ACCESS
6293     */
6294    public boolean isApplicationHidden(@NonNull ComponentName admin, String packageName) {
6295        throwIfParentInstance("isApplicationHidden");
6296        if (mService != null) {
6297            try {
6298                return mService.isApplicationHidden(admin, mContext.getPackageName(), packageName);
6299            } catch (RemoteException e) {
6300                throw e.rethrowFromSystemServer();
6301            }
6302        }
6303        return false;
6304    }
6305
6306    /**
6307     * Re-enable a system app that was disabled by default when the user was initialized. This
6308     * function can be called by a device owner, profile owner, or by a delegate given the
6309     * {@link #DELEGATION_ENABLE_SYSTEM_APP} scope via {@link #setDelegatedScopes}.
6310     *
6311     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6312     *            {@code null} if the caller is an enable system app delegate.
6313     * @param packageName The package to be re-enabled in the calling profile.
6314     * @throws SecurityException if {@code admin} is not a device or profile owner.
6315     * @see #setDelegatedScopes
6316     * @see #DELEGATION_PACKAGE_ACCESS
6317     */
6318    public void enableSystemApp(@NonNull ComponentName admin, String packageName) {
6319        throwIfParentInstance("enableSystemApp");
6320        if (mService != null) {
6321            try {
6322                mService.enableSystemApp(admin, mContext.getPackageName(), packageName);
6323            } catch (RemoteException e) {
6324                throw e.rethrowFromSystemServer();
6325            }
6326        }
6327    }
6328
6329    /**
6330     * Re-enable system apps by intent that were disabled by default when the user was initialized.
6331     * This function can be called by a device owner, profile owner, or by a delegate given the
6332     * {@link #DELEGATION_ENABLE_SYSTEM_APP} scope via {@link #setDelegatedScopes}.
6333     *
6334     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6335     *            {@code null} if the caller is an enable system app delegate.
6336     * @param intent An intent matching the app(s) to be installed. All apps that resolve for this
6337     *            intent will be re-enabled in the calling profile.
6338     * @return int The number of activities that matched the intent and were installed.
6339     * @throws SecurityException if {@code admin} is not a device or profile owner.
6340     * @see #setDelegatedScopes
6341     * @see #DELEGATION_PACKAGE_ACCESS
6342     */
6343    public int enableSystemApp(@NonNull ComponentName admin, Intent intent) {
6344        throwIfParentInstance("enableSystemApp");
6345        if (mService != null) {
6346            try {
6347                return mService.enableSystemAppWithIntent(admin, mContext.getPackageName(), intent);
6348            } catch (RemoteException e) {
6349                throw e.rethrowFromSystemServer();
6350            }
6351        }
6352        return 0;
6353    }
6354
6355    /**
6356     * Called by a device owner or profile owner to disable account management for a specific type
6357     * of account.
6358     * <p>
6359     * The calling device admin must be a device owner or profile owner. If it is not, a security
6360     * exception will be thrown.
6361     * <p>
6362     * When account management is disabled for an account type, adding or removing an account of
6363     * that type will not be possible.
6364     * <p>
6365     * From {@link android.os.Build.VERSION_CODES#N} the profile or device owner can still use
6366     * {@link android.accounts.AccountManager} APIs to add or remove accounts when account
6367     * management for a specific type is disabled.
6368     *
6369     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6370     * @param accountType For which account management is disabled or enabled.
6371     * @param disabled The boolean indicating that account management will be disabled (true) or
6372     *            enabled (false).
6373     * @throws SecurityException if {@code admin} is not a device or profile owner.
6374     */
6375    public void setAccountManagementDisabled(@NonNull ComponentName admin, String accountType,
6376            boolean disabled) {
6377        throwIfParentInstance("setAccountManagementDisabled");
6378        if (mService != null) {
6379            try {
6380                mService.setAccountManagementDisabled(admin, accountType, disabled);
6381            } catch (RemoteException e) {
6382                throw e.rethrowFromSystemServer();
6383            }
6384        }
6385    }
6386
6387    /**
6388     * Gets the array of accounts for which account management is disabled by the profile owner.
6389     *
6390     * <p> Account management can be disabled/enabled by calling
6391     * {@link #setAccountManagementDisabled}.
6392     *
6393     * @return a list of account types for which account management has been disabled.
6394     *
6395     * @see #setAccountManagementDisabled
6396     */
6397    public @Nullable String[] getAccountTypesWithManagementDisabled() {
6398        throwIfParentInstance("getAccountTypesWithManagementDisabled");
6399        return getAccountTypesWithManagementDisabledAsUser(myUserId());
6400    }
6401
6402    /**
6403     * @see #getAccountTypesWithManagementDisabled()
6404     * @hide
6405     */
6406    public @Nullable String[] getAccountTypesWithManagementDisabledAsUser(int userId) {
6407        if (mService != null) {
6408            try {
6409                return mService.getAccountTypesWithManagementDisabledAsUser(userId);
6410            } catch (RemoteException e) {
6411                throw e.rethrowFromSystemServer();
6412            }
6413        }
6414
6415        return null;
6416    }
6417
6418    /**
6419     * Sets which packages may enter lock task mode.
6420     * <p>
6421     * Any packages that share uid with an allowed package will also be allowed to activate lock
6422     * task. From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task
6423     * package list results in locked tasks belonging to those packages to be finished.
6424     * <p>
6425     * This function can only be called by the device owner or by a profile owner of a user/profile
6426     * that is affiliated with the device owner user. See {@link #setAffiliationIds}. Any packages
6427     * set via this method will be cleared if the user becomes unaffiliated.
6428     *
6429     * @param packages The list of packages allowed to enter lock task mode
6430     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6431     * @throws SecurityException if {@code admin} is not the device owner, or the profile owner of
6432     * an affiliated user or profile.
6433     * @see Activity#startLockTask()
6434     * @see DeviceAdminReceiver#onLockTaskModeEntering(Context, Intent, String)
6435     * @see DeviceAdminReceiver#onLockTaskModeExiting(Context, Intent)
6436     * @see UserManager#DISALLOW_CREATE_WINDOWS
6437     */
6438    public void setLockTaskPackages(@NonNull ComponentName admin, @NonNull String[] packages)
6439            throws SecurityException {
6440        throwIfParentInstance("setLockTaskPackages");
6441        if (mService != null) {
6442            try {
6443                mService.setLockTaskPackages(admin, packages);
6444            } catch (RemoteException e) {
6445                throw e.rethrowFromSystemServer();
6446            }
6447        }
6448    }
6449
6450    /**
6451     * Returns the list of packages allowed to start the lock task mode.
6452     *
6453     * @throws SecurityException if {@code admin} is not the device owner, or the profile owner of
6454     * an affiliated user or profile.
6455     * @see #setLockTaskPackages
6456     */
6457    public @NonNull String[] getLockTaskPackages(@NonNull ComponentName admin) {
6458        throwIfParentInstance("getLockTaskPackages");
6459        if (mService != null) {
6460            try {
6461                return mService.getLockTaskPackages(admin);
6462            } catch (RemoteException e) {
6463                throw e.rethrowFromSystemServer();
6464            }
6465        }
6466        return new String[0];
6467    }
6468
6469    /**
6470     * This function lets the caller know whether the given component is allowed to start the
6471     * lock task mode.
6472     * @param pkg The package to check
6473     */
6474    public boolean isLockTaskPermitted(String pkg) {
6475        throwIfParentInstance("isLockTaskPermitted");
6476        if (mService != null) {
6477            try {
6478                return mService.isLockTaskPermitted(pkg);
6479            } catch (RemoteException e) {
6480                throw e.rethrowFromSystemServer();
6481            }
6482        }
6483        return false;
6484    }
6485
6486    /**
6487     * Called by device owners to update {@link android.provider.Settings.Global} settings.
6488     * Validation that the value of the setting is in the correct form for the setting type should
6489     * be performed by the caller.
6490     * <p>
6491     * The settings that can be updated with this method are:
6492     * <ul>
6493     * <li>{@link android.provider.Settings.Global#ADB_ENABLED}</li>
6494     * <li>{@link android.provider.Settings.Global#AUTO_TIME}</li>
6495     * <li>{@link android.provider.Settings.Global#AUTO_TIME_ZONE}</li>
6496     * <li>{@link android.provider.Settings.Global#DATA_ROAMING}</li>
6497     * <li>{@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
6498     * <li>{@link android.provider.Settings.Global#WIFI_SLEEP_POLICY}</li>
6499     * <li>{@link android.provider.Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only
6500     * available from {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
6501     * {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
6502     * <li>{@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This
6503     * setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
6504     * </ul>
6505     * <p>
6506     * Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}:
6507     * <ul>
6508     * <li>{@link android.provider.Settings.Global#BLUETOOTH_ON}. Use
6509     * {@link android.bluetooth.BluetoothAdapter#enable()} and
6510     * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
6511     * <li>{@link android.provider.Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
6512     * <li>{@link android.provider.Settings.Global#MODE_RINGER}. Use
6513     * {@link android.media.AudioManager#setRingerMode(int)} instead.</li>
6514     * <li>{@link android.provider.Settings.Global#NETWORK_PREFERENCE}</li>
6515     * <li>{@link android.provider.Settings.Global#WIFI_ON}. Use
6516     * {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
6517     * </ul>
6518     *
6519     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6520     * @param setting The name of the setting to update.
6521     * @param value The value to update the setting to.
6522     * @throws SecurityException if {@code admin} is not a device owner.
6523     */
6524    public void setGlobalSetting(@NonNull ComponentName admin, String setting, String value) {
6525        throwIfParentInstance("setGlobalSetting");
6526        if (mService != null) {
6527            try {
6528                mService.setGlobalSetting(admin, setting, value);
6529            } catch (RemoteException e) {
6530                throw e.rethrowFromSystemServer();
6531            }
6532        }
6533    }
6534
6535    /**
6536     * Called by profile or device owners to update {@link android.provider.Settings.Secure}
6537     * settings. Validation that the value of the setting is in the correct form for the setting
6538     * type should be performed by the caller.
6539     * <p>
6540     * The settings that can be updated by a profile or device owner with this method are:
6541     * <ul>
6542     * <li>{@link android.provider.Settings.Secure#DEFAULT_INPUT_METHOD}</li>
6543     * <li>{@link android.provider.Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
6544     * </ul>
6545     * <p>
6546     * A device owner can additionally update the following settings:
6547     * <ul>
6548     * <li>{@link android.provider.Settings.Secure#LOCATION_MODE}</li>
6549     * </ul>
6550     *
6551     * <strong>Note: Starting from Android O, apps should no longer call this method with the
6552     * setting {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS}, which is
6553     * deprecated. Instead, device owners or profile owners should use the restriction
6554     * {@link UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES}.
6555     * If any app targeting {@link android.os.Build.VERSION_CODES#O} or higher calls this method
6556     * with {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS},
6557     * an {@link UnsupportedOperationException} is thrown.
6558     * </strong>
6559     *
6560     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6561     * @param setting The name of the setting to update.
6562     * @param value The value to update the setting to.
6563     * @throws SecurityException if {@code admin} is not a device or profile owner.
6564     */
6565    public void setSecureSetting(@NonNull ComponentName admin, String setting, String value) {
6566        throwIfParentInstance("setSecureSetting");
6567        if (mService != null) {
6568            try {
6569                mService.setSecureSetting(admin, setting, value);
6570            } catch (RemoteException e) {
6571                throw e.rethrowFromSystemServer();
6572            }
6573        }
6574    }
6575
6576    /**
6577     * Designates a specific service component as the provider for making permission requests of a
6578     * local or remote administrator of the user.
6579     * <p/>
6580     * Only a profile owner can designate the restrictions provider.
6581     *
6582     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6583     * @param provider The component name of the service that implements
6584     *            {@link RestrictionsReceiver}. If this param is null, it removes the restrictions
6585     *            provider previously assigned.
6586     * @throws SecurityException if {@code admin} is not a device or profile owner.
6587     */
6588    public void setRestrictionsProvider(@NonNull ComponentName admin,
6589            @Nullable ComponentName provider) {
6590        throwIfParentInstance("setRestrictionsProvider");
6591        if (mService != null) {
6592            try {
6593                mService.setRestrictionsProvider(admin, provider);
6594            } catch (RemoteException re) {
6595                throw re.rethrowFromSystemServer();
6596            }
6597        }
6598    }
6599
6600    /**
6601     * Called by profile or device owners to set the master volume mute on or off.
6602     * This has no effect when set on a managed profile.
6603     *
6604     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6605     * @param on {@code true} to mute master volume, {@code false} to turn mute off.
6606     * @throws SecurityException if {@code admin} is not a device or profile owner.
6607     */
6608    public void setMasterVolumeMuted(@NonNull ComponentName admin, boolean on) {
6609        throwIfParentInstance("setMasterVolumeMuted");
6610        if (mService != null) {
6611            try {
6612                mService.setMasterVolumeMuted(admin, on);
6613            } catch (RemoteException re) {
6614                throw re.rethrowFromSystemServer();
6615            }
6616        }
6617    }
6618
6619    /**
6620     * Called by profile or device owners to check whether the master volume mute is on or off.
6621     *
6622     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6623     * @return {@code true} if master volume is muted, {@code false} if it's not.
6624     * @throws SecurityException if {@code admin} is not a device or profile owner.
6625     */
6626    public boolean isMasterVolumeMuted(@NonNull ComponentName admin) {
6627        throwIfParentInstance("isMasterVolumeMuted");
6628        if (mService != null) {
6629            try {
6630                return mService.isMasterVolumeMuted(admin);
6631            } catch (RemoteException re) {
6632                throw re.rethrowFromSystemServer();
6633            }
6634        }
6635        return false;
6636    }
6637
6638    /**
6639     * Change whether a user can uninstall a package. This function can be called by a device owner,
6640     * profile owner, or by a delegate given the {@link #DELEGATION_BLOCK_UNINSTALL} scope via
6641     * {@link #setDelegatedScopes}.
6642     *
6643     * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
6644     *             {@code null} if the caller is a block uninstall delegate.
6645     * @param packageName package to change.
6646     * @param uninstallBlocked true if the user shouldn't be able to uninstall the package.
6647     * @throws SecurityException if {@code admin} is not a device or profile owner.
6648     * @see #setDelegatedScopes
6649     * @see #DELEGATION_BLOCK_UNINSTALL
6650     */
6651    public void setUninstallBlocked(@Nullable ComponentName admin, String packageName,
6652            boolean uninstallBlocked) {
6653        throwIfParentInstance("setUninstallBlocked");
6654        if (mService != null) {
6655            try {
6656                mService.setUninstallBlocked(admin, mContext.getPackageName(), packageName,
6657                    uninstallBlocked);
6658            } catch (RemoteException re) {
6659                throw re.rethrowFromSystemServer();
6660            }
6661        }
6662    }
6663
6664    /**
6665     * Check whether the user has been blocked by device policy from uninstalling a package.
6666     * Requires the caller to be the profile owner if checking a specific admin's policy.
6667     * <p>
6668     * <strong>Note:</strong> Starting from {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}, the
6669     * behavior of this API is changed such that passing {@code null} as the {@code admin} parameter
6670     * will return if any admin has blocked the uninstallation. Before L MR1, passing {@code null}
6671     * will cause a NullPointerException to be raised.
6672     *
6673     * @param admin The name of the admin component whose blocking policy will be checked, or
6674     *            {@code null} to check whether any admin has blocked the uninstallation.
6675     * @param packageName package to check.
6676     * @return true if uninstallation is blocked.
6677     * @throws SecurityException if {@code admin} is not a device or profile owner.
6678     */
6679    public boolean isUninstallBlocked(@Nullable ComponentName admin, String packageName) {
6680        throwIfParentInstance("isUninstallBlocked");
6681        if (mService != null) {
6682            try {
6683                return mService.isUninstallBlocked(admin, packageName);
6684            } catch (RemoteException re) {
6685                throw re.rethrowFromSystemServer();
6686            }
6687        }
6688        return false;
6689    }
6690
6691    /**
6692     * Called by the profile owner of a managed profile to enable widget providers from a given
6693     * package to be available in the parent profile. As a result the user will be able to add
6694     * widgets from the white-listed package running under the profile to a widget host which runs
6695     * under the parent profile, for example the home screen. Note that a package may have zero or
6696     * more provider components, where each component provides a different widget type.
6697     * <p>
6698     * <strong>Note:</strong> By default no widget provider package is white-listed.
6699     *
6700     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6701     * @param packageName The package from which widget providers are white-listed.
6702     * @return Whether the package was added.
6703     * @throws SecurityException if {@code admin} is not a profile owner.
6704     * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
6705     * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
6706     */
6707    public boolean addCrossProfileWidgetProvider(@NonNull ComponentName admin, String packageName) {
6708        throwIfParentInstance("addCrossProfileWidgetProvider");
6709        if (mService != null) {
6710            try {
6711                return mService.addCrossProfileWidgetProvider(admin, packageName);
6712            } catch (RemoteException re) {
6713                throw re.rethrowFromSystemServer();
6714            }
6715        }
6716        return false;
6717    }
6718
6719    /**
6720     * Called by the profile owner of a managed profile to disable widget providers from a given
6721     * package to be available in the parent profile. For this method to take effect the package
6722     * should have been added via
6723     * {@link #addCrossProfileWidgetProvider( android.content.ComponentName, String)}.
6724     * <p>
6725     * <strong>Note:</strong> By default no widget provider package is white-listed.
6726     *
6727     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6728     * @param packageName The package from which widget providers are no longer white-listed.
6729     * @return Whether the package was removed.
6730     * @throws SecurityException if {@code admin} is not a profile owner.
6731     * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
6732     * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
6733     */
6734    public boolean removeCrossProfileWidgetProvider(
6735            @NonNull ComponentName admin, String packageName) {
6736        throwIfParentInstance("removeCrossProfileWidgetProvider");
6737        if (mService != null) {
6738            try {
6739                return mService.removeCrossProfileWidgetProvider(admin, packageName);
6740            } catch (RemoteException re) {
6741                throw re.rethrowFromSystemServer();
6742            }
6743        }
6744        return false;
6745    }
6746
6747    /**
6748     * Called by the profile owner of a managed profile to query providers from which packages are
6749     * available in the parent profile.
6750     *
6751     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6752     * @return The white-listed package list.
6753     * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
6754     * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
6755     * @throws SecurityException if {@code admin} is not a profile owner.
6756     */
6757    public @NonNull List<String> getCrossProfileWidgetProviders(@NonNull ComponentName admin) {
6758        throwIfParentInstance("getCrossProfileWidgetProviders");
6759        if (mService != null) {
6760            try {
6761                List<String> providers = mService.getCrossProfileWidgetProviders(admin);
6762                if (providers != null) {
6763                    return providers;
6764                }
6765            } catch (RemoteException re) {
6766                throw re.rethrowFromSystemServer();
6767            }
6768        }
6769        return Collections.emptyList();
6770    }
6771
6772    /**
6773     * Called by profile or device owners to set the user's photo.
6774     *
6775     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6776     * @param icon the bitmap to set as the photo.
6777     * @throws SecurityException if {@code admin} is not a device or profile owner.
6778     */
6779    public void setUserIcon(@NonNull ComponentName admin, Bitmap icon) {
6780        throwIfParentInstance("setUserIcon");
6781        try {
6782            mService.setUserIcon(admin, icon);
6783        } catch (RemoteException re) {
6784            throw re.rethrowFromSystemServer();
6785        }
6786    }
6787
6788    /**
6789     * Called by device owners to set a local system update policy. When a new policy is set,
6790     * {@link #ACTION_SYSTEM_UPDATE_POLICY_CHANGED} is broadcasted.
6791     *
6792     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. All
6793     *            components in the device owner package can set system update policies and the most
6794     *            recent policy takes effect.
6795     * @param policy the new policy, or {@code null} to clear the current policy.
6796     * @throws SecurityException if {@code admin} is not a device owner.
6797     * @see SystemUpdatePolicy
6798     */
6799    public void setSystemUpdatePolicy(@NonNull ComponentName admin, SystemUpdatePolicy policy) {
6800        throwIfParentInstance("setSystemUpdatePolicy");
6801        if (mService != null) {
6802            try {
6803                mService.setSystemUpdatePolicy(admin, policy);
6804            } catch (RemoteException re) {
6805                throw re.rethrowFromSystemServer();
6806            }
6807        }
6808    }
6809
6810    /**
6811     * Retrieve a local system update policy set previously by {@link #setSystemUpdatePolicy}.
6812     *
6813     * @return The current policy object, or {@code null} if no policy is set.
6814     */
6815    public @Nullable SystemUpdatePolicy getSystemUpdatePolicy() {
6816        throwIfParentInstance("getSystemUpdatePolicy");
6817        if (mService != null) {
6818            try {
6819                return mService.getSystemUpdatePolicy();
6820            } catch (RemoteException re) {
6821                throw re.rethrowFromSystemServer();
6822            }
6823        }
6824        return null;
6825    }
6826
6827    /**
6828     * Called by a device owner to disable the keyguard altogether.
6829     * <p>
6830     * Setting the keyguard to disabled has the same effect as choosing "None" as the screen lock
6831     * type. However, this call has no effect if a password, pin or pattern is currently set. If a
6832     * password, pin or pattern is set after the keyguard was disabled, the keyguard stops being
6833     * disabled.
6834     *
6835     * <p>
6836     * As of {@link android.os.Build.VERSION_CODES#P}, this call also dismisses the
6837     * keyguard if it is currently shown.
6838     *
6839     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6840     * @param disabled {@code true} disables the keyguard, {@code false} reenables it.
6841     * @return {@code false} if attempting to disable the keyguard while a lock password was in
6842     *         place. {@code true} otherwise.
6843     * @throws SecurityException if {@code admin} is not a device owner.
6844     */
6845    public boolean setKeyguardDisabled(@NonNull ComponentName admin, boolean disabled) {
6846        throwIfParentInstance("setKeyguardDisabled");
6847        try {
6848            return mService.setKeyguardDisabled(admin, disabled);
6849        } catch (RemoteException re) {
6850            throw re.rethrowFromSystemServer();
6851        }
6852    }
6853
6854    /**
6855     * Called by device owner to disable the status bar. Disabling the status bar blocks
6856     * notifications, quick settings and other screen overlays that allow escaping from a single use
6857     * device.
6858     *
6859     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
6860     * @param disabled {@code true} disables the status bar, {@code false} reenables it.
6861     * @return {@code false} if attempting to disable the status bar failed. {@code true} otherwise.
6862     * @throws SecurityException if {@code admin} is not a device owner.
6863     */
6864    public boolean setStatusBarDisabled(@NonNull ComponentName admin, boolean disabled) {
6865        throwIfParentInstance("setStatusBarDisabled");
6866        try {
6867            return mService.setStatusBarDisabled(admin, disabled);
6868        } catch (RemoteException re) {
6869            throw re.rethrowFromSystemServer();
6870        }
6871    }
6872
6873    /**
6874     * Called by the system update service to notify device and profile owners of pending system
6875     * updates.
6876     *
6877     * This method should only be used when it is unknown whether the pending system
6878     * update is a security patch. Otherwise, use
6879     * {@link #notifyPendingSystemUpdate(long, boolean)}.
6880     *
6881     * @param updateReceivedTime The time as given by {@link System#currentTimeMillis()}
6882     *         indicating when the current pending update was first available. {@code -1} if no
6883     *         update is available.
6884     * @see #notifyPendingSystemUpdate(long, boolean)
6885     * @hide
6886     */
6887    @SystemApi
6888    @RequiresPermission(android.Manifest.permission.NOTIFY_PENDING_SYSTEM_UPDATE)
6889    public void notifyPendingSystemUpdate(long updateReceivedTime) {
6890        throwIfParentInstance("notifyPendingSystemUpdate");
6891        if (mService != null) {
6892            try {
6893                mService.notifyPendingSystemUpdate(SystemUpdateInfo.of(updateReceivedTime));
6894            } catch (RemoteException re) {
6895                throw re.rethrowFromSystemServer();
6896            }
6897        }
6898    }
6899
6900    /**
6901     * Called by the system update service to notify device and profile owners of pending system
6902     * updates.
6903     *
6904     * This method should be used instead of {@link #notifyPendingSystemUpdate(long)}
6905     * when it is known whether the pending system update is a security patch.
6906     *
6907     * @param updateReceivedTime The time as given by {@link System#currentTimeMillis()}
6908     *         indicating when the current pending update was first available. {@code -1} if no
6909     *         update is available.
6910     * @param isSecurityPatch {@code true} if this system update is purely a security patch;
6911     *         {@code false} if not.
6912     * @see #notifyPendingSystemUpdate(long)
6913     * @hide
6914     */
6915    @SystemApi
6916    @RequiresPermission(android.Manifest.permission.NOTIFY_PENDING_SYSTEM_UPDATE)
6917    public void notifyPendingSystemUpdate(long updateReceivedTime, boolean isSecurityPatch) {
6918        throwIfParentInstance("notifyPendingSystemUpdate");
6919        if (mService != null) {
6920            try {
6921                mService.notifyPendingSystemUpdate(SystemUpdateInfo.of(updateReceivedTime,
6922                        isSecurityPatch));
6923            } catch (RemoteException re) {
6924                throw re.rethrowFromSystemServer();
6925            }
6926        }
6927    }
6928
6929    /**
6930     * Called by device or profile owners to get information about a pending system update.
6931     *
6932     * @param admin Which profile or device owner this request is associated with.
6933     * @return Information about a pending system update or {@code null} if no update pending.
6934     * @throws SecurityException if {@code admin} is not a device or profile owner.
6935     * @see DeviceAdminReceiver#onSystemUpdatePending(Context, Intent, long)
6936     */
6937    public @Nullable SystemUpdateInfo getPendingSystemUpdate(@NonNull ComponentName admin) {
6938        throwIfParentInstance("getPendingSystemUpdate");
6939        try {
6940            return mService.getPendingSystemUpdate(admin);
6941        } catch (RemoteException re) {
6942            throw re.rethrowFromSystemServer();
6943        }
6944    }
6945
6946    /**
6947     * Set the default response for future runtime permission requests by applications. This
6948     * function can be called by a device owner, profile owner, or by a delegate given the
6949     * {@link #DELEGATION_PERMISSION_GRANT} scope via {@link #setDelegatedScopes}.
6950     * The policy can allow for normal operation which prompts the user to grant a permission, or
6951     * can allow automatic granting or denying of runtime permission requests by an application.
6952     * This also applies to new permissions declared by app updates. When a permission is denied or
6953     * granted this way, the effect is equivalent to setting the permission * grant state via
6954     * {@link #setPermissionGrantState}.
6955     * <p/>
6956     * As this policy only acts on runtime permission requests, it only applies to applications
6957     * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later.
6958     *
6959     * @param admin Which profile or device owner this request is associated with.
6960     * @param policy One of the policy constants {@link #PERMISSION_POLICY_PROMPT},
6961     *            {@link #PERMISSION_POLICY_AUTO_GRANT} and {@link #PERMISSION_POLICY_AUTO_DENY}.
6962     * @throws SecurityException if {@code admin} is not a device or profile owner.
6963     * @see #setPermissionGrantState
6964     * @see #setDelegatedScopes
6965     * @see #DELEGATION_PERMISSION_GRANT
6966     */
6967    public void setPermissionPolicy(@NonNull ComponentName admin, int policy) {
6968        throwIfParentInstance("setPermissionPolicy");
6969        try {
6970            mService.setPermissionPolicy(admin, mContext.getPackageName(), policy);
6971        } catch (RemoteException re) {
6972            throw re.rethrowFromSystemServer();
6973        }
6974    }
6975
6976    /**
6977     * Returns the current runtime permission policy set by the device or profile owner. The
6978     * default is {@link #PERMISSION_POLICY_PROMPT}.
6979     *
6980     * @param admin Which profile or device owner this request is associated with.
6981     * @return the current policy for future permission requests.
6982     */
6983    public int getPermissionPolicy(ComponentName admin) {
6984        throwIfParentInstance("getPermissionPolicy");
6985        try {
6986            return mService.getPermissionPolicy(admin);
6987        } catch (RemoteException re) {
6988            throw re.rethrowFromSystemServer();
6989        }
6990    }
6991
6992    /**
6993     * Sets the grant state of a runtime permission for a specific application. The state can be
6994     * {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it through the UI,
6995     * {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission is denied and the user
6996     * cannot manage it through the UI, and {@link #PERMISSION_GRANT_STATE_GRANTED granted} in which
6997     * the permission is granted and the user cannot manage it through the UI. This might affect all
6998     * permissions in a group that the runtime permission belongs to. This method can only be called
6999     * by a profile owner, device owner, or a delegate given the
7000     * {@link #DELEGATION_PERMISSION_GRANT} scope via {@link #setDelegatedScopes}.
7001     * <p/>
7002     * Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not revoke
7003     * the permission. It retains the previous grant, if any.
7004     * <p/>
7005     * Permissions can be granted or revoked only for applications built with a
7006     * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later.
7007     *
7008     * @param admin Which profile or device owner this request is associated with.
7009     * @param packageName The application to grant or revoke a permission to.
7010     * @param permission The permission to grant or revoke.
7011     * @param grantState The permission grant state which is one of
7012     *            {@link #PERMISSION_GRANT_STATE_DENIED}, {@link #PERMISSION_GRANT_STATE_DEFAULT},
7013     *            {@link #PERMISSION_GRANT_STATE_GRANTED},
7014     * @return whether the permission was successfully granted or revoked.
7015     * @throws SecurityException if {@code admin} is not a device or profile owner.
7016     * @see #PERMISSION_GRANT_STATE_DENIED
7017     * @see #PERMISSION_GRANT_STATE_DEFAULT
7018     * @see #PERMISSION_GRANT_STATE_GRANTED
7019     * @see #setDelegatedScopes
7020     * @see #DELEGATION_PERMISSION_GRANT
7021     */
7022    public boolean setPermissionGrantState(@NonNull ComponentName admin, String packageName,
7023            String permission, int grantState) {
7024        throwIfParentInstance("setPermissionGrantState");
7025        try {
7026            return mService.setPermissionGrantState(admin, mContext.getPackageName(), packageName,
7027                    permission, grantState);
7028        } catch (RemoteException re) {
7029            throw re.rethrowFromSystemServer();
7030        }
7031    }
7032
7033    /**
7034     * Returns the current grant state of a runtime permission for a specific application. This
7035     * function can be called by a device owner, profile owner, or by a delegate given the
7036     * {@link #DELEGATION_PERMISSION_GRANT} scope via {@link #setDelegatedScopes}.
7037     *
7038     * @param admin Which profile or device owner this request is associated with, or {@code null}
7039     *            if the caller is a permission grant delegate.
7040     * @param packageName The application to check the grant state for.
7041     * @param permission The permission to check for.
7042     * @return the current grant state specified by device policy. If the profile or device owner
7043     *         has not set a grant state, the return value is
7044     *         {@link #PERMISSION_GRANT_STATE_DEFAULT}. This does not indicate whether or not the
7045     *         permission is currently granted for the package.
7046     *         <p/>
7047     *         If a grant state was set by the profile or device owner, then the return value will
7048     *         be one of {@link #PERMISSION_GRANT_STATE_DENIED} or
7049     *         {@link #PERMISSION_GRANT_STATE_GRANTED}, which indicates if the permission is
7050     *         currently denied or granted.
7051     * @throws SecurityException if {@code admin} is not a device or profile owner.
7052     * @see #setPermissionGrantState(ComponentName, String, String, int)
7053     * @see PackageManager#checkPermission(String, String)
7054     * @see #setDelegatedScopes
7055     * @see #DELEGATION_PERMISSION_GRANT
7056     */
7057    public int getPermissionGrantState(@Nullable ComponentName admin, String packageName,
7058            String permission) {
7059        throwIfParentInstance("getPermissionGrantState");
7060        try {
7061            return mService.getPermissionGrantState(admin, mContext.getPackageName(), packageName,
7062                    permission);
7063        } catch (RemoteException re) {
7064            throw re.rethrowFromSystemServer();
7065        }
7066    }
7067
7068    /**
7069     * Returns whether it is possible for the caller to initiate provisioning of a managed profile
7070     * or device, setting itself as the device or profile owner.
7071     *
7072     * @param action One of {@link #ACTION_PROVISION_MANAGED_DEVICE},
7073     * {@link #ACTION_PROVISION_MANAGED_PROFILE}.
7074     * @return whether provisioning a managed profile or device is possible.
7075     * @throws IllegalArgumentException if the supplied action is not valid.
7076     */
7077    public boolean isProvisioningAllowed(@NonNull String action) {
7078        throwIfParentInstance("isProvisioningAllowed");
7079        try {
7080            return mService.isProvisioningAllowed(action, mContext.getPackageName());
7081        } catch (RemoteException re) {
7082            throw re.rethrowFromSystemServer();
7083        }
7084    }
7085
7086    /**
7087     * Checks whether it is possible to initiate provisioning a managed device,
7088     * profile or user, setting the given package as owner.
7089     *
7090     * @param action One of {@link #ACTION_PROVISION_MANAGED_DEVICE},
7091     *        {@link #ACTION_PROVISION_MANAGED_PROFILE},
7092     *        {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE},
7093     *        {@link #ACTION_PROVISION_MANAGED_USER}
7094     * @param packageName The package of the component that would be set as device, user, or profile
7095     *        owner.
7096     * @return A {@link ProvisioningPreCondition} value indicating whether provisioning is allowed.
7097     * @hide
7098     */
7099    public @ProvisioningPreCondition int checkProvisioningPreCondition(
7100            String action, @NonNull String packageName) {
7101        try {
7102            return mService.checkProvisioningPreCondition(action, packageName);
7103        } catch (RemoteException re) {
7104            throw re.rethrowFromSystemServer();
7105        }
7106    }
7107
7108    /**
7109     * Return if this user is a managed profile of another user. An admin can become the profile
7110     * owner of a managed profile with {@link #ACTION_PROVISION_MANAGED_PROFILE} and of a managed
7111     * user with {@link #createAndManageUser}
7112     * @param admin Which profile owner this request is associated with.
7113     * @return if this user is a managed profile of another user.
7114     */
7115    public boolean isManagedProfile(@NonNull ComponentName admin) {
7116        throwIfParentInstance("isManagedProfile");
7117        try {
7118            return mService.isManagedProfile(admin);
7119        } catch (RemoteException re) {
7120            throw re.rethrowFromSystemServer();
7121        }
7122    }
7123
7124    /**
7125     * @hide
7126     * Return if this user is a system-only user. An admin can manage a device from a system only
7127     * user by calling {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE}.
7128     * @param admin Which device owner this request is associated with.
7129     * @return if this user is a system-only user.
7130     */
7131    public boolean isSystemOnlyUser(@NonNull ComponentName admin) {
7132        try {
7133            return mService.isSystemOnlyUser(admin);
7134        } catch (RemoteException re) {
7135            throw re.rethrowFromSystemServer();
7136        }
7137    }
7138
7139    /**
7140     * Called by device owner to get the MAC address of the Wi-Fi device.
7141     *
7142     * @param admin Which device owner this request is associated with.
7143     * @return the MAC address of the Wi-Fi device, or null when the information is not available.
7144     *         (For example, Wi-Fi hasn't been enabled, or the device doesn't support Wi-Fi.)
7145     *         <p>
7146     *         The address will be in the {@code XX:XX:XX:XX:XX:XX} format.
7147     * @throws SecurityException if {@code admin} is not a device owner.
7148     */
7149    public @Nullable String getWifiMacAddress(@NonNull ComponentName admin) {
7150        throwIfParentInstance("getWifiMacAddress");
7151        try {
7152            return mService.getWifiMacAddress(admin);
7153        } catch (RemoteException re) {
7154            throw re.rethrowFromSystemServer();
7155        }
7156    }
7157
7158    /**
7159     * Called by device owner to reboot the device. If there is an ongoing call on the device,
7160     * throws an {@link IllegalStateException}.
7161     * @param admin Which device owner the request is associated with.
7162     * @throws IllegalStateException if device has an ongoing call.
7163     * @throws SecurityException if {@code admin} is not a device owner.
7164     * @see TelephonyManager#CALL_STATE_IDLE
7165     */
7166    public void reboot(@NonNull ComponentName admin) {
7167        throwIfParentInstance("reboot");
7168        try {
7169            mService.reboot(admin);
7170        } catch (RemoteException re) {
7171            throw re.rethrowFromSystemServer();
7172        }
7173    }
7174
7175    /**
7176     * Called by a device admin to set the short support message. This will be displayed to the user
7177     * in settings screens where funtionality has been disabled by the admin. The message should be
7178     * limited to a short statement such as "This setting is disabled by your administrator. Contact
7179     * someone@example.com for support." If the message is longer than 200 characters it may be
7180     * truncated.
7181     * <p>
7182     * If the short support message needs to be localized, it is the responsibility of the
7183     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
7184     * and set a new version of this string accordingly.
7185     *
7186     * @see #setLongSupportMessage
7187     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7188     * @param message Short message to be displayed to the user in settings or null to clear the
7189     *            existing message.
7190     * @throws SecurityException if {@code admin} is not an active administrator.
7191     */
7192    public void setShortSupportMessage(@NonNull ComponentName admin,
7193            @Nullable CharSequence message) {
7194        throwIfParentInstance("setShortSupportMessage");
7195        if (mService != null) {
7196            try {
7197                mService.setShortSupportMessage(admin, message);
7198            } catch (RemoteException e) {
7199                throw e.rethrowFromSystemServer();
7200            }
7201        }
7202    }
7203
7204    /**
7205     * Called by a device admin to get the short support message.
7206     *
7207     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7208     * @return The message set by {@link #setShortSupportMessage(ComponentName, CharSequence)} or
7209     *         null if no message has been set.
7210     * @throws SecurityException if {@code admin} is not an active administrator.
7211     */
7212    public CharSequence getShortSupportMessage(@NonNull ComponentName admin) {
7213        throwIfParentInstance("getShortSupportMessage");
7214        if (mService != null) {
7215            try {
7216                return mService.getShortSupportMessage(admin);
7217            } catch (RemoteException e) {
7218                throw e.rethrowFromSystemServer();
7219            }
7220        }
7221        return null;
7222    }
7223
7224    /**
7225     * Called by a device admin to set the long support message. This will be displayed to the user
7226     * in the device administators settings screen.
7227     * <p>
7228     * If the long support message needs to be localized, it is the responsibility of the
7229     * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast
7230     * and set a new version of this string accordingly.
7231     *
7232     * @see #setShortSupportMessage
7233     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7234     * @param message Long message to be displayed to the user in settings or null to clear the
7235     *            existing message.
7236     * @throws SecurityException if {@code admin} is not an active administrator.
7237     */
7238    public void setLongSupportMessage(@NonNull ComponentName admin,
7239            @Nullable CharSequence message) {
7240        throwIfParentInstance("setLongSupportMessage");
7241        if (mService != null) {
7242            try {
7243                mService.setLongSupportMessage(admin, message);
7244            } catch (RemoteException e) {
7245                throw e.rethrowFromSystemServer();
7246            }
7247        }
7248    }
7249
7250    /**
7251     * Called by a device admin to get the long support message.
7252     *
7253     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7254     * @return The message set by {@link #setLongSupportMessage(ComponentName, CharSequence)} or
7255     *         null if no message has been set.
7256     * @throws SecurityException if {@code admin} is not an active administrator.
7257     */
7258    public @Nullable CharSequence getLongSupportMessage(@NonNull ComponentName admin) {
7259        throwIfParentInstance("getLongSupportMessage");
7260        if (mService != null) {
7261            try {
7262                return mService.getLongSupportMessage(admin);
7263            } catch (RemoteException e) {
7264                throw e.rethrowFromSystemServer();
7265            }
7266        }
7267        return null;
7268    }
7269
7270    /**
7271     * Called by the system to get the short support message.
7272     *
7273     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7274     * @param userHandle user id the admin is running as.
7275     * @return The message set by {@link #setShortSupportMessage(ComponentName, CharSequence)}
7276     *
7277     * @hide
7278     */
7279    public @Nullable CharSequence getShortSupportMessageForUser(@NonNull ComponentName admin,
7280            int userHandle) {
7281        if (mService != null) {
7282            try {
7283                return mService.getShortSupportMessageForUser(admin, userHandle);
7284            } catch (RemoteException e) {
7285                throw e.rethrowFromSystemServer();
7286            }
7287        }
7288        return null;
7289    }
7290
7291
7292    /**
7293     * Called by the system to get the long support message.
7294     *
7295     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7296     * @param userHandle user id the admin is running as.
7297     * @return The message set by {@link #setLongSupportMessage(ComponentName, CharSequence)}
7298     *
7299     * @hide
7300     */
7301    public @Nullable CharSequence getLongSupportMessageForUser(
7302            @NonNull ComponentName admin, int userHandle) {
7303        if (mService != null) {
7304            try {
7305                return mService.getLongSupportMessageForUser(admin, userHandle);
7306            } catch (RemoteException e) {
7307                throw e.rethrowFromSystemServer();
7308            }
7309        }
7310        return null;
7311    }
7312
7313    /**
7314     * Called by the profile owner of a managed profile to obtain a {@link DevicePolicyManager}
7315     * whose calls act on the parent profile.
7316     *
7317     * <p>The following methods are supported for the parent instance, all other methods will
7318     * throw a SecurityException when called on the parent instance:
7319     * <ul>
7320     * <li>{@link #getPasswordQuality}</li>
7321     * <li>{@link #setPasswordQuality}</li>
7322     * <li>{@link #getPasswordMinimumLength}</li>
7323     * <li>{@link #setPasswordMinimumLength}</li>
7324     * <li>{@link #getPasswordMinimumUpperCase}</li>
7325     * <li>{@link #setPasswordMinimumUpperCase}</li>
7326     * <li>{@link #getPasswordMinimumLowerCase}</li>
7327     * <li>{@link #setPasswordMinimumLowerCase}</li>
7328     * <li>{@link #getPasswordMinimumLetters}</li>
7329     * <li>{@link #setPasswordMinimumLetters}</li>
7330     * <li>{@link #getPasswordMinimumNumeric}</li>
7331     * <li>{@link #setPasswordMinimumNumeric}</li>
7332     * <li>{@link #getPasswordMinimumSymbols}</li>
7333     * <li>{@link #setPasswordMinimumSymbols}</li>
7334     * <li>{@link #getPasswordMinimumNonLetter}</li>
7335     * <li>{@link #setPasswordMinimumNonLetter}</li>
7336     * <li>{@link #getPasswordHistoryLength}</li>
7337     * <li>{@link #setPasswordHistoryLength}</li>
7338     * <li>{@link #getPasswordExpirationTimeout}</li>
7339     * <li>{@link #setPasswordExpirationTimeout}</li>
7340     * <li>{@link #getPasswordExpiration}</li>
7341     * <li>{@link #getPasswordMaximumLength}</li>
7342     * <li>{@link #isActivePasswordSufficient}</li>
7343     * <li>{@link #getCurrentFailedPasswordAttempts}</li>
7344     * <li>{@link #getMaximumFailedPasswordsForWipe}</li>
7345     * <li>{@link #setMaximumFailedPasswordsForWipe}</li>
7346     * <li>{@link #getMaximumTimeToLock}</li>
7347     * <li>{@link #setMaximumTimeToLock}</li>
7348     * <li>{@link #lockNow}</li>
7349     * <li>{@link #getKeyguardDisabledFeatures}</li>
7350     * <li>{@link #setKeyguardDisabledFeatures}</li>
7351     * <li>{@link #getTrustAgentConfiguration}</li>
7352     * <li>{@link #setTrustAgentConfiguration}</li>
7353     * <li>{@link #getRequiredStrongAuthTimeout}</li>
7354     * <li>{@link #setRequiredStrongAuthTimeout}</li>
7355     * </ul>
7356     *
7357     * @return a new instance of {@link DevicePolicyManager} that acts on the parent profile.
7358     * @throws SecurityException if {@code admin} is not a profile owner.
7359     */
7360    public @NonNull DevicePolicyManager getParentProfileInstance(@NonNull ComponentName admin) {
7361        throwIfParentInstance("getParentProfileInstance");
7362        try {
7363            if (!mService.isManagedProfile(admin)) {
7364                throw new SecurityException("The current user does not have a parent profile.");
7365            }
7366            return new DevicePolicyManager(mContext, mService, true);
7367        } catch (RemoteException e) {
7368            throw e.rethrowFromSystemServer();
7369        }
7370    }
7371
7372    /**
7373     * Called by device owner to control the security logging feature.
7374     *
7375     * <p> Security logs contain various information intended for security auditing purposes.
7376     * See {@link SecurityEvent} for details.
7377     *
7378     * <p><strong>Note:</strong> The device owner won't be able to retrieve security logs if there
7379     * are unaffiliated secondary users or profiles on the device, regardless of whether the
7380     * feature is enabled. Logs will be discarded if the internal buffer fills up while waiting for
7381     * all users to become affiliated. Therefore it's recommended that affiliation ids are set for
7382     * new users as soon as possible after provisioning via {@link #setAffiliationIds}.
7383     *
7384     * @param admin Which device owner this request is associated with.
7385     * @param enabled whether security logging should be enabled or not.
7386     * @throws SecurityException if {@code admin} is not a device owner.
7387     * @see #retrieveSecurityLogs
7388     */
7389    public void setSecurityLoggingEnabled(@NonNull ComponentName admin, boolean enabled) {
7390        throwIfParentInstance("setSecurityLoggingEnabled");
7391        try {
7392            mService.setSecurityLoggingEnabled(admin, enabled);
7393        } catch (RemoteException re) {
7394            throw re.rethrowFromSystemServer();
7395        }
7396    }
7397
7398    /**
7399     * Return whether security logging is enabled or not by the device owner.
7400     *
7401     * <p>Can only be called by the device owner, otherwise a {@link SecurityException} will be
7402     * thrown.
7403     *
7404     * @param admin Which device owner this request is associated with.
7405     * @return {@code true} if security logging is enabled by device owner, {@code false} otherwise.
7406     * @throws SecurityException if {@code admin} is not a device owner.
7407     */
7408    public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) {
7409        throwIfParentInstance("isSecurityLoggingEnabled");
7410        try {
7411            return mService.isSecurityLoggingEnabled(admin);
7412        } catch (RemoteException re) {
7413            throw re.rethrowFromSystemServer();
7414        }
7415    }
7416
7417    /**
7418     * Called by device owner to retrieve all new security logging entries since the last call to
7419     * this API after device boots.
7420     *
7421     * <p> Access to the logs is rate limited and it will only return new logs after the device
7422     * owner has been notified via {@link DeviceAdminReceiver#onSecurityLogsAvailable}.
7423     *
7424     * <p>If there is any other user or profile on the device, it must be affiliated with the
7425     * device owner. Otherwise a {@link SecurityException} will be thrown. See
7426     * {@link #setAffiliationIds}
7427     *
7428     * @param admin Which device owner this request is associated with.
7429     * @return the new batch of security logs which is a list of {@link SecurityEvent},
7430     * or {@code null} if rate limitation is exceeded or if logging is currently disabled.
7431     * @throws SecurityException if {@code admin} is not a device owner, or there is at least one
7432     * profile or secondary user that is not affiliated with the device owner user.
7433     * @see DeviceAdminReceiver#onSecurityLogsAvailable
7434     */
7435    public @Nullable List<SecurityEvent> retrieveSecurityLogs(@NonNull ComponentName admin) {
7436        throwIfParentInstance("retrieveSecurityLogs");
7437        try {
7438            ParceledListSlice<SecurityEvent> list = mService.retrieveSecurityLogs(admin);
7439            if (list != null) {
7440                return list.getList();
7441            } else {
7442                // Rate limit exceeded.
7443                return null;
7444            }
7445        } catch (RemoteException re) {
7446            throw re.rethrowFromSystemServer();
7447        }
7448    }
7449
7450    /**
7451     * Called by the system to obtain a {@link DevicePolicyManager} whose calls act on the parent
7452     * profile.
7453     *
7454     * @hide
7455     */
7456    public @NonNull DevicePolicyManager getParentProfileInstance(UserInfo uInfo) {
7457        mContext.checkSelfPermission(
7458                android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
7459        if (!uInfo.isManagedProfile()) {
7460            throw new SecurityException("The user " + uInfo.id
7461                    + " does not have a parent profile.");
7462        }
7463        return new DevicePolicyManager(mContext, mService, true);
7464    }
7465
7466    /**
7467     * Called by device owners to retrieve device logs from before the device's last reboot.
7468     * <p>
7469     * <strong> This API is not supported on all devices. Calling this API on unsupported devices
7470     * will result in {@code null} being returned. The device logs are retrieved from a RAM region
7471     * which is not guaranteed to be corruption-free during power cycles, as a result be cautious
7472     * about data corruption when parsing. </strong>
7473     *
7474     * <p>If there is any other user or profile on the device, it must be affiliated with the
7475     * device owner. Otherwise a {@link SecurityException} will be thrown. See
7476     * {@link #setAffiliationIds}
7477     *
7478     * @param admin Which device owner this request is associated with.
7479     * @return Device logs from before the latest reboot of the system, or {@code null} if this API
7480     *         is not supported on the device.
7481     * @throws SecurityException if {@code admin} is not a device owner, or there is at least one
7482     * profile or secondary user that is not affiliated with the device owner user.
7483     * @see #retrieveSecurityLogs
7484     */
7485    public @Nullable List<SecurityEvent> retrievePreRebootSecurityLogs(
7486            @NonNull ComponentName admin) {
7487        throwIfParentInstance("retrievePreRebootSecurityLogs");
7488        try {
7489            ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs(admin);
7490            if (list != null) {
7491                return list.getList();
7492            } else {
7493                return null;
7494            }
7495        } catch (RemoteException re) {
7496            throw re.rethrowFromSystemServer();
7497        }
7498    }
7499
7500    /**
7501     * Called by a profile owner of a managed profile to set the color used for customization. This
7502     * color is used as background color of the confirm credentials screen for that user. The
7503     * default color is teal (#00796B).
7504     * <p>
7505     * The confirm credentials screen can be created using
7506     * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent}.
7507     *
7508     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7509     * @param color The 24bit (0xRRGGBB) representation of the color to be used.
7510     * @throws SecurityException if {@code admin} is not a profile owner.
7511     */
7512    public void setOrganizationColor(@NonNull ComponentName admin, int color) {
7513        throwIfParentInstance("setOrganizationColor");
7514        try {
7515            // always enforce alpha channel to have 100% opacity
7516            color |= 0xFF000000;
7517            mService.setOrganizationColor(admin, color);
7518        } catch (RemoteException re) {
7519            throw re.rethrowFromSystemServer();
7520        }
7521    }
7522
7523    /**
7524     * @hide
7525     *
7526     * Sets the color used for customization.
7527     *
7528     * @param color The 24bit (0xRRGGBB) representation of the color to be used.
7529     * @param userId which user to set the color to.
7530     * @RequiresPermission(allOf = {
7531     *       Manifest.permission.MANAGE_USERS,
7532     *       Manifest.permission.INTERACT_ACROSS_USERS_FULL})
7533     */
7534    public void setOrganizationColorForUser(@ColorInt int color, @UserIdInt int userId) {
7535        try {
7536            // always enforce alpha channel to have 100% opacity
7537            color |= 0xFF000000;
7538            mService.setOrganizationColorForUser(color, userId);
7539        } catch (RemoteException re) {
7540            throw re.rethrowFromSystemServer();
7541        }
7542    }
7543
7544    /**
7545     * Called by a profile owner of a managed profile to retrieve the color used for customization.
7546     * This color is used as background color of the confirm credentials screen for that user.
7547     *
7548     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7549     * @return The 24bit (0xRRGGBB) representation of the color to be used.
7550     * @throws SecurityException if {@code admin} is not a profile owner.
7551     */
7552    public @ColorInt int getOrganizationColor(@NonNull ComponentName admin) {
7553        throwIfParentInstance("getOrganizationColor");
7554        try {
7555            return mService.getOrganizationColor(admin);
7556        } catch (RemoteException re) {
7557            throw re.rethrowFromSystemServer();
7558        }
7559    }
7560
7561    /**
7562     * @hide
7563     * Retrieve the customization color for a given user.
7564     *
7565     * @param userHandle The user id of the user we're interested in.
7566     * @return The 24bit (0xRRGGBB) representation of the color to be used.
7567     */
7568    public @ColorInt int getOrganizationColorForUser(int userHandle) {
7569        try {
7570            return mService.getOrganizationColorForUser(userHandle);
7571        } catch (RemoteException re) {
7572            throw re.rethrowFromSystemServer();
7573        }
7574    }
7575
7576    /**
7577     * Called by the device owner (since API 26) or profile owner (since API 24) to set the name of
7578     * the organization under management.
7579     *
7580     * <p>If the organization name needs to be localized, it is the responsibility of the {@link
7581     * DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast and set
7582     * a new version of this string accordingly.
7583     *
7584     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7585     * @param title The organization name or {@code null} to clear a previously set name.
7586     * @throws SecurityException if {@code admin} is not a device or profile owner.
7587     */
7588    public void setOrganizationName(@NonNull ComponentName admin, @Nullable CharSequence title) {
7589        throwIfParentInstance("setOrganizationName");
7590        try {
7591            mService.setOrganizationName(admin, title);
7592        } catch (RemoteException re) {
7593            throw re.rethrowFromSystemServer();
7594        }
7595    }
7596
7597    /**
7598     * Called by a profile owner of a managed profile to retrieve the name of the organization under
7599     * management.
7600     *
7601     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7602     * @return The organization name or {@code null} if none is set.
7603     * @throws SecurityException if {@code admin} is not a profile owner.
7604     */
7605    public @Nullable CharSequence getOrganizationName(@NonNull ComponentName admin) {
7606        throwIfParentInstance("getOrganizationName");
7607        try {
7608            return mService.getOrganizationName(admin);
7609        } catch (RemoteException re) {
7610            throw re.rethrowFromSystemServer();
7611        }
7612    }
7613
7614    /**
7615     * Called by the system to retrieve the name of the organization managing the device.
7616     *
7617     * @return The organization name or {@code null} if none is set.
7618     * @throws SecurityException if the caller is not the device owner, does not hold the
7619     *         MANAGE_USERS permission and is not the system.
7620     *
7621     * @hide
7622     */
7623    @SystemApi
7624    @TestApi
7625    @SuppressLint("Doclava125")
7626    public @Nullable CharSequence getDeviceOwnerOrganizationName() {
7627        try {
7628            return mService.getDeviceOwnerOrganizationName();
7629        } catch (RemoteException re) {
7630            throw re.rethrowFromSystemServer();
7631        }
7632    }
7633
7634    /**
7635     * Retrieve the default title message used in the confirm credentials screen for a given user.
7636     *
7637     * @param userHandle The user id of the user we're interested in.
7638     * @return The organization name or {@code null} if none is set.
7639     *
7640     * @hide
7641     */
7642    public @Nullable CharSequence getOrganizationNameForUser(int userHandle) {
7643        try {
7644            return mService.getOrganizationNameForUser(userHandle);
7645        } catch (RemoteException re) {
7646            throw re.rethrowFromSystemServer();
7647        }
7648    }
7649
7650    /**
7651     * @return the {@link UserProvisioningState} for the current user - for unmanaged users will
7652     *         return {@link #STATE_USER_UNMANAGED}
7653     * @hide
7654     */
7655    @SystemApi
7656    @UserProvisioningState
7657    public int getUserProvisioningState() {
7658        throwIfParentInstance("getUserProvisioningState");
7659        if (mService != null) {
7660            try {
7661                return mService.getUserProvisioningState();
7662            } catch (RemoteException e) {
7663                throw e.rethrowFromSystemServer();
7664            }
7665        }
7666        return STATE_USER_UNMANAGED;
7667    }
7668
7669    /**
7670     * Set the {@link UserProvisioningState} for the supplied user, if they are managed.
7671     *
7672     * @param state to store
7673     * @param userHandle for user
7674     * @hide
7675     */
7676    public void setUserProvisioningState(@UserProvisioningState int state, int userHandle) {
7677        if (mService != null) {
7678            try {
7679                mService.setUserProvisioningState(state, userHandle);
7680            } catch (RemoteException e) {
7681                throw e.rethrowFromSystemServer();
7682            }
7683        }
7684    }
7685
7686    /**
7687     * Indicates the entity that controls the device or profile owner. Two users/profiles are
7688     * affiliated if the set of ids set by their device or profile owners intersect.
7689     *
7690     * <p><strong>Note:</strong> Features that depend on user affiliation (such as security logging
7691     * or {@link #bindDeviceAdminServiceAsUser}) won't be available when a secondary user or profile
7692     * is created, until it becomes affiliated. Therefore it is recommended that the appropriate
7693     * affiliation ids are set by its profile owner as soon as possible after the user/profile is
7694     * created.
7695     *
7696     * @param admin Which profile or device owner this request is associated with.
7697     * @param ids A set of opaque non-empty affiliation ids.
7698     *
7699     * @throws IllegalArgumentException if {@code ids} is null or contains an empty string.
7700     */
7701    public void setAffiliationIds(@NonNull ComponentName admin, @NonNull Set<String> ids) {
7702        throwIfParentInstance("setAffiliationIds");
7703        if (ids == null) {
7704            throw new IllegalArgumentException("ids must not be null");
7705        }
7706        try {
7707            mService.setAffiliationIds(admin, new ArrayList<>(ids));
7708        } catch (RemoteException e) {
7709            throw e.rethrowFromSystemServer();
7710        }
7711    }
7712
7713    /**
7714     * Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an
7715     * empty set if none have been set.
7716     */
7717    public @NonNull Set<String> getAffiliationIds(@NonNull ComponentName admin) {
7718        throwIfParentInstance("getAffiliationIds");
7719        try {
7720            return new ArraySet<>(mService.getAffiliationIds(admin));
7721        } catch (RemoteException e) {
7722            throw e.rethrowFromSystemServer();
7723        }
7724    }
7725
7726    /**
7727     * @hide
7728     * Returns whether this user/profile is affiliated with the device.
7729     * <p>
7730     * By definition, the user that the device owner runs on is always affiliated with the device.
7731     * Any other user/profile is considered affiliated with the device if the set specified by its
7732     * profile owner via {@link #setAffiliationIds} intersects with the device owner's.
7733     *
7734     */
7735    public boolean isAffiliatedUser() {
7736        throwIfParentInstance("isAffiliatedUser");
7737        try {
7738            return mService.isAffiliatedUser();
7739        } catch (RemoteException e) {
7740            throw e.rethrowFromSystemServer();
7741        }
7742    }
7743
7744    /**
7745     * @hide
7746     * Returns whether the uninstall for {@code packageName} for the current user is in queue
7747     * to be started
7748     * @param packageName the package to check for
7749     * @return whether the uninstall intent for {@code packageName} is pending
7750     */
7751    public boolean isUninstallInQueue(String packageName) {
7752        try {
7753            return mService.isUninstallInQueue(packageName);
7754        } catch (RemoteException re) {
7755            throw re.rethrowFromSystemServer();
7756        }
7757    }
7758
7759    /**
7760     * @hide
7761     * @param packageName the package containing active DAs to be uninstalled
7762     */
7763    public void uninstallPackageWithActiveAdmins(String packageName) {
7764        try {
7765            mService.uninstallPackageWithActiveAdmins(packageName);
7766        } catch (RemoteException re) {
7767            throw re.rethrowFromSystemServer();
7768        }
7769    }
7770
7771    /**
7772     * @hide
7773     * Remove a test admin synchronously without sending it a broadcast about being removed.
7774     * If the admin is a profile owner or device owner it will still be removed.
7775     *
7776     * @param userHandle user id to remove the admin for.
7777     * @param admin The administration compononent to remove.
7778     * @throws SecurityException if the caller is not shell / root or the admin package
7779     *         isn't a test application see {@link ApplicationInfo#FLAG_TEST_APP}.
7780     */
7781    public void forceRemoveActiveAdmin(ComponentName adminReceiver, int userHandle) {
7782        try {
7783            mService.forceRemoveActiveAdmin(adminReceiver, userHandle);
7784        } catch (RemoteException re) {
7785            throw re.rethrowFromSystemServer();
7786        }
7787    }
7788
7789    /**
7790     * Returns whether the device has been provisioned.
7791     *
7792     * <p>Not for use by third-party applications.
7793     *
7794     * @hide
7795     */
7796    @SystemApi
7797    public boolean isDeviceProvisioned() {
7798        try {
7799            return mService.isDeviceProvisioned();
7800        } catch (RemoteException re) {
7801            throw re.rethrowFromSystemServer();
7802        }
7803    }
7804
7805    /**
7806      * Writes that the provisioning configuration has been applied.
7807      *
7808      * <p>The caller must hold the {@link android.Manifest.permission#MANAGE_USERS}
7809      * permission.
7810      *
7811      * <p>Not for use by third-party applications.
7812      *
7813      * @hide
7814      */
7815    @SystemApi
7816    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
7817    public void setDeviceProvisioningConfigApplied() {
7818        try {
7819            mService.setDeviceProvisioningConfigApplied();
7820        } catch (RemoteException re) {
7821            throw re.rethrowFromSystemServer();
7822        }
7823    }
7824
7825    /**
7826     * Returns whether the provisioning configuration has been applied.
7827     *
7828     * <p>The caller must hold the {@link android.Manifest.permission#MANAGE_USERS} permission.
7829     *
7830     * <p>Not for use by third-party applications.
7831     *
7832     * @return whether the provisioning configuration has been applied.
7833     *
7834     * @hide
7835     */
7836    @SystemApi
7837    @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
7838    public boolean isDeviceProvisioningConfigApplied() {
7839        try {
7840            return mService.isDeviceProvisioningConfigApplied();
7841        } catch (RemoteException re) {
7842            throw re.rethrowFromSystemServer();
7843        }
7844    }
7845
7846    /**
7847     * @hide
7848     * Force update user setup completed status. This API has no effect on user build.
7849     * @throws {@link SecurityException} if the caller has no
7850     *         {@code android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS} or the caller is
7851     *         not {@link UserHandle#SYSTEM_USER}
7852     */
7853    public void forceUpdateUserSetupComplete() {
7854        try {
7855            mService.forceUpdateUserSetupComplete();
7856        } catch (RemoteException re) {
7857            throw re.rethrowFromSystemServer();
7858        }
7859    }
7860
7861    private void throwIfParentInstance(String functionName) {
7862        if (mParentInstance) {
7863            throw new SecurityException(functionName + " cannot be called on the parent instance");
7864        }
7865    }
7866
7867    /**
7868     * Allows the device owner to enable or disable the backup service.
7869     *
7870     * <p> Backup service manages all backup and restore mechanisms on the device. Setting this to
7871     * false will prevent data from being backed up or restored.
7872     *
7873     * <p> Backup service is off by default when device owner is present.
7874     *
7875     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7876     * @param enabled {@code true} to enable the backup service, {@code false} to disable it.
7877     * @throws SecurityException if {@code admin} is not a device owner.
7878     */
7879    public void setBackupServiceEnabled(@NonNull ComponentName admin, boolean enabled) {
7880        throwIfParentInstance("setBackupServiceEnabled");
7881        try {
7882            mService.setBackupServiceEnabled(admin, enabled);
7883        } catch (RemoteException re) {
7884            throw re.rethrowFromSystemServer();
7885        }
7886    }
7887
7888    /**
7889     * Return whether the backup service is enabled by the device owner.
7890     *
7891     * <p> Backup service manages all backup and restore mechanisms on the device.
7892     *
7893     * @return {@code true} if backup service is enabled, {@code false} otherwise.
7894     * @see #setBackupServiceEnabled
7895     */
7896    public boolean isBackupServiceEnabled(@NonNull ComponentName admin) {
7897        throwIfParentInstance("isBackupServiceEnabled");
7898        try {
7899            return mService.isBackupServiceEnabled(admin);
7900        } catch (RemoteException re) {
7901            throw re.rethrowFromSystemServer();
7902        }
7903    }
7904
7905    /**
7906     * Called by a device owner to control the network logging feature.
7907     *
7908     * <p> Network logs contain DNS lookup and connect() library call events. The following library
7909     *     functions are recorded while network logging is active:
7910     *     <ul>
7911     *       <li>{@code getaddrinfo()}</li>
7912     *       <li>{@code gethostbyname()}</li>
7913     *       <li>{@code connect()}</li>
7914     *     </ul>
7915     *
7916     * <p> Network logging is a low-overhead tool for forensics but it is not guaranteed to use
7917     *     full system call logging; event reporting is enabled by default for all processes but not
7918     *     strongly enforced.
7919     *     Events from applications using alternative implementations of libc, making direct kernel
7920     *     calls, or deliberately obfuscating traffic may not be recorded.
7921     *
7922     * <p> Some common network events may not be reported. For example:
7923     *     <ul>
7924     *       <li>Applications may hardcode IP addresses to reduce the number of DNS lookups, or use
7925     *           an alternative system for name resolution, and so avoid calling
7926     *           {@code getaddrinfo()} or {@code gethostbyname}.</li>
7927     *       <li>Applications may use datagram sockets for performance reasons, for example
7928     *           for a game client. Calling {@code connect()} is unnecessary for this kind of
7929     *           socket, so it will not trigger a network event.</li>
7930     *     </ul>
7931     *
7932     * <p> It is possible to directly intercept layer 3 traffic leaving the device using an
7933     *     always-on VPN service.
7934     *     See {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean)}
7935     *     and {@link android.net.VpnService} for details.
7936     *
7937     * <p><strong>Note:</strong> The device owner won't be able to retrieve network logs if there
7938     * are unaffiliated secondary users or profiles on the device, regardless of whether the
7939     * feature is enabled. Logs will be discarded if the internal buffer fills up while waiting for
7940     * all users to become affiliated. Therefore it's recommended that affiliation ids are set for
7941     * new users as soon as possible after provisioning via {@link #setAffiliationIds}.
7942     *
7943     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7944     * @param enabled whether network logging should be enabled or not.
7945     * @throws SecurityException if {@code admin} is not a device owner.
7946     * @see #retrieveNetworkLogs
7947     */
7948    public void setNetworkLoggingEnabled(@NonNull ComponentName admin, boolean enabled) {
7949        throwIfParentInstance("setNetworkLoggingEnabled");
7950        try {
7951            mService.setNetworkLoggingEnabled(admin, enabled);
7952        } catch (RemoteException re) {
7953            throw re.rethrowFromSystemServer();
7954        }
7955    }
7956
7957    /**
7958     * Return whether network logging is enabled by a device owner.
7959     *
7960     * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Can only
7961     * be {@code null} if the caller has MANAGE_USERS permission.
7962     * @return {@code true} if network logging is enabled by device owner, {@code false} otherwise.
7963     * @throws SecurityException if {@code admin} is not a device owner and caller has
7964     * no MANAGE_USERS permission
7965     */
7966    public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) {
7967        throwIfParentInstance("isNetworkLoggingEnabled");
7968        try {
7969            return mService.isNetworkLoggingEnabled(admin);
7970        } catch (RemoteException re) {
7971            throw re.rethrowFromSystemServer();
7972        }
7973    }
7974
7975    /**
7976     * Called by device owner to retrieve the most recent batch of network logging events.
7977     * A device owner has to provide a batchToken provided as part of
7978     * {@link DeviceAdminReceiver#onNetworkLogsAvailable} callback. If the token doesn't match the
7979     * token of the most recent available batch of logs, {@code null} will be returned.
7980     *
7981     * <p> {@link NetworkEvent} can be one of {@link DnsEvent} or {@link ConnectEvent}.
7982     *
7983     * <p> The list of network events is sorted chronologically, and contains at most 1200 events.
7984     *
7985     * <p> Access to the logs is rate limited and this method will only return a new batch of logs
7986     * after the device device owner has been notified via
7987     * {@link DeviceAdminReceiver#onNetworkLogsAvailable}.
7988     *
7989     * <p>If a secondary user or profile is created, calling this method will throw a
7990     * {@link SecurityException} until all users become affiliated again. It will also no longer be
7991     * possible to retrieve the network logs batch with the most recent batchToken provided
7992     * by {@link DeviceAdminReceiver#onNetworkLogsAvailable}. See
7993     * {@link DevicePolicyManager#setAffiliationIds}.
7994     *
7995     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
7996     * @param batchToken A token of the batch to retrieve
7997     * @return A new batch of network logs which is a list of {@link NetworkEvent}. Returns
7998     *        {@code null} if the batch represented by batchToken is no longer available or if
7999     *        logging is disabled.
8000     * @throws SecurityException if {@code admin} is not a device owner, or there is at least one
8001     * profile or secondary user that is not affiliated with the device owner user.
8002     * @see DeviceAdminReceiver#onNetworkLogsAvailable
8003     */
8004    public @Nullable List<NetworkEvent> retrieveNetworkLogs(@NonNull ComponentName admin,
8005            long batchToken) {
8006        throwIfParentInstance("retrieveNetworkLogs");
8007        try {
8008            return mService.retrieveNetworkLogs(admin, batchToken);
8009        } catch (RemoteException re) {
8010            throw re.rethrowFromSystemServer();
8011        }
8012    }
8013
8014    /**
8015     * Called by a device owner to bind to a service from a profile owner or vice versa.
8016     * See {@link #getBindDeviceAdminTargetUsers} for a definition of which
8017     * device/profile owners are allowed to bind to services of another profile/device owner.
8018     * <p>
8019     * The service must be protected by {@link android.Manifest.permission#BIND_DEVICE_ADMIN}.
8020     * Note that the {@link Context} used to obtain this
8021     * {@link DevicePolicyManager} instance via {@link Context#getSystemService(Class)} will be used
8022     * to bind to the {@link android.app.Service}.
8023     *
8024     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
8025     * @param serviceIntent Identifies the service to connect to.  The Intent must specify either an
8026     *        explicit component name or a package name to match an
8027     *        {@link IntentFilter} published by a service.
8028     * @param conn Receives information as the service is started and stopped in main thread. This
8029     *        must be a valid {@link ServiceConnection} object; it must not be {@code null}.
8030     * @param flags Operation options for the binding operation. See
8031     *        {@link Context#bindService(Intent, ServiceConnection, int)}.
8032     * @param targetUser Which user to bind to. Must be one of the users returned by
8033     *        {@link #getBindDeviceAdminTargetUsers}, otherwise a {@link SecurityException} will
8034     *        be thrown.
8035     * @return If you have successfully bound to the service, {@code true} is returned;
8036     *         {@code false} is returned if the connection is not made and you will not
8037     *         receive the service object.
8038     *
8039     * @see Context#bindService(Intent, ServiceConnection, int)
8040     * @see #getBindDeviceAdminTargetUsers(ComponentName)
8041     */
8042    public boolean bindDeviceAdminServiceAsUser(
8043            @NonNull ComponentName admin,  Intent serviceIntent, @NonNull ServiceConnection conn,
8044            @Context.BindServiceFlags int flags, @NonNull UserHandle targetUser) {
8045        throwIfParentInstance("bindDeviceAdminServiceAsUser");
8046        // Keep this in sync with ContextImpl.bindServiceCommon.
8047        try {
8048            final IServiceConnection sd = mContext.getServiceDispatcher(
8049                    conn, mContext.getMainThreadHandler(), flags);
8050            serviceIntent.prepareToLeaveProcess(mContext);
8051            return mService.bindDeviceAdminServiceAsUser(admin,
8052                    mContext.getIApplicationThread(), mContext.getActivityToken(), serviceIntent,
8053                    sd, flags, targetUser.getIdentifier());
8054        } catch (RemoteException re) {
8055            throw re.rethrowFromSystemServer();
8056        }
8057    }
8058
8059    /**
8060     * Returns the list of target users that the calling device or profile owner can use when
8061     * calling {@link #bindDeviceAdminServiceAsUser}.
8062     * <p>
8063     * A device owner can bind to a service from a profile owner and vice versa, provided that:
8064     * <ul>
8065     * <li>Both belong to the same package name.
8066     * <li>Both users are affiliated. See {@link #setAffiliationIds}.
8067     * </ul>
8068     */
8069    public @NonNull List<UserHandle> getBindDeviceAdminTargetUsers(@NonNull ComponentName admin) {
8070        throwIfParentInstance("getBindDeviceAdminTargetUsers");
8071        try {
8072            return mService.getBindDeviceAdminTargetUsers(admin);
8073        } catch (RemoteException re) {
8074            throw re.rethrowFromSystemServer();
8075        }
8076    }
8077
8078    /**
8079     * Called by the system to get the time at which the device owner last retrieved security
8080     * logging entries.
8081     *
8082     * @return the time at which the device owner most recently retrieved security logging entries,
8083     *         in milliseconds since epoch; -1 if security logging entries were never retrieved.
8084     * @throws SecurityException if the caller is not the device owner, does not hold the
8085     *         MANAGE_USERS permission and is not the system.
8086     *
8087     * @hide
8088     */
8089    @TestApi
8090    public long getLastSecurityLogRetrievalTime() {
8091        try {
8092            return mService.getLastSecurityLogRetrievalTime();
8093        } catch (RemoteException re) {
8094            throw re.rethrowFromSystemServer();
8095        }
8096    }
8097
8098    /**
8099     * Called by the system to get the time at which the device owner last requested a bug report.
8100     *
8101     * @return the time at which the device owner most recently requested a bug report, in
8102     *         milliseconds since epoch; -1 if a bug report was never requested.
8103     * @throws SecurityException if the caller is not the device owner, does not hold the
8104     *         MANAGE_USERS permission and is not the system.
8105     *
8106     * @hide
8107     */
8108    @TestApi
8109    public long getLastBugReportRequestTime() {
8110        try {
8111            return mService.getLastBugReportRequestTime();
8112        } catch (RemoteException re) {
8113            throw re.rethrowFromSystemServer();
8114        }
8115    }
8116
8117    /**
8118     * Called by the system to get the time at which the device owner last retrieved network logging
8119     * events.
8120     *
8121     * @return the time at which the device owner most recently retrieved network logging events, in
8122     *         milliseconds since epoch; -1 if network logging events were never retrieved.
8123     * @throws SecurityException if the caller is not the device owner, does not hold the
8124     *         MANAGE_USERS permission and is not the system.
8125     *
8126     * @hide
8127     */
8128    @TestApi
8129    public long getLastNetworkLogRetrievalTime() {
8130        try {
8131            return mService.getLastNetworkLogRetrievalTime();
8132        } catch (RemoteException re) {
8133            throw re.rethrowFromSystemServer();
8134        }
8135    }
8136
8137    /**
8138     * Called by the system to find out whether the current user's IME was set by the device/profile
8139     * owner or the user.
8140     *
8141     * @return {@code true} if the user's IME was set by the device or profile owner, {@code false}
8142     *         otherwise.
8143     * @throws SecurityException if the caller is not the device owner/profile owner.
8144     *
8145     * @hide
8146     */
8147    @TestApi
8148    public boolean isCurrentInputMethodSetByOwner() {
8149        try {
8150            return mService.isCurrentInputMethodSetByOwner();
8151        } catch (RemoteException re) {
8152            throw re.rethrowFromSystemServer();
8153        }
8154    }
8155
8156    /**
8157     * Called by the system to get a list of CA certificates that were installed by the device or
8158     * profile owner.
8159     *
8160     * <p> The caller must be the target user's device owner/profile Owner or hold the
8161     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
8162     *
8163     * @param user The user for whom to retrieve information.
8164     * @return list of aliases identifying CA certificates installed by the device or profile owner
8165     * @throws SecurityException if the caller does not have permission to retrieve information
8166     *         about the given user's CA certificates.
8167     *
8168     * @hide
8169     */
8170    @TestApi
8171    public List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user) {
8172        try {
8173            return mService.getOwnerInstalledCaCerts(user).getList();
8174        } catch (RemoteException re) {
8175            throw re.rethrowFromSystemServer();
8176        }
8177    }
8178
8179    /**
8180     * Called by the device owner or profile owner to clear application user data of a given
8181     * package. The behaviour of this is equivalent to the target application calling
8182     * {@link android.app.ActivityManager#clearApplicationUserData()}.
8183     *
8184     * <p><strong>Note:</strong> an application can store data outside of its application data, e.g.
8185     * external storage or user dictionary. This data will not be wiped by calling this API.
8186     *
8187     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
8188     * @param packageName The name of the package which will have its user data wiped.
8189     * @param listener A callback object that will inform the caller when the clearing is done.
8190     * @param handler The handler indicating the thread on which the listener should be invoked.
8191     * @throws SecurityException if the caller is not the device owner/profile owner.
8192     * @return whether the clearing succeeded.
8193     */
8194    public boolean clearApplicationUserData(@NonNull ComponentName admin,
8195            @NonNull String packageName, @NonNull OnClearApplicationUserDataListener listener,
8196            @NonNull Handler handler) {
8197        throwIfParentInstance("clearAppData");
8198        try {
8199            return mService.clearApplicationUserData(admin, packageName,
8200                    new IPackageDataObserver.Stub() {
8201                        public void onRemoveCompleted(String pkg, boolean succeeded) {
8202                            handler.post(() ->
8203                                    listener.onApplicationUserDataCleared(pkg, succeeded));
8204                        }
8205                    });
8206        } catch (RemoteException re) {
8207            throw re.rethrowFromSystemServer();
8208        }
8209    }
8210
8211    /**
8212     * Callback used in {@link #clearApplicationUserData}
8213     * to indicate that the clearing of an application's user data is done.
8214     */
8215    public interface OnClearApplicationUserDataListener {
8216        /**
8217         * Method invoked when clearing the application user data has completed.
8218         *
8219         * @param packageName The name of the package which had its user data cleared.
8220         * @param succeeded Whether the clearing succeeded. Clearing fails for device administrator
8221         *                  apps and protected system packages.
8222         */
8223        void onApplicationUserDataCleared(String packageName, boolean succeeded);
8224    }
8225}
8226