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