• 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 package android.os;
17 
18 import android.annotation.SystemApi;
19 import android.app.ActivityManager;
20 import android.app.ActivityManagerNative;
21 import android.content.Context;
22 import android.content.pm.UserInfo;
23 import android.content.res.Resources;
24 import android.graphics.Bitmap;
25 import android.graphics.Rect;
26 import android.graphics.drawable.Drawable;
27 import android.provider.Settings;
28 import android.util.Log;
29 import android.view.WindowManager.LayoutParams;
30 
31 import com.android.internal.R;
32 
33 import java.util.ArrayList;
34 import java.util.List;
35 
36 /**
37  * Manages users and user details on a multi-user system.
38  */
39 public class UserManager {
40 
41     private static String TAG = "UserManager";
42     private final IUserManager mService;
43     private final Context mContext;
44 
45     /**
46      * Specifies if a user is disallowed from adding and removing accounts.
47      * The default value is <code>false</code>.
48      *
49      * <p/>Key for user restrictions.
50      * <p/>Type: Boolean
51      * @see #setUserRestrictions(Bundle)
52      * @see #getUserRestrictions()
53      */
54     public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
55 
56     /**
57      * Specifies if a user is disallowed from changing Wi-Fi
58      * access points. The default value is <code>false</code>.
59      *
60      * <p/>Key for user restrictions.
61      * <p/>Type: Boolean
62      * @see #setUserRestrictions(Bundle)
63      * @see #getUserRestrictions()
64      */
65     public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
66 
67     /**
68      * Specifies if a user is disallowed from installing applications.
69      * The default value is <code>false</code>.
70      *
71      * <p/>Key for user restrictions.
72      * <p/>Type: Boolean
73      * @see #setUserRestrictions(Bundle)
74      * @see #getUserRestrictions()
75      */
76     public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
77 
78     /**
79      * Specifies if a user is disallowed from uninstalling applications.
80      * The default value is <code>false</code>.
81      *
82      * <p/>Key for user restrictions.
83      * <p/>Type: Boolean
84      * @see #setUserRestrictions(Bundle)
85      * @see #getUserRestrictions()
86      */
87     public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
88 
89     /**
90      * Specifies if a user is disallowed from toggling location sharing.
91      * The default value is <code>false</code>.
92      *
93      * <p/>Key for user restrictions.
94      * <p/>Type: Boolean
95      * @see #setUserRestrictions(Bundle)
96      * @see #getUserRestrictions()
97      */
98     public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
99 
100     /**
101      * Specifies if a user is disallowed from enabling the
102      * "Unknown Sources" setting, that allows installation of apps from unknown sources.
103      * The default value is <code>false</code>.
104      *
105      * <p/>Key for user restrictions.
106      * <p/>Type: Boolean
107      * @see #setUserRestrictions(Bundle)
108      * @see #getUserRestrictions()
109      */
110     public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
111 
112     /**
113      * Specifies if a user is disallowed from configuring bluetooth.
114      * The default value is <code>false</code>.
115      *
116      * <p/>Key for user restrictions.
117      * <p/>Type: Boolean
118      * @see #setUserRestrictions(Bundle)
119      * @see #getUserRestrictions()
120      */
121     public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
122 
123     /**
124      * Specifies if a user is disallowed from transferring files over
125      * USB. This can only be set by device owners and profile owners on the primary user.
126      * The default value is <code>false</code>.
127      *
128      * <p/>Key for user restrictions.
129      * <p/>Type: Boolean
130      * @see #setUserRestrictions(Bundle)
131      * @see #getUserRestrictions()
132      */
133     public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
134 
135     /**
136      * Specifies if a user is disallowed from configuring user
137      * credentials. The default value is <code>false</code>.
138      *
139      * <p/>Key for user restrictions.
140      * <p/>Type: Boolean
141      * @see #setUserRestrictions(Bundle)
142      * @see #getUserRestrictions()
143      */
144     public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
145 
146     /**
147      * Specifies if a user is disallowed from removing itself and other
148      * users. The default value is <code>false</code>.
149      *
150      * <p/>Key for user restrictions.
151      * <p/>Type: Boolean
152      * @see #setUserRestrictions(Bundle)
153      * @see #getUserRestrictions()
154      */
155     public static final String DISALLOW_REMOVE_USER = "no_remove_user";
156 
157     /**
158      * Specifies if a user is disallowed from enabling or
159      * accessing debugging features. The default value is <code>false</code>.
160      *
161      * <p/>Key for user restrictions.
162      * <p/>Type: Boolean
163      * @see #setUserRestrictions(Bundle)
164      * @see #getUserRestrictions()
165      */
166     public static final String DISALLOW_DEBUGGING_FEATURES = "no_debugging_features";
167 
168     /**
169      * Specifies if a user is disallowed from configuring VPN.
170      * The default value is <code>false</code>.
171      *
172      * <p/>Key for user restrictions.
173      * <p/>Type: Boolean
174      * @see #setUserRestrictions(Bundle)
175      * @see #getUserRestrictions()
176      */
177     public static final String DISALLOW_CONFIG_VPN = "no_config_vpn";
178 
179     /**
180      * Specifies if a user is disallowed from configuring Tethering
181      * & portable hotspots. This can only be set by device owners and profile owners on the
182      * primary user. The default value is <code>false</code>.
183      *
184      * <p/>Key for user restrictions.
185      * <p/>Type: Boolean
186      * @see #setUserRestrictions(Bundle)
187      * @see #getUserRestrictions()
188      */
189     public static final String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
190 
191     /**
192      * Specifies if a user is disallowed from factory resetting
193      * from Settings. This can only be set by device owners and profile owners on the primary user.
194      * The default value is <code>false</code>.
195      *
196      * <p/>Key for user restrictions.
197      * <p/>Type: Boolean
198      * @see #setUserRestrictions(Bundle)
199      * @see #getUserRestrictions()
200      */
201     public static final String DISALLOW_FACTORY_RESET = "no_factory_reset";
202 
203     /**
204      * Specifies if a user is disallowed from adding new users and
205      * profiles. This can only be set by device owners and profile owners on the primary user.
206      * The default value is <code>false</code>.
207      *
208      * <p/>Key for user restrictions.
209      * <p/>Type: Boolean
210      * @see #setUserRestrictions(Bundle)
211      * @see #getUserRestrictions()
212      */
213     public static final String DISALLOW_ADD_USER = "no_add_user";
214 
215     /**
216      * Specifies if a user is disallowed from disabling application
217      * verification. The default value is <code>false</code>.
218      *
219      * <p/>Key for user restrictions.
220      * <p/>Type: Boolean
221      * @see #setUserRestrictions(Bundle)
222      * @see #getUserRestrictions()
223      */
224     public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
225 
226     /**
227      * Specifies if a user is disallowed from configuring cell
228      * broadcasts. This can only be set by device owners and profile owners on the primary user.
229      * The default value is <code>false</code>.
230      *
231      * <p/>Key for user restrictions.
232      * <p/>Type: Boolean
233      * @see #setUserRestrictions(Bundle)
234      * @see #getUserRestrictions()
235      */
236     public static final String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
237 
238     /**
239      * Specifies if a user is disallowed from configuring mobile
240      * networks. This can only be set by device owners and profile owners on the primary user.
241      * The default value is <code>false</code>.
242      *
243      * <p/>Key for user restrictions.
244      * <p/>Type: Boolean
245      * @see #setUserRestrictions(Bundle)
246      * @see #getUserRestrictions()
247      */
248     public static final String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
249 
250     /**
251      * Specifies if a user is disallowed from modifying
252      * applications in Settings or launchers. The following actions will not be allowed when this
253      * restriction is enabled:
254      * <li>uninstalling apps</li>
255      * <li>disabling apps</li>
256      * <li>clearing app caches</li>
257      * <li>clearing app data</li>
258      * <li>force stopping apps</li>
259      * <li>clearing app defaults</li>
260      * <p>
261      * The default value is <code>false</code>.
262      *
263      * <p/>Key for user restrictions.
264      * <p/>Type: Boolean
265      * @see #setUserRestrictions(Bundle)
266      * @see #getUserRestrictions()
267      */
268     public static final String DISALLOW_APPS_CONTROL = "no_control_apps";
269 
270     /**
271      * Specifies if a user is disallowed from mounting
272      * physical external media. This can only be set by device owners and profile owners on the
273      * primary user. The default value is <code>false</code>.
274      *
275      * <p/>Key for user restrictions.
276      * <p/>Type: Boolean
277      * @see #setUserRestrictions(Bundle)
278      * @see #getUserRestrictions()
279      */
280     public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
281 
282     /**
283      * Specifies if a user is disallowed from adjusting microphone
284      * volume. If set, the microphone will be muted. This can only be set by device owners
285      * and profile owners on the primary user. The default value is <code>false</code>.
286      *
287      * <p/>Key for user restrictions.
288      * <p/>Type: Boolean
289      * @see #setUserRestrictions(Bundle)
290      * @see #getUserRestrictions()
291      */
292     public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
293 
294     /**
295      * Specifies if a user is disallowed from adjusting the master
296      * volume. If set, the master volume will be muted. This can only be set by device owners
297      * and profile owners on the primary user. The default value is <code>false</code>.
298      *
299      * <p/>Key for user restrictions.
300      * <p/>Type: Boolean
301      * @see #setUserRestrictions(Bundle)
302      * @see #getUserRestrictions()
303      */
304     public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
305 
306     /**
307      * Specifies that the user is not allowed to make outgoing
308      * phone calls. Emergency calls are still permitted.
309      * The default value is <code>false</code>.
310      *
311      * <p/>Key for user restrictions.
312      * <p/>Type: Boolean
313      * @see #setUserRestrictions(Bundle)
314      * @see #getUserRestrictions()
315      */
316     public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
317 
318     /**
319      * Specifies that the user is not allowed to send or receive
320      * SMS messages. The default value is <code>false</code>.
321      *
322      * <p/>Key for user restrictions.
323      * <p/>Type: Boolean
324      * @see #setUserRestrictions(Bundle)
325      * @see #getUserRestrictions()
326      */
327     public static final String DISALLOW_SMS = "no_sms";
328 
329     /**
330      * Specifies that windows besides app windows should not be
331      * created. This will block the creation of the following types of windows.
332      * <li>{@link LayoutParams#TYPE_TOAST}</li>
333      * <li>{@link LayoutParams#TYPE_PHONE}</li>
334      * <li>{@link LayoutParams#TYPE_PRIORITY_PHONE}</li>
335      * <li>{@link LayoutParams#TYPE_SYSTEM_ALERT}</li>
336      * <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li>
337      * <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li>
338      *
339      * <p>This can only be set by device owners and profile owners on the primary user.
340      * The default value is <code>false</code>.
341      *
342      * <p/>Key for user restrictions.
343      * <p/>Type: Boolean
344      * @see #setUserRestrictions(Bundle)
345      * @see #getUserRestrictions()
346      */
347     public static final String DISALLOW_CREATE_WINDOWS = "no_create_windows";
348 
349     /**
350      * Specifies if what is copied in the clipboard of this profile can
351      * be pasted in related profiles. Does not restrict if the clipboard of related profiles can be
352      * pasted in this profile.
353      * The default value is <code>false</code>.
354      *
355      * <p/>Key for user restrictions.
356      * <p/>Type: Boolean
357      * @see #setUserRestrictions(Bundle)
358      * @see #getUserRestrictions()
359      */
360     public static final String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
361 
362     /**
363      * Specifies if the user is not allowed to use NFC to beam out data from apps.
364      * The default value is <code>false</code>.
365      *
366      * <p/>Key for user restrictions.
367      * <p/>Type: Boolean
368      * @see #setUserRestrictions(Bundle)
369      * @see #getUserRestrictions()
370      * @hide
371      */
372     public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
373 
374     /** @hide */
375     public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
376     /** @hide */
377     public static final int PIN_VERIFICATION_FAILED_NOT_SET = -2;
378     /** @hide */
379     public static final int PIN_VERIFICATION_SUCCESS = -1;
380 
381     private static UserManager sInstance = null;
382 
383     /** @hide */
get(Context context)384     public synchronized static UserManager get(Context context) {
385         if (sInstance == null) {
386             sInstance = (UserManager) context.getSystemService(Context.USER_SERVICE);
387         }
388         return sInstance;
389     }
390 
391     /** @hide */
UserManager(Context context, IUserManager service)392     public UserManager(Context context, IUserManager service) {
393         mService = service;
394         mContext = context;
395     }
396 
397     /**
398      * Returns whether the system supports multiple users.
399      * @return true if multiple users can be created by user, false if it is a single user device.
400      * @hide
401      */
supportsMultipleUsers()402     public static boolean supportsMultipleUsers() {
403         return getMaxSupportedUsers() > 1
404                 && SystemProperties.getBoolean("fw.show_multiuserui",
405                 Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI));
406     }
407 
408     /**
409      * Returns the user handle for the user that the calling process is running on.
410      *
411      * @return the user handle of the user making this call.
412      * @hide
413      */
getUserHandle()414     public int getUserHandle() {
415         return UserHandle.myUserId();
416     }
417 
418     /**
419      * Returns the user name of the user making this call.  This call is only
420      * available to applications on the system image; it requires the
421      * MANAGE_USERS permission.
422      * @return the user name
423      */
getUserName()424     public String getUserName() {
425         try {
426             return mService.getUserInfo(getUserHandle()).name;
427         } catch (RemoteException re) {
428             Log.w(TAG, "Could not get user name", re);
429             return "";
430         }
431     }
432 
433     /**
434      * Used to determine whether the user making this call is subject to
435      * teleportations.
436      *
437      * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
438      * now automatically identify goats using advanced goat recognition technology.</p>
439      *
440      * @return Returns true if the user making this call is a goat.
441      */
isUserAGoat()442     public boolean isUserAGoat() {
443         return mContext.getPackageManager()
444                 .isPackageAvailable("com.coffeestainstudios.goatsimulator");
445     }
446 
447     /**
448      * Used to check if the user making this call is linked to another user. Linked users may have
449      * a reduced number of available apps, app restrictions and account restrictions.
450      * @return whether the user making this call is a linked user
451      * @hide
452      */
isLinkedUser()453     public boolean isLinkedUser() {
454         try {
455             return mService.isRestricted();
456         } catch (RemoteException re) {
457             Log.w(TAG, "Could not check if user is limited ", re);
458             return false;
459         }
460     }
461 
462     /**
463      * Checks if the calling app is running as a guest user.
464      * @return whether the caller is a guest user.
465      * @hide
466      */
isGuestUser()467     public boolean isGuestUser() {
468         UserInfo user = getUserInfo(UserHandle.myUserId());
469         return user != null ? user.isGuest() : false;
470     }
471 
472     /**
473      * Checks if the calling app is running in a managed profile.
474      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
475      *
476      * @return whether the caller is in a managed profile.
477      * @hide
478      */
479     @SystemApi
isManagedProfile()480     public boolean isManagedProfile() {
481         UserInfo user = getUserInfo(UserHandle.myUserId());
482         return user != null ? user.isManagedProfile() : false;
483     }
484 
485     /**
486      * Return whether the given user is actively running.  This means that
487      * the user is in the "started" state, not "stopped" -- it is currently
488      * allowed to run code through scheduled alarms, receiving broadcasts,
489      * etc.  A started user may be either the current foreground user or a
490      * background user; the result here does not distinguish between the two.
491      * @param user The user to retrieve the running state for.
492      */
isUserRunning(UserHandle user)493     public boolean isUserRunning(UserHandle user) {
494         try {
495             return ActivityManagerNative.getDefault().isUserRunning(
496                     user.getIdentifier(), false);
497         } catch (RemoteException e) {
498             return false;
499         }
500     }
501 
502     /**
503      * Return whether the given user is actively running <em>or</em> stopping.
504      * This is like {@link #isUserRunning(UserHandle)}, but will also return
505      * true if the user had been running but is in the process of being stopped
506      * (but is not yet fully stopped, and still running some code).
507      * @param user The user to retrieve the running state for.
508      */
isUserRunningOrStopping(UserHandle user)509     public boolean isUserRunningOrStopping(UserHandle user) {
510         try {
511             return ActivityManagerNative.getDefault().isUserRunning(
512                     user.getIdentifier(), true);
513         } catch (RemoteException e) {
514             return false;
515         }
516     }
517 
518     /**
519      * Returns the UserInfo object describing a specific user.
520      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
521      * @param userHandle the user handle of the user whose information is being requested.
522      * @return the UserInfo object for a specific user.
523      * @hide
524      */
getUserInfo(int userHandle)525     public UserInfo getUserInfo(int userHandle) {
526         try {
527             return mService.getUserInfo(userHandle);
528         } catch (RemoteException re) {
529             Log.w(TAG, "Could not get user info", re);
530             return null;
531         }
532     }
533 
534     /**
535      * Returns the user-wide restrictions imposed on this user.
536      * @return a Bundle containing all the restrictions.
537      */
getUserRestrictions()538     public Bundle getUserRestrictions() {
539         return getUserRestrictions(Process.myUserHandle());
540     }
541 
542     /**
543      * Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
544      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
545      * @return a Bundle containing all the restrictions.
546      */
getUserRestrictions(UserHandle userHandle)547     public Bundle getUserRestrictions(UserHandle userHandle) {
548         try {
549             return mService.getUserRestrictions(userHandle.getIdentifier());
550         } catch (RemoteException re) {
551             Log.w(TAG, "Could not get user restrictions", re);
552             return Bundle.EMPTY;
553         }
554     }
555 
556     /**
557      * Sets all the user-wide restrictions for this user.
558      * Requires the MANAGE_USERS permission.
559      * @param restrictions the Bundle containing all the restrictions.
560      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
561      * android.content.ComponentName, String)} or
562      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
563      * android.content.ComponentName, String)} instead.
564      */
565     @Deprecated
setUserRestrictions(Bundle restrictions)566     public void setUserRestrictions(Bundle restrictions) {
567         setUserRestrictions(restrictions, Process.myUserHandle());
568     }
569 
570     /**
571      * Sets all the user-wide restrictions for the specified user.
572      * Requires the MANAGE_USERS permission.
573      * @param restrictions the Bundle containing all the restrictions.
574      * @param userHandle the UserHandle of the user for whom to set the restrictions.
575      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
576      * android.content.ComponentName, String)} or
577      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
578      * android.content.ComponentName, String)} instead.
579      */
580     @Deprecated
setUserRestrictions(Bundle restrictions, UserHandle userHandle)581     public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) {
582         try {
583             mService.setUserRestrictions(restrictions, userHandle.getIdentifier());
584         } catch (RemoteException re) {
585             Log.w(TAG, "Could not set user restrictions", re);
586         }
587     }
588 
589     /**
590      * Sets the value of a specific restriction.
591      * Requires the MANAGE_USERS permission.
592      * @param key the key of the restriction
593      * @param value the value for the restriction
594      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
595      * android.content.ComponentName, String)} or
596      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
597      * android.content.ComponentName, String)} instead.
598      */
599     @Deprecated
setUserRestriction(String key, boolean value)600     public void setUserRestriction(String key, boolean value) {
601         Bundle bundle = getUserRestrictions();
602         bundle.putBoolean(key, value);
603         setUserRestrictions(bundle);
604     }
605 
606     /**
607      * @hide
608      * Sets the value of a specific restriction on a specific user.
609      * Requires the MANAGE_USERS permission.
610      * @param key the key of the restriction
611      * @param value the value for the restriction
612      * @param userHandle the user whose restriction is to be changed.
613      * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
614      * android.content.ComponentName, String)} or
615      * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
616      * android.content.ComponentName, String)} instead.
617      */
618     @Deprecated
setUserRestriction(String key, boolean value, UserHandle userHandle)619     public void setUserRestriction(String key, boolean value, UserHandle userHandle) {
620         Bundle bundle = getUserRestrictions(userHandle);
621         bundle.putBoolean(key, value);
622         setUserRestrictions(bundle, userHandle);
623     }
624 
625     /**
626      * Returns whether the current user has been disallowed from performing certain actions
627      * or setting certain settings.
628      *
629      * @param restrictionKey The string key representing the restriction.
630      * @return {@code true} if the current user has the given restriction, {@code false} otherwise.
631      */
hasUserRestriction(String restrictionKey)632     public boolean hasUserRestriction(String restrictionKey) {
633         return hasUserRestriction(restrictionKey, Process.myUserHandle());
634     }
635 
636     /**
637      * @hide
638      * Returns whether the given user has been disallowed from performing certain actions
639      * or setting certain settings.
640      * @param restrictionKey the string key representing the restriction
641      * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
642      */
hasUserRestriction(String restrictionKey, UserHandle userHandle)643     public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
644         try {
645             return mService.hasUserRestriction(restrictionKey,
646                     userHandle.getIdentifier());
647         } catch (RemoteException re) {
648             Log.w(TAG, "Could not check user restrictions", re);
649             return false;
650         }
651     }
652 
653     /**
654      * Return the serial number for a user.  This is a device-unique
655      * number assigned to that user; if the user is deleted and then a new
656      * user created, the new users will not be given the same serial number.
657      * @param user The user whose serial number is to be retrieved.
658      * @return The serial number of the given user; returns -1 if the
659      * given UserHandle does not exist.
660      * @see #getUserForSerialNumber(long)
661      */
getSerialNumberForUser(UserHandle user)662     public long getSerialNumberForUser(UserHandle user) {
663         return getUserSerialNumber(user.getIdentifier());
664     }
665 
666     /**
667      * Return the user associated with a serial number previously
668      * returned by {@link #getSerialNumberForUser(UserHandle)}.
669      * @param serialNumber The serial number of the user that is being
670      * retrieved.
671      * @return Return the user associated with the serial number, or null
672      * if there is not one.
673      * @see #getSerialNumberForUser(UserHandle)
674      */
getUserForSerialNumber(long serialNumber)675     public UserHandle getUserForSerialNumber(long serialNumber) {
676         int ident = getUserHandle((int)serialNumber);
677         return ident >= 0 ? new UserHandle(ident) : null;
678     }
679 
680     /**
681      * Creates a user with the specified name and options.
682      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
683      *
684      * @param name the user's name
685      * @param flags flags that identify the type of user and other properties.
686      * @see UserInfo
687      *
688      * @return the UserInfo object for the created user, or null if the user could not be created.
689      * @hide
690      */
createUser(String name, int flags)691     public UserInfo createUser(String name, int flags) {
692         try {
693             return mService.createUser(name, flags);
694         } catch (RemoteException re) {
695             Log.w(TAG, "Could not create a user", re);
696             return null;
697         }
698     }
699 
700     /**
701      * Creates a guest user and configures it.
702      * @param context an application context
703      * @param name the name to set for the user
704      * @hide
705      */
createGuest(Context context, String name)706     public UserInfo createGuest(Context context, String name) {
707         UserInfo guest = createUser(name, UserInfo.FLAG_GUEST);
708         if (guest != null) {
709             Settings.Secure.putStringForUser(context.getContentResolver(),
710                     Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
711             try {
712                 Bundle guestRestrictions = mService.getDefaultGuestRestrictions();
713                 guestRestrictions.putBoolean(DISALLOW_SMS, true);
714                 guestRestrictions.putBoolean(DISALLOW_INSTALL_UNKNOWN_SOURCES, true);
715                 mService.setUserRestrictions(guestRestrictions, guest.id);
716             } catch (RemoteException re) {
717                 Log.w(TAG, "Could not update guest restrictions");
718             }
719         }
720         return guest;
721     }
722 
723     /**
724      * Creates a secondary user with the specified name and options and configures it with default
725      * restrictions.
726      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
727      *
728      * @param name the user's name
729      * @param flags flags that identify the type of user and other properties.
730      * @see UserInfo
731      *
732      * @return the UserInfo object for the created user, or null if the user could not be created.
733      * @hide
734      */
createSecondaryUser(String name, int flags)735     public UserInfo createSecondaryUser(String name, int flags) {
736         try {
737             UserInfo user = mService.createUser(name, flags);
738             if (user == null) {
739                 return null;
740             }
741             Bundle userRestrictions = mService.getUserRestrictions(user.id);
742             addDefaultUserRestrictions(userRestrictions);
743             mService.setUserRestrictions(userRestrictions, user.id);
744             return user;
745         } catch (RemoteException re) {
746             Log.w(TAG, "Could not create a user", re);
747             return null;
748         }
749     }
750 
addDefaultUserRestrictions(Bundle restrictions)751     private static void addDefaultUserRestrictions(Bundle restrictions) {
752         restrictions.putBoolean(DISALLOW_OUTGOING_CALLS, true);
753         restrictions.putBoolean(DISALLOW_SMS, true);
754     }
755 
756     /**
757      * Creates a user with the specified name and options as a profile of another user.
758      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
759      *
760      * @param name the user's name
761      * @param flags flags that identify the type of user and other properties.
762      * @see UserInfo
763      * @param userHandle new user will be a profile of this use.
764      *
765      * @return the UserInfo object for the created user, or null if the user could not be created.
766      * @hide
767      */
createProfileForUser(String name, int flags, int userHandle)768     public UserInfo createProfileForUser(String name, int flags, int userHandle) {
769         try {
770             return mService.createProfileForUser(name, flags, userHandle);
771         } catch (RemoteException re) {
772             Log.w(TAG, "Could not create a user", re);
773             return null;
774         }
775     }
776 
777     /**
778      * @hide
779      * Marks the guest user for deletion to allow a new guest to be created before deleting
780      * the current user who is a guest.
781      * @param userHandle
782      * @return
783      */
markGuestForDeletion(int userHandle)784     public boolean markGuestForDeletion(int userHandle) {
785         try {
786             return mService.markGuestForDeletion(userHandle);
787         } catch (RemoteException re) {
788             Log.w(TAG, "Could not mark guest for deletion", re);
789             return false;
790         }
791     }
792 
793     /**
794      * Sets the user as enabled, if such an user exists.
795      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
796      * Note that the default is true, it's only that managed profiles might not be enabled.
797      *
798      * @param userHandle the id of the profile to enable
799      * @hide
800      */
setUserEnabled(int userHandle)801     public void setUserEnabled(int userHandle) {
802         try {
803             mService.setUserEnabled(userHandle);
804         } catch (RemoteException e) {
805             Log.w(TAG, "Could not enable the profile", e);
806         }
807     }
808 
809     /**
810      * Return the number of users currently created on the device.
811      */
getUserCount()812     public int getUserCount() {
813         List<UserInfo> users = getUsers();
814         return users != null ? users.size() : 1;
815     }
816 
817     /**
818      * Returns information for all users on this device.
819      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
820      * @return the list of users that were created.
821      * @hide
822      */
getUsers()823     public List<UserInfo> getUsers() {
824         try {
825             return mService.getUsers(false);
826         } catch (RemoteException re) {
827             Log.w(TAG, "Could not get user list", re);
828             return null;
829         }
830     }
831 
832     /**
833      * Checks whether it's possible to add more users. Caller must hold the MANAGE_USERS
834      * permission.
835      *
836      * @return true if more users can be added, false if limit has been reached.
837      * @hide
838      */
canAddMoreUsers()839     public boolean canAddMoreUsers() {
840         final List<UserInfo> users = getUsers(true);
841         final int totalUserCount = users.size();
842         int aliveUserCount = 0;
843         for (int i = 0; i < totalUserCount; i++) {
844             UserInfo user = users.get(i);
845             if (!user.isGuest()) {
846                 aliveUserCount++;
847             }
848         }
849         return aliveUserCount < getMaxSupportedUsers();
850     }
851 
852     /**
853      * Returns list of the profiles of userHandle including
854      * userHandle itself.
855      * Note that this returns both enabled and not enabled profiles. See
856      * {@link #getUserProfiles()} if you need only the enabled ones.
857      *
858      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
859      * @param userHandle profiles of this user will be returned.
860      * @return the list of profiles.
861      * @hide
862      */
getProfiles(int userHandle)863     public List<UserInfo> getProfiles(int userHandle) {
864         try {
865             return mService.getProfiles(userHandle, false /* enabledOnly */);
866         } catch (RemoteException re) {
867             Log.w(TAG, "Could not get user list", re);
868             return null;
869         }
870     }
871 
872     /**
873      * Returns a list of UserHandles for profiles associated with the user that the calling process
874      * is running on, including the user itself.
875      *
876      * @return A non-empty list of UserHandles associated with the calling user.
877      */
getUserProfiles()878     public List<UserHandle> getUserProfiles() {
879         ArrayList<UserHandle> profiles = new ArrayList<UserHandle>();
880         List<UserInfo> users = new ArrayList<UserInfo>();
881         try {
882             users = mService.getProfiles(UserHandle.myUserId(), true /* enabledOnly */);
883         } catch (RemoteException re) {
884             Log.w(TAG, "Could not get user list", re);
885             return null;
886         }
887         for (UserInfo info : users) {
888             UserHandle userHandle = new UserHandle(info.id);
889             profiles.add(userHandle);
890         }
891         return profiles;
892     }
893 
894     /**
895      * Returns the parent of the profile which this method is called from
896      * or null if called from a user that is not a profile.
897      *
898      * @hide
899      */
getProfileParent(int userHandle)900     public UserInfo getProfileParent(int userHandle) {
901         try {
902             return mService.getProfileParent(userHandle);
903         } catch (RemoteException re) {
904             Log.w(TAG, "Could not get profile parent", re);
905             return null;
906         }
907     }
908 
909     /**
910      * If the target user is a managed profile of the calling user or the caller
911      * is itself a managed profile, then this returns a badged copy of the given
912      * icon to be able to distinguish it from the original icon. For badging an
913      * arbitrary drawable use {@link #getBadgedDrawableForUser(
914      * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
915      * <p>
916      * If the original drawable is a BitmapDrawable and the backing bitmap is
917      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the bading
918      * is performed in place and the original drawable is returned.
919      * </p>
920      *
921      * @param icon The icon to badge.
922      * @param user The target user.
923      * @return A drawable that combines the original icon and a badge as
924      *         determined by the system.
925      * @removed
926      */
getBadgedIconForUser(Drawable icon, UserHandle user)927     public Drawable getBadgedIconForUser(Drawable icon, UserHandle user) {
928         return mContext.getPackageManager().getUserBadgedIcon(icon, user);
929     }
930 
931     /**
932      * If the target user is a managed profile of the calling user or the caller
933      * is itself a managed profile, then this returns a badged copy of the given
934      * drawable allowing the user to distinguish it from the original drawable.
935      * The caller can specify the location in the bounds of the drawable to be
936      * badged where the badge should be applied as well as the density of the
937      * badge to be used.
938      * <p>
939      * If the original drawable is a BitmapDrawable and the backing bitmap is
940      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the bading
941      * is performed in place and the original drawable is returned.
942      * </p>
943      *
944      * @param badgedDrawable The drawable to badge.
945      * @param user The target user.
946      * @param badgeLocation Where in the bounds of the badged drawable to place
947      *         the badge. If not provided, the badge is applied on top of the entire
948      *         drawable being badged.
949      * @param badgeDensity The optional desired density for the badge as per
950      *         {@link android.util.DisplayMetrics#densityDpi}. If not provided,
951      *         the density of the display is used.
952      * @return A drawable that combines the original drawable and a badge as
953      *         determined by the system.
954      * @removed
955      */
getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user, Rect badgeLocation, int badgeDensity)956     public Drawable getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user,
957             Rect badgeLocation, int badgeDensity) {
958         return mContext.getPackageManager().getUserBadgedDrawableForDensity(badgedDrawable, user,
959                 badgeLocation, badgeDensity);
960     }
961 
962     /**
963      * If the target user is a managed profile of the calling user or the caller
964      * is itself a managed profile, then this returns a copy of the label with
965      * badging for accessibility services like talkback. E.g. passing in "Email"
966      * and it might return "Work Email" for Email in the work profile.
967      *
968      * @param label The label to change.
969      * @param user The target user.
970      * @return A label that combines the original label and a badge as
971      *         determined by the system.
972      * @removed
973      */
getBadgedLabelForUser(CharSequence label, UserHandle user)974     public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) {
975         return mContext.getPackageManager().getUserBadgedLabel(label, user);
976     }
977 
978     /**
979      * Returns information for all users on this device. Requires
980      * {@link android.Manifest.permission#MANAGE_USERS} permission.
981      *
982      * @param excludeDying specify if the list should exclude users being
983      *            removed.
984      * @return the list of users that were created.
985      * @hide
986      */
getUsers(boolean excludeDying)987     public List<UserInfo> getUsers(boolean excludeDying) {
988         try {
989             return mService.getUsers(excludeDying);
990         } catch (RemoteException re) {
991             Log.w(TAG, "Could not get user list", re);
992             return null;
993         }
994     }
995 
996     /**
997      * Removes a user and all associated data.
998      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
999      * @param userHandle the integer handle of the user, where 0 is the primary user.
1000      * @hide
1001      */
removeUser(int userHandle)1002     public boolean removeUser(int userHandle) {
1003         try {
1004             return mService.removeUser(userHandle);
1005         } catch (RemoteException re) {
1006             Log.w(TAG, "Could not remove user ", re);
1007             return false;
1008         }
1009     }
1010 
1011     /**
1012      * Updates the user's name.
1013      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1014      *
1015      * @param userHandle the user's integer handle
1016      * @param name the new name for the user
1017      * @hide
1018      */
setUserName(int userHandle, String name)1019     public void setUserName(int userHandle, String name) {
1020         try {
1021             mService.setUserName(userHandle, name);
1022         } catch (RemoteException re) {
1023             Log.w(TAG, "Could not set the user name ", re);
1024         }
1025     }
1026 
1027     /**
1028      * Sets the user's photo.
1029      * @param userHandle the user for whom to change the photo.
1030      * @param icon the bitmap to set as the photo.
1031      * @hide
1032      */
setUserIcon(int userHandle, Bitmap icon)1033     public void setUserIcon(int userHandle, Bitmap icon) {
1034         try {
1035             mService.setUserIcon(userHandle, icon);
1036         } catch (RemoteException re) {
1037             Log.w(TAG, "Could not set the user icon ", re);
1038         }
1039     }
1040 
1041     /**
1042      * Returns a file descriptor for the user's photo. PNG data can be read from this file.
1043      * @param userHandle the user whose photo we want to read.
1044      * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
1045      * @see com.android.internal.util.UserIcons#getDefaultUserIcon for a default.
1046      * @hide
1047      */
getUserIcon(int userHandle)1048     public Bitmap getUserIcon(int userHandle) {
1049         try {
1050             return mService.getUserIcon(userHandle);
1051         } catch (RemoteException re) {
1052             Log.w(TAG, "Could not get the user icon ", re);
1053             return null;
1054         }
1055     }
1056 
1057     /**
1058      * Returns the maximum number of users that can be created on this device. A return value
1059      * of 1 means that it is a single user device.
1060      * @hide
1061      * @return a value greater than or equal to 1
1062      */
getMaxSupportedUsers()1063     public static int getMaxSupportedUsers() {
1064         // Don't allow multiple users on certain builds
1065         if (android.os.Build.ID.startsWith("JVP")) return 1;
1066         // Svelte devices don't get multi-user.
1067         if (ActivityManager.isLowRamDeviceStatic()) return 1;
1068         return SystemProperties.getInt("fw.max_users",
1069                 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
1070     }
1071 
1072     /**
1073      * Returns true if the user switcher should be shown, this will be if there
1074      * are multiple users that aren't managed profiles.
1075      * @hide
1076      * @return true if user switcher should be shown.
1077      */
isUserSwitcherEnabled()1078     public boolean isUserSwitcherEnabled() {
1079         List<UserInfo> users = getUsers(true);
1080         if (users == null) {
1081            return false;
1082         }
1083         int switchableUserCount = 0;
1084         for (UserInfo user : users) {
1085             if (user.supportsSwitchTo()) {
1086                 ++switchableUserCount;
1087             }
1088         }
1089         final boolean guestEnabled = Settings.Global.getInt(mContext.getContentResolver(),
1090                 Settings.Global.GUEST_USER_ENABLED, 0) == 1;
1091         return switchableUserCount > 1 || guestEnabled;
1092     }
1093 
1094     /**
1095      * Returns a serial number on this device for a given userHandle. User handles can be recycled
1096      * when deleting and creating users, but serial numbers are not reused until the device is wiped.
1097      * @param userHandle
1098      * @return a serial number associated with that user, or -1 if the userHandle is not valid.
1099      * @hide
1100      */
getUserSerialNumber(int userHandle)1101     public int getUserSerialNumber(int userHandle) {
1102         try {
1103             return mService.getUserSerialNumber(userHandle);
1104         } catch (RemoteException re) {
1105             Log.w(TAG, "Could not get serial number for user " + userHandle);
1106         }
1107         return -1;
1108     }
1109 
1110     /**
1111      * Returns a userHandle on this device for a given user serial number. User handles can be
1112      * recycled when deleting and creating users, but serial numbers are not reused until the device
1113      * is wiped.
1114      * @param userSerialNumber
1115      * @return the userHandle associated with that user serial number, or -1 if the serial number
1116      * is not valid.
1117      * @hide
1118      */
getUserHandle(int userSerialNumber)1119     public int getUserHandle(int userSerialNumber) {
1120         try {
1121             return mService.getUserHandle(userSerialNumber);
1122         } catch (RemoteException re) {
1123             Log.w(TAG, "Could not get userHandle for user " + userSerialNumber);
1124         }
1125         return -1;
1126     }
1127 
1128     /**
1129      * Returns a Bundle containing any saved application restrictions for this user, for the
1130      * given package name. Only an application with this package name can call this method.
1131      * @param packageName the package name of the calling application
1132      * @return a Bundle with the restrictions as key/value pairs, or null if there are no
1133      * saved restrictions. The values can be of type Boolean, String or String[], depending
1134      * on the restriction type, as defined by the application.
1135      */
getApplicationRestrictions(String packageName)1136     public Bundle getApplicationRestrictions(String packageName) {
1137         try {
1138             return mService.getApplicationRestrictions(packageName);
1139         } catch (RemoteException re) {
1140             Log.w(TAG, "Could not get application restrictions for package " + packageName);
1141         }
1142         return null;
1143     }
1144 
1145     /**
1146      * @hide
1147      */
getApplicationRestrictions(String packageName, UserHandle user)1148     public Bundle getApplicationRestrictions(String packageName, UserHandle user) {
1149         try {
1150             return mService.getApplicationRestrictionsForUser(packageName, user.getIdentifier());
1151         } catch (RemoteException re) {
1152             Log.w(TAG, "Could not get application restrictions for user " + user.getIdentifier());
1153         }
1154         return null;
1155     }
1156 
1157     /**
1158      * @hide
1159      */
setApplicationRestrictions(String packageName, Bundle restrictions, UserHandle user)1160     public void setApplicationRestrictions(String packageName, Bundle restrictions,
1161             UserHandle user) {
1162         try {
1163             mService.setApplicationRestrictions(packageName, restrictions, user.getIdentifier());
1164         } catch (RemoteException re) {
1165             Log.w(TAG, "Could not set application restrictions for user " + user.getIdentifier());
1166         }
1167     }
1168 
1169     /**
1170      * Sets a new challenge PIN for restrictions. This is only for use by pre-installed
1171      * apps and requires the MANAGE_USERS permission.
1172      * @param newPin the PIN to use for challenge dialogs.
1173      * @return Returns true if the challenge PIN was set successfully.
1174      */
setRestrictionsChallenge(String newPin)1175     public boolean setRestrictionsChallenge(String newPin) {
1176         try {
1177             return mService.setRestrictionsChallenge(newPin);
1178         } catch (RemoteException re) {
1179             Log.w(TAG, "Could not change restrictions pin");
1180         }
1181         return false;
1182     }
1183 
1184     /**
1185      * @hide
1186      * @param pin The PIN to verify, or null to get the number of milliseconds to wait for before
1187      * allowing the user to enter the PIN.
1188      * @return Returns a positive number (including zero) for how many milliseconds before
1189      * you can accept another PIN, when the input is null or the input doesn't match the saved PIN.
1190      * Returns {@link #PIN_VERIFICATION_SUCCESS} if the input matches the saved PIN. Returns
1191      * {@link #PIN_VERIFICATION_FAILED_NOT_SET} if there is no PIN set.
1192      */
checkRestrictionsChallenge(String pin)1193     public int checkRestrictionsChallenge(String pin) {
1194         try {
1195             return mService.checkRestrictionsChallenge(pin);
1196         } catch (RemoteException re) {
1197             Log.w(TAG, "Could not check restrictions pin");
1198         }
1199         return PIN_VERIFICATION_FAILED_INCORRECT;
1200     }
1201 
1202     /**
1203      * @hide
1204      * Checks whether the user has restrictions that are PIN-protected. An application that
1205      * participates in restrictions can check if the owner has requested a PIN challenge for
1206      * any restricted operations. If there is a PIN in effect, the application should launch
1207      * the PIN challenge activity {@link android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE}.
1208      * @see android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE
1209      * @return whether a restrictions PIN is in effect.
1210      */
hasRestrictionsChallenge()1211     public boolean hasRestrictionsChallenge() {
1212         try {
1213             return mService.hasRestrictionsChallenge();
1214         } catch (RemoteException re) {
1215             Log.w(TAG, "Could not change restrictions pin");
1216         }
1217         return false;
1218     }
1219 
1220     /** @hide */
removeRestrictions()1221     public void removeRestrictions() {
1222         try {
1223             mService.removeRestrictions();
1224         } catch (RemoteException re) {
1225             Log.w(TAG, "Could not change restrictions pin");
1226         }
1227     }
1228 
1229     /**
1230      * @hide
1231      * Set restrictions that should apply to any future guest user that's created.
1232      */
setDefaultGuestRestrictions(Bundle restrictions)1233     public void setDefaultGuestRestrictions(Bundle restrictions) {
1234         try {
1235             mService.setDefaultGuestRestrictions(restrictions);
1236         } catch (RemoteException re) {
1237             Log.w(TAG, "Could not set guest restrictions");
1238         }
1239     }
1240 
1241     /**
1242      * @hide
1243      * Gets the default guest restrictions.
1244      */
getDefaultGuestRestrictions()1245     public Bundle getDefaultGuestRestrictions() {
1246         try {
1247             return mService.getDefaultGuestRestrictions();
1248         } catch (RemoteException re) {
1249             Log.w(TAG, "Could not set guest restrictions");
1250         }
1251         return new Bundle();
1252     }
1253 }
1254