Home | History | Annotate | Download | only in os
      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 */
    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 */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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
    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      */
    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      */
    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      */
    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      */
    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      */
    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
    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
    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
    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
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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 
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
    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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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      */
   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 */
   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      */
   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      */
   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