• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 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.os;
18 
19 import android.Manifest;
20 import android.accounts.AccountManager;
21 import android.annotation.IntDef;
22 import android.annotation.Nullable;
23 import android.annotation.RequiresPermission;
24 import android.annotation.SystemApi;
25 import android.annotation.UserIdInt;
26 import android.app.Activity;
27 import android.app.ActivityManager;
28 import android.app.ActivityManagerNative;
29 import android.app.admin.DevicePolicyManager;
30 import android.content.ComponentName;
31 import android.content.Context;
32 import android.content.Intent;
33 import android.content.IntentSender;
34 import android.content.pm.UserInfo;
35 import android.content.res.Resources;
36 import android.graphics.Bitmap;
37 import android.graphics.BitmapFactory;
38 import android.graphics.Rect;
39 import android.graphics.drawable.Drawable;
40 import android.provider.Settings;
41 import android.telephony.TelephonyManager;
42 import android.view.WindowManager.LayoutParams;
43 
44 import com.android.internal.R;
45 
46 import java.io.IOException;
47 import java.lang.annotation.Retention;
48 import java.lang.annotation.RetentionPolicy;
49 import java.util.ArrayList;
50 import java.util.List;
51 
52 /**
53  * Manages users and user details on a multi-user system. There are two major categories of
54  * users: fully customizable users with their own login, and managed profiles that share a workspace
55  * with a related user.
56  * <p>
57  * Users are different from accounts, which are managed by
58  * {@link AccountManager}. Each user can have their own set of accounts.
59  * <p>
60  * See {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} for more on managed profiles.
61  */
62 public class UserManager {
63 
64     private static String TAG = "UserManager";
65     private final IUserManager mService;
66     private final Context mContext;
67 
68     /**
69      * @hide
70      * No user restriction.
71      */
72     @SystemApi
73     public static final int RESTRICTION_NOT_SET = 0x0;
74 
75     /**
76      * @hide
77      * User restriction set by system/user.
78      */
79     @SystemApi
80     public static final int RESTRICTION_SOURCE_SYSTEM = 0x1;
81 
82     /**
83      * @hide
84      * User restriction set by a device owner.
85      */
86     @SystemApi
87     public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 0x2;
88 
89     /**
90      * @hide
91      * User restriction set by a profile owner.
92      */
93     @SystemApi
94     public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 0x4;
95 
96     /** @hide */
97     @Retention(RetentionPolicy.SOURCE)
98     @IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM,
99             RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER})
100     @SystemApi
101     public @interface UserRestrictionSource {}
102 
103     /**
104      * Specifies if a user is disallowed from adding and removing accounts, unless they are
105      * {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by
106      * Authenticator.
107      * The default value is <code>false</code>.
108      *
109      * <p>From {@link android.os.Build.VERSION_CODES#N} a profile or device owner app can still
110      * use {@link android.accounts.AccountManager} APIs to add or remove accounts when account
111      * management is disallowed.
112      *
113      * <p>Key for user restrictions.
114      * <p>Type: Boolean
115      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
116      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
117      * @see #getUserRestrictions()
118      */
119     public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
120 
121     /**
122      * Specifies if a user is disallowed from changing Wi-Fi
123      * access points. The default value is <code>false</code>.
124      * <p>This restriction has no effect in a managed profile.
125      *
126      * <p>Key for user restrictions.
127      * <p>Type: Boolean
128      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
129      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
130      * @see #getUserRestrictions()
131      */
132     public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
133 
134     /**
135      * Specifies if a user is disallowed from installing applications.
136      * The default value is <code>false</code>.
137      *
138      * <p>Key for user restrictions.
139      * <p>Type: Boolean
140      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
141      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
142      * @see #getUserRestrictions()
143      */
144     public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
145 
146     /**
147      * Specifies if a user is disallowed from uninstalling applications.
148      * The default value is <code>false</code>.
149      *
150      * <p>Key for user restrictions.
151      * <p>Type: Boolean
152      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
153      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
154      * @see #getUserRestrictions()
155      */
156     public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
157 
158     /**
159      * Specifies if a user is disallowed from turning on location sharing.
160      * The default value is <code>false</code>.
161      * <p>In a managed profile, location sharing always reflects the primary user's setting, but
162      * can be overridden and forced off by setting this restriction to true in the managed profile.
163      *
164      * <p>Key for user restrictions.
165      * <p>Type: Boolean
166      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
167      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
168      * @see #getUserRestrictions()
169      */
170     public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
171 
172     /**
173      * Specifies if a user is disallowed from enabling the
174      * "Unknown Sources" setting, that allows installation of apps from unknown sources.
175      * The default value is <code>false</code>.
176      *
177      * <p>Key for user restrictions.
178      * <p>Type: Boolean
179      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
180      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
181      * @see #getUserRestrictions()
182      */
183     public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
184 
185     /**
186      * Specifies if a user is disallowed from configuring bluetooth.
187      * This does <em>not</em> restrict the user from turning bluetooth on or off.
188      * The default value is <code>false</code>.
189      * <p>This restriction has no effect in a managed profile.
190      *
191      * <p>Key for user restrictions.
192      * <p>Type: Boolean
193      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
194      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
195      * @see #getUserRestrictions()
196      */
197     public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
198 
199     /**
200      * Specifies if a user is disallowed from transferring files over
201      * USB. This can only be set by device owners and profile owners on the primary user.
202      * The default value is <code>false</code>.
203      *
204      * <p>Key for user restrictions.
205      * <p>Type: Boolean
206      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
207      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
208      * @see #getUserRestrictions()
209      */
210     public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
211 
212     /**
213      * Specifies if a user is disallowed from configuring user
214      * credentials. The default value is <code>false</code>.
215      *
216      * <p>Key for user restrictions.
217      * <p>Type: Boolean
218      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
219      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
220      * @see #getUserRestrictions()
221      */
222     public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
223 
224     /**
225      * When set on the primary user this specifies if the user can remove other users.
226      * When set on a secondary user, this specifies if the user can remove itself.
227      * This restriction has no effect on managed profiles.
228      * The default value is <code>false</code>.
229      *
230      * <p>Key for user restrictions.
231      * <p>Type: Boolean
232      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
233      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
234      * @see #getUserRestrictions()
235      */
236     public static final String DISALLOW_REMOVE_USER = "no_remove_user";
237 
238     /**
239      * Specifies if a user is disallowed from enabling or
240      * accessing debugging features. The default value is <code>false</code>.
241      *
242      * <p>Key for user restrictions.
243      * <p>Type: Boolean
244      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
245      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
246      * @see #getUserRestrictions()
247      */
248     public static final String DISALLOW_DEBUGGING_FEATURES = "no_debugging_features";
249 
250     /**
251      * Specifies if a user is disallowed from configuring VPN.
252      * The default value is <code>false</code>.
253      * This restriction has an effect in a managed profile only from
254      * {@link android.os.Build.VERSION_CODES#M}
255      *
256      * <p>Key for user restrictions.
257      * <p>Type: Boolean
258      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
259      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
260      * @see #getUserRestrictions()
261      */
262     public static final String DISALLOW_CONFIG_VPN = "no_config_vpn";
263 
264     /**
265      * Specifies if a user is disallowed from configuring Tethering
266      * & portable hotspots. This can only be set by device owners and profile owners on the
267      * primary user. The default value is <code>false</code>.
268      *
269      * <p>Key for user restrictions.
270      * <p>Type: Boolean
271      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
272      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
273      * @see #getUserRestrictions()
274      */
275     public static final String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
276 
277     /**
278      * Specifies if a user is disallowed from resetting network settings
279      * from Settings. This can only be set by device owners and profile owners on the primary user.
280      * The default value is <code>false</code>.
281      * <p>This restriction has no effect on secondary users and managed profiles since only the
282      * primary user can reset the network settings of the device.
283      *
284      * <p>Key for user restrictions.
285      * <p>Type: Boolean
286      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
287      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
288      * @see #getUserRestrictions()
289      */
290     public static final String DISALLOW_NETWORK_RESET = "no_network_reset";
291 
292     /**
293      * Specifies if a user is disallowed from factory resetting
294      * from Settings. This can only be set by device owners and profile owners on the primary user.
295      * The default value is <code>false</code>.
296      * <p>This restriction has no effect on secondary users and managed profiles since only the
297      * primary user can factory reset the device.
298      *
299      * <p>Key for user restrictions.
300      * <p>Type: Boolean
301      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
302      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
303      * @see #getUserRestrictions()
304      */
305     public static final String DISALLOW_FACTORY_RESET = "no_factory_reset";
306 
307     /**
308      * Specifies if a user is disallowed from adding new users and
309      * profiles. This can only be set by device owners and profile owners on the primary user.
310      * The default value is <code>false</code>.
311      * <p>This restriction has no effect on secondary users and managed profiles since only the
312      * primary user can add other users.
313      *
314      * <p>Key for user restrictions.
315      * <p>Type: Boolean
316      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
317      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
318      * @see #getUserRestrictions()
319      */
320     public static final String DISALLOW_ADD_USER = "no_add_user";
321 
322     /**
323      * Specifies if a user is disallowed from disabling application
324      * verification. The default value is <code>false</code>.
325      *
326      * <p>Key for user restrictions.
327      * <p>Type: Boolean
328      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
329      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
330      * @see #getUserRestrictions()
331      */
332     public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
333 
334     /**
335      * Specifies if a user is disallowed from configuring cell
336      * broadcasts. This can only be set by device owners and profile owners on the primary user.
337      * The default value is <code>false</code>.
338      * <p>This restriction has no effect on secondary users and managed profiles since only the
339      * primary user can configure cell broadcasts.
340      *
341      * <p>Key for user restrictions.
342      * <p>Type: Boolean
343      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
344      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
345      * @see #getUserRestrictions()
346      */
347     public static final String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
348 
349     /**
350      * Specifies if a user is disallowed from configuring mobile
351      * networks. This can only be set by device owners and profile owners on the primary user.
352      * The default value is <code>false</code>.
353      * <p>This restriction has no effect on secondary users and managed profiles since only the
354      * primary user can configure mobile networks.
355      *
356      * <p>Key for user restrictions.
357      * <p>Type: Boolean
358      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
359      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
360      * @see #getUserRestrictions()
361      */
362     public static final String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
363 
364     /**
365      * Specifies if a user is disallowed from modifying
366      * applications in Settings or launchers. The following actions will not be allowed when this
367      * restriction is enabled:
368      * <li>uninstalling apps</li>
369      * <li>disabling apps</li>
370      * <li>clearing app caches</li>
371      * <li>clearing app data</li>
372      * <li>force stopping apps</li>
373      * <li>clearing app defaults</li>
374      * <p>
375      * The default value is <code>false</code>.
376      *
377      * <p>Key for user restrictions.
378      * <p>Type: Boolean
379      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
380      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
381      * @see #getUserRestrictions()
382      */
383     public static final String DISALLOW_APPS_CONTROL = "no_control_apps";
384 
385     /**
386      * Specifies if a user is disallowed from mounting
387      * physical external media. This can only be set by device owners and profile owners on the
388      * primary user. The default value is <code>false</code>.
389      *
390      * <p>Key for user restrictions.
391      * <p>Type: Boolean
392      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
393      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
394      * @see #getUserRestrictions()
395      */
396     public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
397 
398     /**
399      * Specifies if a user is disallowed from adjusting microphone
400      * volume. If set, the microphone will be muted. This can only be set by device owners
401      * and profile owners on the primary user. The default value is <code>false</code>.
402      *
403      * <p>Key for user restrictions.
404      * <p>Type: Boolean
405      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
406      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
407      * @see #getUserRestrictions()
408      */
409     public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
410 
411     /**
412      * Specifies if a user is disallowed from adjusting the master
413      * volume. If set, the master volume will be muted. This can only be set by device owners
414      * and profile owners on the primary user. The default value is <code>false</code>.
415      *
416      * <p>Key for user restrictions.
417      * <p>Type: Boolean
418      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
419      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
420      * @see #getUserRestrictions()
421      */
422     public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
423 
424     /**
425      * Specifies that the user is not allowed to make outgoing
426      * phone calls. Emergency calls are still permitted.
427      * The default value is <code>false</code>.
428      * <p>This restriction has no effect on managed profiles.
429      *
430      * <p>Key for user restrictions.
431      * <p>Type: Boolean
432      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
433      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
434      * @see #getUserRestrictions()
435      */
436     public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
437 
438     /**
439      * Specifies that the user is not allowed to send or receive
440      * SMS messages. The default value is <code>false</code>.
441      *
442      * <p>Key for user restrictions.
443      * <p>Type: Boolean
444      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
445      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
446      * @see #getUserRestrictions()
447      */
448     public static final String DISALLOW_SMS = "no_sms";
449 
450     /**
451      * Specifies if the user is not allowed to have fun. In some cases, the
452      * device owner may wish to prevent the user from experiencing amusement or
453      * joy while using the device. The default value is <code>false</code>.
454      *
455      * <p>Key for user restrictions.
456      * <p>Type: Boolean
457      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
458      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
459      * @see #getUserRestrictions()
460      */
461     public static final String DISALLOW_FUN = "no_fun";
462 
463     /**
464      * Specifies that windows besides app windows should not be
465      * created. This will block the creation of the following types of windows.
466      * <li>{@link LayoutParams#TYPE_TOAST}</li>
467      * <li>{@link LayoutParams#TYPE_PHONE}</li>
468      * <li>{@link LayoutParams#TYPE_PRIORITY_PHONE}</li>
469      * <li>{@link LayoutParams#TYPE_SYSTEM_ALERT}</li>
470      * <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li>
471      * <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li>
472      *
473      * <p>This can only be set by device owners and profile owners on the primary user.
474      * The default value is <code>false</code>.
475      *
476      * <p>Key for user restrictions.
477      * <p>Type: Boolean
478      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
479      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
480      * @see #getUserRestrictions()
481      */
482     public static final String DISALLOW_CREATE_WINDOWS = "no_create_windows";
483 
484     /**
485      * Specifies if what is copied in the clipboard of this profile can
486      * be pasted in related profiles. Does not restrict if the clipboard of related profiles can be
487      * pasted in this profile.
488      * The default value is <code>false</code>.
489      *
490      * <p>Key for user restrictions.
491      * <p>Type: Boolean
492      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
493      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
494      * @see #getUserRestrictions()
495      */
496     public static final String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
497 
498     /**
499      * Specifies if the user is not allowed to use NFC to beam out data from apps.
500      * The default value is <code>false</code>.
501      *
502      * <p>Key for user restrictions.
503      * <p>Type: Boolean
504      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
505      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
506      * @see #getUserRestrictions()
507      */
508     public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
509 
510     /**
511      * Hidden user restriction to disallow access to wallpaper manager APIs. This restriction
512      * generally means that wallpapers are not supported for the particular user. This user
513      * restriction is always set for managed profiles, because such profiles don't have wallpapers.
514      * @hide
515      * @see #DISALLOW_SET_WALLPAPER
516      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
517      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
518      * @see #getUserRestrictions()
519      */
520     public static final String DISALLOW_WALLPAPER = "no_wallpaper";
521 
522     /**
523      * User restriction to disallow setting a wallpaper. Profile owner and device owner
524      * are able to set wallpaper regardless of this restriction.
525      * The default value is <code>false</code>.
526      *
527      * <p>Key for user restrictions.
528      * <p>Type: Boolean
529      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
530      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
531      * @see #getUserRestrictions()
532      */
533     public static final String DISALLOW_SET_WALLPAPER = "no_set_wallpaper";
534 
535     /**
536      * Specifies if the user is not allowed to reboot the device into safe boot mode.
537      * This can only be set by device owners and profile owners on the primary user.
538      * The default value is <code>false</code>.
539      *
540      * <p>Key for user restrictions.
541      * <p>Type: Boolean
542      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
543      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
544      * @see #getUserRestrictions()
545      */
546     public static final String DISALLOW_SAFE_BOOT = "no_safe_boot";
547 
548     /**
549      * Specifies if a user is not allowed to record audio. This restriction is always enabled for
550      * background users. The default value is <code>false</code>.
551      *
552      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
553      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
554      * @see #getUserRestrictions()
555      * @hide
556      */
557     public static final String DISALLOW_RECORD_AUDIO = "no_record_audio";
558 
559     /**
560      * Specifies if a user is not allowed to run in the background and should be stopped during
561      * user switch. The default value is <code>false</code>.
562      *
563      * <p>This restriction can be set by device owners and profile owners.
564      *
565      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
566      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
567      * @see #getUserRestrictions()
568      * @hide
569      */
570     public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
571 
572     /**
573      * Specifies if a user is not allowed to use the camera.
574      *
575      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
576      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
577      * @see #getUserRestrictions()
578      * @hide
579      */
580     public static final String DISALLOW_CAMERA = "no_camera";
581 
582     /**
583      * Specifies if a user is not allowed to unmute the device's master volume.
584      *
585      * @see DevicePolicyManager#setMasterVolumeMuted(ComponentName, boolean)
586      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
587      * @see #getUserRestrictions()
588      * @hide
589      */
590     public static final String DISALLLOW_UNMUTE_DEVICE = "disallow_unmute_device";
591 
592     /**
593      * Specifies if a user is not allowed to use cellular data when roaming. This can only be set by
594      * device owners. The default value is <code>false</code>.
595      *
596      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
597      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
598      * @see #getUserRestrictions()
599      */
600     public static final String DISALLOW_DATA_ROAMING = "no_data_roaming";
601 
602     /**
603      * Specifies if a user is not allowed to change their icon. Device owner and profile owner
604      * can set this restriction. When it is set by device owner, only the target user will be
605      * affected. The default value is <code>false</code>.
606      *
607      * <p>Key for user restrictions.
608      * <p>Type: Boolean
609      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
610      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
611      * @see #getUserRestrictions()
612      */
613     public static final String DISALLOW_SET_USER_ICON = "no_set_user_icon";
614 
615     /**
616      * Specifies if a user is not allowed to enable the oem unlock setting. The default value is
617      * <code>false</code>. Setting this restriction has no effect if the bootloader is already
618      * unlocked.
619      *
620      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
621      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
622      * @see #getUserRestrictions()
623      * @hide
624      */
625     public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
626 
627     /**
628      * Allows apps in the parent profile to handle web links from the managed profile.
629      *
630      * This user restriction has an effect only in a managed profile.
631      * If set:
632      * Intent filters of activities in the parent profile with action
633      * {@link android.content.Intent#ACTION_VIEW},
634      * category {@link android.content.Intent#CATEGORY_BROWSABLE}, scheme http or https, and which
635      * define a host can handle intents from the managed profile.
636      * The default value is <code>false</code>.
637      *
638      * <p>Key for user restrictions.
639      * <p>Type: Boolean
640      * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
641      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
642      * @see #getUserRestrictions()
643      */
644     public static final String ALLOW_PARENT_PROFILE_APP_LINKING
645             = "allow_parent_profile_app_linking";
646 
647     /**
648      * Application restriction key that is used to indicate the pending arrival
649      * of real restrictions for the app.
650      *
651      * <p>
652      * Applications that support restrictions should check for the presence of this key.
653      * A <code>true</code> value indicates that restrictions may be applied in the near
654      * future but are not available yet. It is the responsibility of any
655      * management application that sets this flag to update it when the final
656      * restrictions are enforced.
657      *
658      * <p>Key for application restrictions.
659      * <p>Type: Boolean
660      * @see android.app.admin.DevicePolicyManager#setApplicationRestrictions(
661      *      android.content.ComponentName, String, Bundle)
662      * @see android.app.admin.DevicePolicyManager#getApplicationRestrictions(
663      *      android.content.ComponentName, String)
664      */
665     public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
666 
667     private static final String ACTION_CREATE_USER = "android.os.action.CREATE_USER";
668 
669     /**
670      * Extra containing a name for the user being created. Optional parameter passed to
671      * ACTION_CREATE_USER activity.
672      * @hide
673      */
674     public static final String EXTRA_USER_NAME = "android.os.extra.USER_NAME";
675 
676     /**
677      * Extra containing account name for the user being created. Optional parameter passed to
678      * ACTION_CREATE_USER activity.
679      * @hide
680      */
681     public static final String EXTRA_USER_ACCOUNT_NAME = "android.os.extra.USER_ACCOUNT_NAME";
682 
683     /**
684      * Extra containing account type for the user being created. Optional parameter passed to
685      * ACTION_CREATE_USER activity.
686      * @hide
687      */
688     public static final String EXTRA_USER_ACCOUNT_TYPE = "android.os.extra.USER_ACCOUNT_TYPE";
689 
690     /**
691      * Extra containing account-specific data for the user being created. Optional parameter passed
692      * to ACTION_CREATE_USER activity.
693      * @hide
694      */
695     public static final String EXTRA_USER_ACCOUNT_OPTIONS
696             = "android.os.extra.USER_ACCOUNT_OPTIONS";
697 
698     /** @hide */
699     public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
700     /** @hide */
701     public static final int PIN_VERIFICATION_FAILED_NOT_SET = -2;
702     /** @hide */
703     public static final int PIN_VERIFICATION_SUCCESS = -1;
704 
705     /**
706      * Error result indicating that this user is not allowed to add other users on this device.
707      * This is a result code returned from the activity created by the intent
708      * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
709      */
710     public static final int USER_CREATION_FAILED_NOT_PERMITTED = Activity.RESULT_FIRST_USER;
711 
712     /**
713      * Error result indicating that no more users can be created on this device.
714      * This is a result code returned from the activity created by the intent
715      * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
716      */
717     public static final int USER_CREATION_FAILED_NO_MORE_USERS = Activity.RESULT_FIRST_USER + 1;
718 
719     /** @hide */
get(Context context)720     public static UserManager get(Context context) {
721         return (UserManager) context.getSystemService(Context.USER_SERVICE);
722     }
723 
724     /** @hide */
UserManager(Context context, IUserManager service)725     public UserManager(Context context, IUserManager service) {
726         mService = service;
727         mContext = context;
728     }
729 
730     /**
731      * Returns whether this device supports multiple users with their own login and customizable
732      * space.
733      * @return whether the device supports multiple users.
734      */
supportsMultipleUsers()735     public static boolean supportsMultipleUsers() {
736         return getMaxSupportedUsers() > 1
737                 && SystemProperties.getBoolean("fw.show_multiuserui",
738                 Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI));
739     }
740 
741     /**
742      * @hide
743      * @return Whether the device is running with split system user. It means the system user and
744      * primary user are two separate users. Previously system user and primary user are combined as
745      * a single owner user.  see @link {android.os.UserHandle#USER_OWNER}
746      */
isSplitSystemUser()747     public static boolean isSplitSystemUser() {
748         return SystemProperties.getBoolean("ro.fw.system_user_split", false);
749     }
750 
751     /**
752      * Returns whether switching users is currently allowed.
753      * <p>For instance switching users is not allowed if the current user is in a phone call,
754      * or system user hasn't been unlocked yet
755      * @hide
756      */
canSwitchUsers()757     public boolean canSwitchUsers() {
758         boolean allowUserSwitchingWhenSystemUserLocked = Settings.Global.getInt(
759                 mContext.getContentResolver(),
760                 Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0;
761         boolean isSystemUserUnlocked = isUserUnlocked(UserHandle.SYSTEM);
762         boolean inCall = TelephonyManager.getDefault().getCallState()
763                 != TelephonyManager.CALL_STATE_IDLE;
764         return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall;
765     }
766 
767     /**
768      * Returns the user handle for the user that this process is running under.
769      *
770      * @return the user handle of this process.
771      * @hide
772      */
getUserHandle()773     public @UserIdInt int getUserHandle() {
774         return UserHandle.myUserId();
775     }
776 
777     /**
778      * Returns the user name of the user making this call.  This call is only
779      * available to applications on the system image; it requires the
780      * MANAGE_USERS permission.
781      * @return the user name
782      */
getUserName()783     public String getUserName() {
784         try {
785             return mService.getUserInfo(getUserHandle()).name;
786         } catch (RemoteException re) {
787             throw re.rethrowFromSystemServer();
788         }
789     }
790 
791     /**
792      * Used to determine whether the user making this call is subject to
793      * teleportations.
794      *
795      * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
796      * now automatically identify goats using advanced goat recognition technology.</p>
797      *
798      * @return Returns true if the user making this call is a goat.
799      */
isUserAGoat()800     public boolean isUserAGoat() {
801         return mContext.getPackageManager()
802                 .isPackageAvailable("com.coffeestainstudios.goatsimulator");
803     }
804 
805     /**
806      * Used to check if this process is running under the primary user. The primary user
807      * is the first human user on a device.
808      *
809      * @return whether this process is running under the primary user.
810      * @hide
811      */
isPrimaryUser()812     public boolean isPrimaryUser() {
813         UserInfo user = getUserInfo(UserHandle.myUserId());
814         return user != null && user.isPrimary();
815     }
816 
817     /**
818      * Used to check if this process is running under the system user. The system user
819      * is the initial user that is implicitly created on first boot and hosts most of the
820      * system services.
821      *
822      * @return whether this process is running under the system user.
823      */
isSystemUser()824     public boolean isSystemUser() {
825         return UserHandle.myUserId() == UserHandle.USER_SYSTEM;
826     }
827 
828     /**
829      * @hide
830      * Returns whether the caller is running as an admin user. There can be more than one admin
831      * user.
832      */
isAdminUser()833     public boolean isAdminUser() {
834         return isUserAdmin(UserHandle.myUserId());
835     }
836 
837     /**
838      * @hide
839      * Returns whether the provided user is an admin user. There can be more than one admin
840      * user.
841      */
isUserAdmin(@serIdInt int userId)842     public boolean isUserAdmin(@UserIdInt int userId) {
843         UserInfo user = getUserInfo(userId);
844         return user != null && user.isAdmin();
845     }
846 
847     /**
848      * Used to check if the user making this call is linked to another user. Linked users may have
849      * a reduced number of available apps, app restrictions and account restrictions.
850      * @return whether the user making this call is a linked user
851      * @hide
852      */
isLinkedUser()853     public boolean isLinkedUser() {
854         try {
855             return mService.isRestricted();
856         } catch (RemoteException re) {
857             throw re.rethrowFromSystemServer();
858         }
859     }
860 
861     /**
862      * Checks if specified user can have restricted profile.
863      * @hide
864      */
canHaveRestrictedProfile(@serIdInt int userId)865     public boolean canHaveRestrictedProfile(@UserIdInt int userId) {
866         try {
867             return mService.canHaveRestrictedProfile(userId);
868         } catch (RemoteException re) {
869             throw re.rethrowFromSystemServer();
870         }
871     }
872 
873     /**
874      * Checks if the calling app is running as a guest user.
875      * @return whether the caller is a guest user.
876      * @hide
877      */
isGuestUser()878     public boolean isGuestUser() {
879         UserInfo user = getUserInfo(UserHandle.myUserId());
880         return user != null && user.isGuest();
881     }
882 
883     /**
884      * Checks if the calling app is running in a demo user. When running in a demo user,
885      * apps can be more helpful to the user, or explain their features in more detail.
886      *
887      * @return whether the caller is a demo user.
888      */
isDemoUser()889     public boolean isDemoUser() {
890         try {
891             return mService.isDemoUser(UserHandle.myUserId());
892         } catch (RemoteException re) {
893             throw re.rethrowFromSystemServer();
894         }
895     }
896 
897     /**
898      * Checks if the calling app is running in a managed profile.
899      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
900      *
901      * @return whether the caller is in a managed profile.
902      * @hide
903      */
904     @SystemApi
isManagedProfile()905     public boolean isManagedProfile() {
906         try {
907             return mService.isManagedProfile(UserHandle.myUserId());
908         } catch (RemoteException re) {
909             throw re.rethrowFromSystemServer();
910         }
911     }
912 
913     /**
914      * Checks if the specified user is a managed profile.
915      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission, otherwise the caller
916      * must be in the same profile group of specified user.
917      *
918      * @return whether the specified user is a managed profile.
919      * @hide
920      */
921     @SystemApi
isManagedProfile(@serIdInt int userId)922     public boolean isManagedProfile(@UserIdInt int userId) {
923         try {
924             return mService.isManagedProfile(userId);
925         } catch (RemoteException re) {
926             throw re.rethrowFromSystemServer();
927         }
928     }
929 
930     /**
931      * Checks if the calling app is running as an ephemeral user.
932      *
933      * @return whether the caller is an ephemeral user.
934      * @hide
935      */
isEphemeralUser()936     public boolean isEphemeralUser() {
937         return isUserEphemeral(UserHandle.myUserId());
938     }
939 
940     /**
941      * Returns whether the specified user is ephemeral.
942      * @hide
943      */
isUserEphemeral(@serIdInt int userId)944     public boolean isUserEphemeral(@UserIdInt int userId) {
945         final UserInfo user = getUserInfo(userId);
946         return user != null && user.isEphemeral();
947     }
948 
949     /**
950      * Return whether the given user is actively running.  This means that
951      * the user is in the "started" state, not "stopped" -- it is currently
952      * allowed to run code through scheduled alarms, receiving broadcasts,
953      * etc.  A started user may be either the current foreground user or a
954      * background user; the result here does not distinguish between the two.
955      * @param user The user to retrieve the running state for.
956      */
isUserRunning(UserHandle user)957     public boolean isUserRunning(UserHandle user) {
958         return isUserRunning(user.getIdentifier());
959     }
960 
961     /** {@hide} */
isUserRunning(int userId)962     public boolean isUserRunning(int userId) {
963         try {
964             return mService.isUserRunning(userId);
965         } catch (RemoteException re) {
966             throw re.rethrowFromSystemServer();
967         }
968     }
969 
970     /**
971      * Return whether the given user is actively running <em>or</em> stopping.
972      * This is like {@link #isUserRunning(UserHandle)}, but will also return
973      * true if the user had been running but is in the process of being stopped
974      * (but is not yet fully stopped, and still running some code).
975      * @param user The user to retrieve the running state for.
976      */
isUserRunningOrStopping(UserHandle user)977     public boolean isUserRunningOrStopping(UserHandle user) {
978         try {
979             // TODO: reconcile stopped vs stopping?
980             return ActivityManagerNative.getDefault().isUserRunning(
981                     user.getIdentifier(), ActivityManager.FLAG_OR_STOPPED);
982         } catch (RemoteException re) {
983             throw re.rethrowFromSystemServer();
984         }
985     }
986 
987     /** @removed */
988     @Deprecated
isUserRunningAndLocked()989     public boolean isUserRunningAndLocked() {
990         return isUserRunningAndLocked(Process.myUserHandle());
991     }
992 
993     /** @removed */
994     @Deprecated
isUserRunningAndLocked(UserHandle user)995     public boolean isUserRunningAndLocked(UserHandle user) {
996         try {
997             return ActivityManagerNative.getDefault().isUserRunning(
998                     user.getIdentifier(), ActivityManager.FLAG_AND_LOCKED);
999         } catch (RemoteException re) {
1000             throw re.rethrowFromSystemServer();
1001         }
1002     }
1003 
1004     /** @removed */
1005     @Deprecated
isUserRunningAndUnlocked()1006     public boolean isUserRunningAndUnlocked() {
1007         return isUserRunningAndUnlocked(Process.myUserHandle());
1008     }
1009 
1010     /** @removed */
1011     @Deprecated
isUserRunningAndUnlocked(UserHandle user)1012     public boolean isUserRunningAndUnlocked(UserHandle user) {
1013         try {
1014             return ActivityManagerNative.getDefault().isUserRunning(
1015                     user.getIdentifier(), ActivityManager.FLAG_AND_UNLOCKED);
1016         } catch (RemoteException re) {
1017             throw re.rethrowFromSystemServer();
1018         }
1019     }
1020 
1021     /**
1022      * Return whether the calling user is running in an "unlocked" state.
1023      * <p>
1024      * On devices with direct boot, a user is unlocked only after they've
1025      * entered their credentials (such as a lock pattern or PIN). On devices
1026      * without direct boot, a user is unlocked as soon as it starts.
1027      * <p>
1028      * When a user is locked, only device-protected data storage is available.
1029      * When a user is unlocked, both device-protected and credential-protected
1030      * private app data storage is available.
1031      *
1032      * @see Intent#ACTION_USER_UNLOCKED
1033      * @see Context#createDeviceProtectedStorageContext()
1034      */
isUserUnlocked()1035     public boolean isUserUnlocked() {
1036         return isUserUnlocked(Process.myUserHandle());
1037     }
1038 
1039     /**
1040      * Return whether the given user is running in an "unlocked" state.
1041      * <p>
1042      * On devices with direct boot, a user is unlocked only after they've
1043      * entered their credentials (such as a lock pattern or PIN). On devices
1044      * without direct boot, a user is unlocked as soon as it starts.
1045      * <p>
1046      * When a user is locked, only device-protected data storage is available.
1047      * When a user is unlocked, both device-protected and credential-protected
1048      * private app data storage is available.
1049      *
1050      * @param user to retrieve the unlocked state for.
1051      * @see Intent#ACTION_USER_UNLOCKED
1052      * @see Context#createDeviceProtectedStorageContext()
1053      */
isUserUnlocked(UserHandle user)1054     public boolean isUserUnlocked(UserHandle user) {
1055         return isUserUnlocked(user.getIdentifier());
1056     }
1057 
1058     /** {@hide} */
isUserUnlocked(@serIdInt int userId)1059     public boolean isUserUnlocked(@UserIdInt int userId) {
1060         try {
1061             return mService.isUserUnlocked(userId);
1062         } catch (RemoteException re) {
1063             throw re.rethrowFromSystemServer();
1064         }
1065     }
1066 
1067     /** {@hide} */
isUserUnlockingOrUnlocked(UserHandle user)1068     public boolean isUserUnlockingOrUnlocked(UserHandle user) {
1069         return isUserUnlockingOrUnlocked(user.getIdentifier());
1070     }
1071 
1072     /** {@hide} */
isUserUnlockingOrUnlocked(@serIdInt int userId)1073     public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) {
1074         try {
1075             return mService.isUserUnlockingOrUnlocked(userId);
1076         } catch (RemoteException re) {
1077             throw re.rethrowFromSystemServer();
1078         }
1079     }
1080 
1081     /**
1082      * Returns the UserInfo object describing a specific user.
1083      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1084      * @param userHandle the user handle of the user whose information is being requested.
1085      * @return the UserInfo object for a specific user.
1086      * @hide
1087      */
getUserInfo(@serIdInt int userHandle)1088     public UserInfo getUserInfo(@UserIdInt int userHandle) {
1089         try {
1090             return mService.getUserInfo(userHandle);
1091         } catch (RemoteException re) {
1092             throw re.rethrowFromSystemServer();
1093         }
1094     }
1095 
1096     /**
1097      * @hide
1098      *
1099      * Returns who set a user restriction on a user.
1100      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1101      * @param restrictionKey the string key representing the restriction
1102      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1103      * @return The source of user restriction. Any combination of {@link #RESTRICTION_NOT_SET},
1104      *         {@link #RESTRICTION_SOURCE_SYSTEM}, {@link #RESTRICTION_SOURCE_DEVICE_OWNER}
1105      *         and {@link #RESTRICTION_SOURCE_PROFILE_OWNER}
1106      */
1107     @SystemApi
1108     @UserRestrictionSource
getUserRestrictionSource(String restrictionKey, UserHandle userHandle)1109     public int getUserRestrictionSource(String restrictionKey, UserHandle userHandle) {
1110         try {
1111             return mService.getUserRestrictionSource(restrictionKey, userHandle.getIdentifier());
1112         } catch (RemoteException re) {
1113             throw re.rethrowFromSystemServer();
1114         }
1115     }
1116 
1117     /**
1118      * Returns the user-wide restrictions imposed on this user.
1119      * @return a Bundle containing all the restrictions.
1120      */
getUserRestrictions()1121     public Bundle getUserRestrictions() {
1122         return getUserRestrictions(Process.myUserHandle());
1123     }
1124 
1125     /**
1126      * Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
1127      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1128      * @return a Bundle containing all the restrictions.
1129      */
getUserRestrictions(UserHandle userHandle)1130     public Bundle getUserRestrictions(UserHandle userHandle) {
1131         try {
1132             return mService.getUserRestrictions(userHandle.getIdentifier());
1133         } catch (RemoteException re) {
1134             throw re.rethrowFromSystemServer();
1135         }
1136     }
1137 
1138      /**
1139      * @hide
1140      * Returns whether the given user has been disallowed from performing certain actions
1141      * or setting certain settings through UserManager. This method disregards restrictions
1142      * set by device policy.
1143      * @param restrictionKey the string key representing the restriction
1144      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1145      */
hasBaseUserRestriction(String restrictionKey, UserHandle userHandle)1146     public boolean hasBaseUserRestriction(String restrictionKey, UserHandle userHandle) {
1147         try {
1148             return mService.hasBaseUserRestriction(restrictionKey, userHandle.getIdentifier());
1149         } catch (RemoteException re) {
1150             throw re.rethrowFromSystemServer();
1151         }
1152     }
1153 
1154     /**
1155      * This will no longer work.  Device owners and profile owners should use
1156      * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
1157      */
1158     // System apps should use UserManager.setUserRestriction() instead.
1159     @Deprecated
setUserRestrictions(Bundle restrictions)1160     public void setUserRestrictions(Bundle restrictions) {
1161         throw new UnsupportedOperationException("This method is no longer supported");
1162     }
1163 
1164     /**
1165      * This will no longer work.  Device owners and profile owners should use
1166      * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
1167      */
1168     // System apps should use UserManager.setUserRestriction() instead.
1169     @Deprecated
setUserRestrictions(Bundle restrictions, UserHandle userHandle)1170     public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) {
1171         throw new UnsupportedOperationException("This method is no longer supported");
1172     }
1173 
1174     /**
1175      * Sets the value of a specific restriction.
1176      * Requires the MANAGE_USERS permission.
1177      * @param key the key of the restriction
1178      * @param value the value for the restriction
1179      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1180      * android.content.ComponentName, String)} or
1181      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1182      * android.content.ComponentName, String)} instead.
1183      */
1184     @Deprecated
setUserRestriction(String key, boolean value)1185     public void setUserRestriction(String key, boolean value) {
1186         setUserRestriction(key, value, Process.myUserHandle());
1187     }
1188 
1189     /**
1190      * @hide
1191      * Sets the value of a specific restriction on a specific user.
1192      * Requires the MANAGE_USERS permission.
1193      * @param key the key of the restriction
1194      * @param value the value for the restriction
1195      * @param userHandle the user whose restriction is to be changed.
1196      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1197      * android.content.ComponentName, String)} or
1198      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1199      * android.content.ComponentName, String)} instead.
1200      */
1201     @Deprecated
setUserRestriction(String key, boolean value, UserHandle userHandle)1202     public void setUserRestriction(String key, boolean value, UserHandle userHandle) {
1203         try {
1204             mService.setUserRestriction(key, value, userHandle.getIdentifier());
1205         } catch (RemoteException re) {
1206             throw re.rethrowFromSystemServer();
1207         }
1208     }
1209 
1210     /**
1211      * Returns whether the current user has been disallowed from performing certain actions
1212      * or setting certain settings.
1213      *
1214      * @param restrictionKey The string key representing the restriction.
1215      * @return {@code true} if the current user has the given restriction, {@code false} otherwise.
1216      */
hasUserRestriction(String restrictionKey)1217     public boolean hasUserRestriction(String restrictionKey) {
1218         return hasUserRestriction(restrictionKey, Process.myUserHandle());
1219     }
1220 
1221     /**
1222      * @hide
1223      * Returns whether the given user has been disallowed from performing certain actions
1224      * or setting certain settings.
1225      * @param restrictionKey the string key representing the restriction
1226      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1227      */
hasUserRestriction(String restrictionKey, UserHandle userHandle)1228     public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
1229         try {
1230             return mService.hasUserRestriction(restrictionKey,
1231                     userHandle.getIdentifier());
1232         } catch (RemoteException re) {
1233             throw re.rethrowFromSystemServer();
1234         }
1235     }
1236 
1237     /**
1238      * Return the serial number for a user.  This is a device-unique
1239      * number assigned to that user; if the user is deleted and then a new
1240      * user created, the new users will not be given the same serial number.
1241      * @param user The user whose serial number is to be retrieved.
1242      * @return The serial number of the given user; returns -1 if the
1243      * given UserHandle does not exist.
1244      * @see #getUserForSerialNumber(long)
1245      */
getSerialNumberForUser(UserHandle user)1246     public long getSerialNumberForUser(UserHandle user) {
1247         return getUserSerialNumber(user.getIdentifier());
1248     }
1249 
1250     /**
1251      * Return the user associated with a serial number previously
1252      * returned by {@link #getSerialNumberForUser(UserHandle)}.
1253      * @param serialNumber The serial number of the user that is being
1254      * retrieved.
1255      * @return Return the user associated with the serial number, or null
1256      * if there is not one.
1257      * @see #getSerialNumberForUser(UserHandle)
1258      */
getUserForSerialNumber(long serialNumber)1259     public UserHandle getUserForSerialNumber(long serialNumber) {
1260         int ident = getUserHandle((int) serialNumber);
1261         return ident >= 0 ? new UserHandle(ident) : null;
1262     }
1263 
1264     /**
1265      * Creates a user with the specified name and options. For non-admin users, default user
1266      * restrictions are going to be applied.
1267      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1268      *
1269      * @param name the user's name
1270      * @param flags flags that identify the type of user and other properties.
1271      * @see UserInfo
1272      *
1273      * @return the UserInfo object for the created user, or null if the user could not be created.
1274      * @hide
1275      */
createUser(String name, int flags)1276     public UserInfo createUser(String name, int flags) {
1277         UserInfo user = null;
1278         try {
1279             user = mService.createUser(name, flags);
1280             // TODO: Keep this in sync with
1281             // UserManagerService.LocalService.createUserEvenWhenDisallowed
1282             if (user != null && !user.isAdmin()) {
1283                 mService.setUserRestriction(DISALLOW_SMS, true, user.id);
1284                 mService.setUserRestriction(DISALLOW_OUTGOING_CALLS, true, user.id);
1285             }
1286         } catch (RemoteException re) {
1287             throw re.rethrowFromSystemServer();
1288         }
1289         return user;
1290     }
1291 
1292     /**
1293      * Creates a guest user and configures it.
1294      * @param context an application context
1295      * @param name the name to set for the user
1296      * @hide
1297      */
createGuest(Context context, String name)1298     public UserInfo createGuest(Context context, String name) {
1299         UserInfo guest = null;
1300         try {
1301             guest = mService.createUser(name, UserInfo.FLAG_GUEST);
1302             if (guest != null) {
1303                 Settings.Secure.putStringForUser(context.getContentResolver(),
1304                         Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
1305             }
1306         } catch (RemoteException re) {
1307             throw re.rethrowFromSystemServer();
1308         }
1309         return guest;
1310     }
1311 
1312     /**
1313      * Creates a user with the specified name and options as a profile of another user.
1314      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1315      *
1316      * @param name the user's name
1317      * @param flags flags that identify the type of user and other properties.
1318      * @see UserInfo
1319      * @param userHandle new user will be a profile of this use.
1320      *
1321      * @return the UserInfo object for the created user, or null if the user could not be created.
1322      * @hide
1323      */
createProfileForUser(String name, int flags, @UserIdInt int userHandle)1324     public UserInfo createProfileForUser(String name, int flags, @UserIdInt int userHandle) {
1325         try {
1326             return mService.createProfileForUser(name, flags, userHandle);
1327         } catch (RemoteException re) {
1328             throw re.rethrowFromSystemServer();
1329         }
1330     }
1331 
1332     /**
1333      * Creates a restricted profile with the specified name. This method also sets necessary
1334      * restrictions and adds shared accounts.
1335      *
1336      * @param name profile's name
1337      * @return UserInfo object for the created user, or null if the user could not be created.
1338      * @hide
1339      */
createRestrictedProfile(String name)1340     public UserInfo createRestrictedProfile(String name) {
1341         try {
1342             UserHandle parentUserHandle = Process.myUserHandle();
1343             UserInfo user = mService.createRestrictedProfile(name,
1344                     parentUserHandle.getIdentifier());
1345             if (user != null) {
1346                 AccountManager.get(mContext).addSharedAccountsFromParentUser(parentUserHandle,
1347                         UserHandle.of(user.id));
1348             }
1349             return user;
1350         } catch (RemoteException re) {
1351             throw re.rethrowFromSystemServer();
1352         }
1353     }
1354 
1355     /**
1356      * Returns an intent to create a user for the provided name and account name. The name
1357      * and account name will be used when the setup process for the new user is started.
1358      * <p>
1359      * The intent should be launched using startActivityForResult and the return result will
1360      * indicate if the user consented to adding a new user and if the operation succeeded. Any
1361      * errors in creating the user will be returned in the result code. If the user cancels the
1362      * request, the return result will be {@link Activity#RESULT_CANCELED}. On success, the
1363      * result code will be {@link Activity#RESULT_OK}.
1364      * <p>
1365      * Use {@link #supportsMultipleUsers()} to first check if the device supports this operation
1366      * at all.
1367      * <p>
1368      * The new user is created but not initialized. After switching into the user for the first
1369      * time, the preferred user name and account information are used by the setup process for that
1370      * user.
1371      *
1372      * @param userName Optional name to assign to the user.
1373      * @param accountName Optional account name that will be used by the setup wizard to initialize
1374      *                    the user.
1375      * @param accountType Optional account type for the account to be created. This is required
1376      *                    if the account name is specified.
1377      * @param accountOptions Optional bundle of data to be passed in during account creation in the
1378      *                       new user via {@link AccountManager#addAccount(String, String, String[],
1379      *                       Bundle, android.app.Activity, android.accounts.AccountManagerCallback,
1380      *                       Handler)}.
1381      * @return An Intent that can be launched from an Activity.
1382      * @see #USER_CREATION_FAILED_NOT_PERMITTED
1383      * @see #USER_CREATION_FAILED_NO_MORE_USERS
1384      * @see #supportsMultipleUsers
1385      */
createUserCreationIntent(@ullable String userName, @Nullable String accountName, @Nullable String accountType, @Nullable PersistableBundle accountOptions)1386     public static Intent createUserCreationIntent(@Nullable String userName,
1387             @Nullable String accountName,
1388             @Nullable String accountType, @Nullable PersistableBundle accountOptions) {
1389         Intent intent = new Intent(ACTION_CREATE_USER);
1390         if (userName != null) {
1391             intent.putExtra(EXTRA_USER_NAME, userName);
1392         }
1393         if (accountName != null && accountType == null) {
1394             throw new IllegalArgumentException("accountType must be specified if accountName is "
1395                     + "specified");
1396         }
1397         if (accountName != null) {
1398             intent.putExtra(EXTRA_USER_ACCOUNT_NAME, accountName);
1399         }
1400         if (accountType != null) {
1401             intent.putExtra(EXTRA_USER_ACCOUNT_TYPE, accountType);
1402         }
1403         if (accountOptions != null) {
1404             intent.putExtra(EXTRA_USER_ACCOUNT_OPTIONS, accountOptions);
1405         }
1406         return intent;
1407     }
1408 
1409     /**
1410      * @hide
1411      *
1412      * Returns the preferred account name for user creation. Requires MANAGE_USERS permission.
1413      */
1414     @SystemApi
getSeedAccountName()1415     public String getSeedAccountName() {
1416         try {
1417             return mService.getSeedAccountName();
1418         } catch (RemoteException re) {
1419             throw re.rethrowFromSystemServer();
1420         }
1421     }
1422 
1423     /**
1424      * @hide
1425      *
1426      * Returns the preferred account type for user creation. Requires MANAGE_USERS permission.
1427      */
1428     @SystemApi
getSeedAccountType()1429     public String getSeedAccountType() {
1430         try {
1431             return mService.getSeedAccountType();
1432         } catch (RemoteException re) {
1433             throw re.rethrowFromSystemServer();
1434         }
1435     }
1436 
1437     /**
1438      * @hide
1439      *
1440      * Returns the preferred account's options bundle for user creation. Requires MANAGE_USERS
1441      * permission.
1442      * @return Any options set by the requestor that created the user.
1443      */
1444     @SystemApi
getSeedAccountOptions()1445     public PersistableBundle getSeedAccountOptions() {
1446         try {
1447             return mService.getSeedAccountOptions();
1448         } catch (RemoteException re) {
1449             throw re.rethrowFromSystemServer();
1450         }
1451     }
1452 
1453     /**
1454      * @hide
1455      *
1456      * Called by a system activity to set the seed account information of a user created
1457      * through the user creation intent.
1458      * @param userId
1459      * @param accountName
1460      * @param accountType
1461      * @param accountOptions
1462      * @see #createUserCreationIntent(String, String, String, PersistableBundle)
1463      */
setSeedAccountData(int userId, String accountName, String accountType, PersistableBundle accountOptions)1464     public void setSeedAccountData(int userId, String accountName, String accountType,
1465             PersistableBundle accountOptions) {
1466         try {
1467             mService.setSeedAccountData(userId, accountName, accountType, accountOptions,
1468                     /* persist= */ true);
1469         } catch (RemoteException re) {
1470             throw re.rethrowFromSystemServer();
1471         }
1472     }
1473 
1474     /**
1475      * @hide
1476      * Clears the seed information used to create this user. Requires MANAGE_USERS permission.
1477      */
1478     @SystemApi
clearSeedAccountData()1479     public void clearSeedAccountData() {
1480         try {
1481             mService.clearSeedAccountData();
1482         } catch (RemoteException re) {
1483             throw re.rethrowFromSystemServer();
1484         }
1485     }
1486 
1487     /**
1488      * @hide
1489      * Marks the guest user for deletion to allow a new guest to be created before deleting
1490      * the current user who is a guest.
1491      * @param userHandle
1492      * @return
1493      */
markGuestForDeletion(@serIdInt int userHandle)1494     public boolean markGuestForDeletion(@UserIdInt int userHandle) {
1495         try {
1496             return mService.markGuestForDeletion(userHandle);
1497         } catch (RemoteException re) {
1498             throw re.rethrowFromSystemServer();
1499         }
1500     }
1501 
1502     /**
1503      * Sets the user as enabled, if such an user exists.
1504      *
1505      * <p>Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1506      *
1507      * <p>Note that the default is true, it's only that managed profiles might not be enabled.
1508      * Also ephemeral users can be disabled to indicate that their removal is in progress and they
1509      * shouldn't be re-entered. Therefore ephemeral users should not be re-enabled once disabled.
1510      *
1511      * @param userHandle the id of the profile to enable
1512      * @hide
1513      */
setUserEnabled(@serIdInt int userHandle)1514     public void setUserEnabled(@UserIdInt int userHandle) {
1515         try {
1516             mService.setUserEnabled(userHandle);
1517         } catch (RemoteException re) {
1518             throw re.rethrowFromSystemServer();
1519         }
1520     }
1521 
1522     /**
1523      * Return the number of users currently created on the device.
1524      */
getUserCount()1525     public int getUserCount() {
1526         List<UserInfo> users = getUsers();
1527         return users != null ? users.size() : 1;
1528     }
1529 
1530     /**
1531      * Returns information for all users on this device, including ones marked for deletion.
1532      * To retrieve only users that are alive, use {@link #getUsers(boolean)}.
1533      * <p>
1534      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1535      * @return the list of users that exist on the device.
1536      * @hide
1537      */
getUsers()1538     public List<UserInfo> getUsers() {
1539         try {
1540             return mService.getUsers(false);
1541         } catch (RemoteException re) {
1542             throw re.rethrowFromSystemServer();
1543         }
1544     }
1545 
1546     /**
1547      * Returns serial numbers of all users on this device.
1548      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1549      *
1550      * @param excludeDying specify if the list should exclude users being removed.
1551      * @return the list of serial numbers of users that exist on the device.
1552      * @hide
1553      */
1554     @SystemApi
getSerialNumbersOfUsers(boolean excludeDying)1555     public long[] getSerialNumbersOfUsers(boolean excludeDying) {
1556         try {
1557             List<UserInfo> users = mService.getUsers(excludeDying);
1558             long[] result = new long[users.size()];
1559             for (int i = 0; i < result.length; i++) {
1560                 result[i] = users.get(i).serialNumber;
1561             }
1562             return result;
1563         } catch (RemoteException re) {
1564             throw re.rethrowFromSystemServer();
1565         }
1566     }
1567 
1568     /**
1569      * @return the user's account name, null if not found.
1570      * @hide
1571      */
1572     @RequiresPermission( allOf = {
1573             Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1574             Manifest.permission.MANAGE_USERS
1575     })
getUserAccount(@serIdInt int userHandle)1576     public @Nullable String getUserAccount(@UserIdInt int userHandle) {
1577         try {
1578             return mService.getUserAccount(userHandle);
1579         } catch (RemoteException re) {
1580             throw re.rethrowFromSystemServer();
1581         }
1582     }
1583 
1584     /**
1585      * Set account name for the given user.
1586      * @hide
1587      */
1588     @RequiresPermission( allOf = {
1589             Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1590             Manifest.permission.MANAGE_USERS
1591     })
setUserAccount(@serIdInt int userHandle, @Nullable String accountName)1592     public void setUserAccount(@UserIdInt int userHandle, @Nullable String accountName) {
1593         try {
1594             mService.setUserAccount(userHandle, accountName);
1595         } catch (RemoteException re) {
1596             throw re.rethrowFromSystemServer();
1597         }
1598     }
1599 
1600     /**
1601      * Returns information for Primary user.
1602      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1603      *
1604      * @return the Primary user, null if not found.
1605      * @hide
1606      */
getPrimaryUser()1607     public @Nullable UserInfo getPrimaryUser() {
1608         try {
1609             return mService.getPrimaryUser();
1610         } catch (RemoteException re) {
1611             throw re.rethrowFromSystemServer();
1612         }
1613     }
1614 
1615     /**
1616      * Checks whether it's possible to add more users. Caller must hold the MANAGE_USERS
1617      * permission.
1618      *
1619      * @return true if more users can be added, false if limit has been reached.
1620      * @hide
1621      */
canAddMoreUsers()1622     public boolean canAddMoreUsers() {
1623         final List<UserInfo> users = getUsers(true);
1624         final int totalUserCount = users.size();
1625         int aliveUserCount = 0;
1626         for (int i = 0; i < totalUserCount; i++) {
1627             UserInfo user = users.get(i);
1628             if (!user.isGuest()) {
1629                 aliveUserCount++;
1630             }
1631         }
1632         return aliveUserCount < getMaxSupportedUsers();
1633     }
1634 
1635     /**
1636      * Checks whether it's possible to add more managed profiles. Caller must hold the MANAGE_USERS
1637      * permission.
1638      * if allowedToRemoveOne is true and if the user already has a managed profile, then return if
1639      * we could add a new managed profile to this user after removing the existing one.
1640      *
1641      * @return true if more managed profiles can be added, false if limit has been reached.
1642      * @hide
1643      */
canAddMoreManagedProfiles(@serIdInt int userId, boolean allowedToRemoveOne)1644     public boolean canAddMoreManagedProfiles(@UserIdInt int userId, boolean allowedToRemoveOne) {
1645         try {
1646             return mService.canAddMoreManagedProfiles(userId, allowedToRemoveOne);
1647         } catch (RemoteException re) {
1648             throw re.rethrowFromSystemServer();
1649         }
1650     }
1651 
1652     /**
1653      * Returns list of the profiles of userHandle including
1654      * userHandle itself.
1655      * Note that this returns both enabled and not enabled profiles. See
1656      * {@link #getEnabledProfiles(int)} if you need only the enabled ones.
1657      *
1658      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1659      * @param userHandle profiles of this user will be returned.
1660      * @return the list of profiles.
1661      * @hide
1662      */
getProfiles(@serIdInt int userHandle)1663     public List<UserInfo> getProfiles(@UserIdInt int userHandle) {
1664         try {
1665             return mService.getProfiles(userHandle, false /* enabledOnly */);
1666         } catch (RemoteException re) {
1667             throw re.rethrowFromSystemServer();
1668         }
1669     }
1670 
1671     /**
1672      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1673      * @param userId one of the two user ids to check.
1674      * @param otherUserId one of the two user ids to check.
1675      * @return true if the two user ids are in the same profile group.
1676      * @hide
1677      */
isSameProfileGroup(@serIdInt int userId, int otherUserId)1678     public boolean isSameProfileGroup(@UserIdInt int userId, int otherUserId) {
1679         try {
1680             return mService.isSameProfileGroup(userId, otherUserId);
1681         } catch (RemoteException re) {
1682             throw re.rethrowFromSystemServer();
1683         }
1684     }
1685 
1686     /**
1687      * Returns list of the profiles of userHandle including
1688      * userHandle itself.
1689      * Note that this returns only enabled.
1690      *
1691      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1692      * @param userHandle profiles of this user will be returned.
1693      * @return the list of profiles.
1694      * @hide
1695      */
getEnabledProfiles(@serIdInt int userHandle)1696     public List<UserInfo> getEnabledProfiles(@UserIdInt int userHandle) {
1697         try {
1698             return mService.getProfiles(userHandle, true /* enabledOnly */);
1699         } catch (RemoteException re) {
1700             throw re.rethrowFromSystemServer();
1701         }
1702     }
1703 
1704     /**
1705      * Returns a list of UserHandles for profiles associated with the user that the calling process
1706      * is running on, including the user itself.
1707      *
1708      * @return A non-empty list of UserHandles associated with the calling user.
1709      */
getUserProfiles()1710     public List<UserHandle> getUserProfiles() {
1711         int[] userIds = getProfileIds(UserHandle.myUserId(), true /* enabledOnly */);
1712         List<UserHandle> result = new ArrayList<>(userIds.length);
1713         for (int userId : userIds) {
1714             result.add(UserHandle.of(userId));
1715         }
1716         return result;
1717     }
1718 
1719     /**
1720      * Returns a list of ids for profiles associated with the specified user including the user
1721      * itself.
1722      *
1723      * @param userId      id of the user to return profiles for
1724      * @param enabledOnly whether return only {@link UserInfo#isEnabled() enabled} profiles
1725      * @return A non-empty list of ids of profiles associated with the specified user.
1726      *
1727      * @hide
1728      */
getProfileIds(@serIdInt int userId, boolean enabledOnly)1729     public int[] getProfileIds(@UserIdInt int userId, boolean enabledOnly) {
1730         try {
1731             return mService.getProfileIds(userId, enabledOnly);
1732         } catch (RemoteException re) {
1733             throw re.rethrowFromSystemServer();
1734         }
1735     }
1736 
1737     /**
1738      * @see #getProfileIds(int, boolean)
1739      * @hide
1740      */
getProfileIdsWithDisabled(@serIdInt int userId)1741     public int[] getProfileIdsWithDisabled(@UserIdInt int userId) {
1742         return getProfileIds(userId, false /* enabledOnly */);
1743     }
1744 
1745     /**
1746      * @see #getProfileIds(int, boolean)
1747      * @hide
1748      */
getEnabledProfileIds(@serIdInt int userId)1749     public int[] getEnabledProfileIds(@UserIdInt int userId) {
1750         return getProfileIds(userId, true /* enabledOnly */);
1751     }
1752 
1753     /**
1754      * Returns the device credential owner id of the profile from
1755      * which this method is called, or userHandle if called from a user that
1756      * is not a profile.
1757      *
1758      * @hide
1759      */
getCredentialOwnerProfile(@serIdInt int userHandle)1760     public int getCredentialOwnerProfile(@UserIdInt int userHandle) {
1761         try {
1762             return mService.getCredentialOwnerProfile(userHandle);
1763         } catch (RemoteException re) {
1764             throw re.rethrowFromSystemServer();
1765         }
1766     }
1767 
1768     /**
1769      * Returns the parent of the profile which this method is called from
1770      * or null if called from a user that is not a profile.
1771      *
1772      * @hide
1773      */
getProfileParent(@serIdInt int userHandle)1774     public UserInfo getProfileParent(@UserIdInt int userHandle) {
1775         try {
1776             return mService.getProfileParent(userHandle);
1777         } catch (RemoteException re) {
1778             throw re.rethrowFromSystemServer();
1779         }
1780     }
1781 
1782     /**
1783      * Set quiet mode of a managed profile.
1784      *
1785      * @param userHandle The user handle of the profile.
1786      * @param enableQuietMode Whether quiet mode should be enabled or disabled.
1787      * @hide
1788      */
setQuietModeEnabled(@serIdInt int userHandle, boolean enableQuietMode)1789     public void setQuietModeEnabled(@UserIdInt int userHandle, boolean enableQuietMode) {
1790         try {
1791             mService.setQuietModeEnabled(userHandle, enableQuietMode);
1792         } catch (RemoteException re) {
1793             throw re.rethrowFromSystemServer();
1794         }
1795     }
1796 
1797     /**
1798      * Returns whether the given profile is in quiet mode or not.
1799      * Notes: Quiet mode is only supported for managed profiles.
1800      *
1801      * @param userHandle The user handle of the profile to be queried.
1802      * @return true if the profile is in quiet mode, false otherwise.
1803      */
isQuietModeEnabled(UserHandle userHandle)1804     public boolean isQuietModeEnabled(UserHandle userHandle) {
1805         try {
1806             return mService.isQuietModeEnabled(userHandle.getIdentifier());
1807         } catch (RemoteException re) {
1808             throw re.rethrowFromSystemServer();
1809         }
1810     }
1811 
1812     /**
1813      * Tries disabling quiet mode for a given user. If the user is still locked, we unlock the user
1814      * first by showing the confirm credentials screen and disable quiet mode upon successful
1815      * unlocking. If the user is already unlocked, we call through to {@link #setQuietModeEnabled}
1816      * directly.
1817      *
1818      * @return true if the quiet mode was disabled immediately
1819      * @hide
1820      */
trySetQuietModeDisabled(@serIdInt int userHandle, IntentSender target)1821     public boolean trySetQuietModeDisabled(@UserIdInt int userHandle, IntentSender target) {
1822         try {
1823             return mService.trySetQuietModeDisabled(userHandle, target);
1824         } catch (RemoteException re) {
1825             throw re.rethrowFromSystemServer();
1826         }
1827     }
1828 
1829     /**
1830      * If the target user is a managed profile of the calling user or the caller
1831      * is itself a managed profile, then this returns a badged copy of the given
1832      * icon to be able to distinguish it from the original icon. For badging an
1833      * arbitrary drawable use {@link #getBadgedDrawableForUser(
1834      * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
1835      * <p>
1836      * If the original drawable is a BitmapDrawable and the backing bitmap is
1837      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
1838      * is performed in place and the original drawable is returned.
1839      * </p>
1840      *
1841      * @param icon The icon to badge.
1842      * @param user The target user.
1843      * @return A drawable that combines the original icon and a badge as
1844      *         determined by the system.
1845      * @removed
1846      */
getBadgedIconForUser(Drawable icon, UserHandle user)1847     public Drawable getBadgedIconForUser(Drawable icon, UserHandle user) {
1848         return mContext.getPackageManager().getUserBadgedIcon(icon, user);
1849     }
1850 
1851     /**
1852      * If the target user is a managed profile of the calling user or the caller
1853      * is itself a managed profile, then this returns a badged copy of the given
1854      * drawable allowing the user to distinguish it from the original drawable.
1855      * The caller can specify the location in the bounds of the drawable to be
1856      * badged where the badge should be applied as well as the density of the
1857      * badge to be used.
1858      * <p>
1859      * If the original drawable is a BitmapDrawable and the backing bitmap is
1860      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
1861      * is performed in place and the original drawable is returned.
1862      * </p>
1863      *
1864      * @param badgedDrawable The drawable to badge.
1865      * @param user The target user.
1866      * @param badgeLocation Where in the bounds of the badged drawable to place
1867      *         the badge. If it's {@code null}, the badge is applied on top of the entire
1868      *         drawable being badged.
1869      * @param badgeDensity The optional desired density for the badge as per
1870      *         {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
1871      *         the density of the display is used.
1872      * @return A drawable that combines the original drawable and a badge as
1873      *         determined by the system.
1874      * @removed
1875      */
getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user, Rect badgeLocation, int badgeDensity)1876     public Drawable getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user,
1877             Rect badgeLocation, int badgeDensity) {
1878         return mContext.getPackageManager().getUserBadgedDrawableForDensity(badgedDrawable, user,
1879                 badgeLocation, badgeDensity);
1880     }
1881 
1882     /**
1883      * If the target user is a managed profile of the calling user or the caller
1884      * is itself a managed profile, then this returns a copy of the label with
1885      * badging for accessibility services like talkback. E.g. passing in "Email"
1886      * and it might return "Work Email" for Email in the work profile.
1887      *
1888      * @param label The label to change.
1889      * @param user The target user.
1890      * @return A label that combines the original label and a badge as
1891      *         determined by the system.
1892      * @removed
1893      */
getBadgedLabelForUser(CharSequence label, UserHandle user)1894     public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) {
1895         return mContext.getPackageManager().getUserBadgedLabel(label, user);
1896     }
1897 
1898     /**
1899      * Returns information for all users on this device. Requires
1900      * {@link android.Manifest.permission#MANAGE_USERS} permission.
1901      *
1902      * @param excludeDying specify if the list should exclude users being
1903      *            removed.
1904      * @return the list of users that were created.
1905      * @hide
1906      */
getUsers(boolean excludeDying)1907     public List<UserInfo> getUsers(boolean excludeDying) {
1908         try {
1909             return mService.getUsers(excludeDying);
1910         } catch (RemoteException re) {
1911             throw re.rethrowFromSystemServer();
1912         }
1913     }
1914 
1915     /**
1916      * Removes a user and all associated data.
1917      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1918      * @param userHandle the integer handle of the user, where 0 is the primary user.
1919      * @hide
1920      */
removeUser(@serIdInt int userHandle)1921     public boolean removeUser(@UserIdInt int userHandle) {
1922         try {
1923             return mService.removeUser(userHandle);
1924         } catch (RemoteException re) {
1925             throw re.rethrowFromSystemServer();
1926         }
1927     }
1928 
1929     /**
1930      * Updates the user's name.
1931      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1932      *
1933      * @param userHandle the user's integer handle
1934      * @param name the new name for the user
1935      * @hide
1936      */
setUserName(@serIdInt int userHandle, String name)1937     public void setUserName(@UserIdInt int userHandle, String name) {
1938         try {
1939             mService.setUserName(userHandle, name);
1940         } catch (RemoteException re) {
1941             throw re.rethrowFromSystemServer();
1942         }
1943     }
1944 
1945     /**
1946      * Sets the user's photo.
1947      * @param userHandle the user for whom to change the photo.
1948      * @param icon the bitmap to set as the photo.
1949      * @hide
1950      */
setUserIcon(@serIdInt int userHandle, Bitmap icon)1951     public void setUserIcon(@UserIdInt int userHandle, Bitmap icon) {
1952         try {
1953             mService.setUserIcon(userHandle, icon);
1954         } catch (RemoteException re) {
1955             throw re.rethrowFromSystemServer();
1956         }
1957     }
1958 
1959     /**
1960      * Returns a file descriptor for the user's photo. PNG data can be read from this file.
1961      * @param userHandle the user whose photo we want to read.
1962      * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
1963      * @see com.android.internal.util.UserIcons#getDefaultUserIcon for a default.
1964      * @hide
1965      */
getUserIcon(@serIdInt int userHandle)1966     public Bitmap getUserIcon(@UserIdInt int userHandle) {
1967         try {
1968             ParcelFileDescriptor fd = mService.getUserIcon(userHandle);
1969             if (fd != null) {
1970                 try {
1971                     return BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());
1972                 } finally {
1973                     try {
1974                         fd.close();
1975                     } catch (IOException e) {
1976                     }
1977                 }
1978             }
1979         } catch (RemoteException re) {
1980             throw re.rethrowFromSystemServer();
1981         }
1982         return null;
1983     }
1984 
1985     /**
1986      * Returns the maximum number of users that can be created on this device. A return value
1987      * of 1 means that it is a single user device.
1988      * @hide
1989      * @return a value greater than or equal to 1
1990      */
getMaxSupportedUsers()1991     public static int getMaxSupportedUsers() {
1992         // Don't allow multiple users on certain builds
1993         if (android.os.Build.ID.startsWith("JVP")) return 1;
1994         // Svelte devices don't get multi-user.
1995         if (ActivityManager.isLowRamDeviceStatic()) return 1;
1996         return SystemProperties.getInt("fw.max_users",
1997                 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
1998     }
1999 
2000     /**
2001      * Returns true if the user switcher should be shown, this will be if device supports multi-user
2002      * and there are at least 2 users available that are not managed profiles.
2003      * @hide
2004      * @return true if user switcher should be shown.
2005      */
isUserSwitcherEnabled()2006     public boolean isUserSwitcherEnabled() {
2007         if (!supportsMultipleUsers()) {
2008             return false;
2009         }
2010         // If Demo Mode is on, don't show user switcher
2011         if (isDeviceInDemoMode(mContext)) {
2012             return false;
2013         }
2014         List<UserInfo> users = getUsers(true);
2015         if (users == null) {
2016            return false;
2017         }
2018         int switchableUserCount = 0;
2019         for (UserInfo user : users) {
2020             if (user.supportsSwitchToByUser()) {
2021                 ++switchableUserCount;
2022             }
2023         }
2024         final boolean guestEnabled = !mContext.getSystemService(DevicePolicyManager.class)
2025                 .getGuestUserDisabled(null);
2026         return switchableUserCount > 1 || guestEnabled;
2027     }
2028 
2029     /**
2030      * @hide
2031      */
isDeviceInDemoMode(Context context)2032     public static boolean isDeviceInDemoMode(Context context) {
2033         return Settings.Global.getInt(context.getContentResolver(),
2034                 Settings.Global.DEVICE_DEMO_MODE, 0) > 0;
2035     }
2036 
2037     /**
2038      * Returns a serial number on this device for a given userHandle. User handles can be recycled
2039      * when deleting and creating users, but serial numbers are not reused until the device is wiped.
2040      * @param userHandle
2041      * @return a serial number associated with that user, or -1 if the userHandle is not valid.
2042      * @hide
2043      */
getUserSerialNumber(@serIdInt int userHandle)2044     public int getUserSerialNumber(@UserIdInt int userHandle) {
2045         try {
2046             return mService.getUserSerialNumber(userHandle);
2047         } catch (RemoteException re) {
2048             throw re.rethrowFromSystemServer();
2049         }
2050     }
2051 
2052     /**
2053      * Returns a userHandle on this device for a given user serial number. User handles can be
2054      * recycled when deleting and creating users, but serial numbers are not reused until the device
2055      * is wiped.
2056      * @param userSerialNumber
2057      * @return the userHandle associated with that user serial number, or -1 if the serial number
2058      * is not valid.
2059      * @hide
2060      */
getUserHandle(int userSerialNumber)2061     public @UserIdInt int getUserHandle(int userSerialNumber) {
2062         try {
2063             return mService.getUserHandle(userSerialNumber);
2064         } catch (RemoteException re) {
2065             throw re.rethrowFromSystemServer();
2066         }
2067     }
2068 
2069     /**
2070      * Returns a {@link Bundle} containing any saved application restrictions for this user, for the
2071      * given package name. Only an application with this package name can call this method.
2072      *
2073      * <p>The returned {@link Bundle} consists of key-value pairs, as defined by the application,
2074      * where the types of values may be:
2075      * <ul>
2076      * <li>{@code boolean}
2077      * <li>{@code int}
2078      * <li>{@code String} or {@code String[]}
2079      * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]}
2080      * </ul>
2081      *
2082      * @param packageName the package name of the calling application
2083      * @return a {@link Bundle} with the restrictions for that package, or an empty {@link Bundle}
2084      * if there are no saved restrictions.
2085      *
2086      * @see #KEY_RESTRICTIONS_PENDING
2087      */
getApplicationRestrictions(String packageName)2088     public Bundle getApplicationRestrictions(String packageName) {
2089         try {
2090             return mService.getApplicationRestrictions(packageName);
2091         } catch (RemoteException re) {
2092             throw re.rethrowFromSystemServer();
2093         }
2094     }
2095 
2096     /**
2097      * @hide
2098      */
getApplicationRestrictions(String packageName, UserHandle user)2099     public Bundle getApplicationRestrictions(String packageName, UserHandle user) {
2100         try {
2101             return mService.getApplicationRestrictionsForUser(packageName, user.getIdentifier());
2102         } catch (RemoteException re) {
2103             throw re.rethrowFromSystemServer();
2104         }
2105     }
2106 
2107     /**
2108      * @hide
2109      */
setApplicationRestrictions(String packageName, Bundle restrictions, UserHandle user)2110     public void setApplicationRestrictions(String packageName, Bundle restrictions,
2111             UserHandle user) {
2112         try {
2113             mService.setApplicationRestrictions(packageName, restrictions, user.getIdentifier());
2114         } catch (RemoteException re) {
2115             throw re.rethrowFromSystemServer();
2116         }
2117     }
2118 
2119     /**
2120      * Sets a new challenge PIN for restrictions. This is only for use by pre-installed
2121      * apps and requires the MANAGE_USERS permission.
2122      * @param newPin the PIN to use for challenge dialogs.
2123      * @return Returns true if the challenge PIN was set successfully.
2124      * @deprecated The restrictions PIN functionality is no longer provided by the system.
2125      * This method is preserved for backwards compatibility reasons and always returns false.
2126      */
setRestrictionsChallenge(String newPin)2127     public boolean setRestrictionsChallenge(String newPin) {
2128         return false;
2129     }
2130 
2131     /**
2132      * @hide
2133      * Set restrictions that should apply to any future guest user that's created.
2134      */
setDefaultGuestRestrictions(Bundle restrictions)2135     public void setDefaultGuestRestrictions(Bundle restrictions) {
2136         try {
2137             mService.setDefaultGuestRestrictions(restrictions);
2138         } catch (RemoteException re) {
2139             throw re.rethrowFromSystemServer();
2140         }
2141     }
2142 
2143     /**
2144      * @hide
2145      * Gets the default guest restrictions.
2146      */
getDefaultGuestRestrictions()2147     public Bundle getDefaultGuestRestrictions() {
2148         try {
2149             return mService.getDefaultGuestRestrictions();
2150         } catch (RemoteException re) {
2151             throw re.rethrowFromSystemServer();
2152         }
2153     }
2154 
2155     /**
2156      * Returns creation time of the user or of a managed profile associated with the calling user.
2157      * @param userHandle user handle of the user or a managed profile associated with the
2158      *                   calling user.
2159      * @return creation time in milliseconds since Epoch time.
2160      */
getUserCreationTime(UserHandle userHandle)2161     public long getUserCreationTime(UserHandle userHandle) {
2162         try {
2163             return mService.getUserCreationTime(userHandle.getIdentifier());
2164         } catch (RemoteException re) {
2165             throw re.rethrowFromSystemServer();
2166         }
2167     }
2168 
2169     /**
2170      * @hide
2171      * Checks if any uninitialized user has the specific seed account name and type.
2172      *
2173      * @param mAccountName The account name to check for
2174      * @param mAccountType The account type of the account to check for
2175      * @return whether the seed account was found
2176      */
someUserHasSeedAccount(String accountName, String accountType)2177     public boolean someUserHasSeedAccount(String accountName, String accountType) {
2178         try {
2179             return mService.someUserHasSeedAccount(accountName, accountType);
2180         } catch (RemoteException re) {
2181             throw re.rethrowFromSystemServer();
2182         }
2183     }
2184 }
2185