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