UserManager.java revision e4cf73437a18c1444055f88a1fcc0d146ec23ac5
1258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani/* 2258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Copyright (C) 2012 The Android Open Source Project 3258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 4258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * you may not use this file except in compliance with the License. 6258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * You may obtain a copy of the License at 7258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 8258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 10258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Unless required by applicable law or agreed to in writing, software 11258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * See the License for the specific language governing permissions and 14258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * limitations under the License. 15258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 16258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasanipackage android.os; 17258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 18258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport com.android.internal.R; 19a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn 20a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackbornimport android.app.ActivityManagerNative; 21258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.Context; 22258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.pm.UserInfo; 23e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasaniimport android.graphics.Bitmap; 2427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkeyimport android.content.res.Resources; 25258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.util.Log; 26258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 27258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport java.util.List; 28258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 29258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani/** 30258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Manages users and user details on a multi-user system. 31258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 32258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasanipublic class UserManager { 33258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 34258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani private static String TAG = "UserManager"; 35258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani private final IUserManager mService; 36258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani private final Context mContext; 37258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 38e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** 39e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @hide 40e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Key for user restrictions. Specifies if a user is allowed to add or remove accounts. 41e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Type: Boolean 42e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #setUserRestrictions(Bundle) 43e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #getUserRestrictions() 44e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani */ 45e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public static final String ALLOW_MODIFY_ACCOUNTS = "modify_accounts"; 46e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 47e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** 48e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @hide 49e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Key for user restrictions. Specifies if a user is allowed to change Wi-Fi access points. 50e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Type: Boolean 51e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #setUserRestrictions(Bundle) 52e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #getUserRestrictions() 53e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani */ 54e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public static final String ALLOW_CONFIG_WIFI = "config_wifi"; 55e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 56e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** 57e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @hide 58e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Key for user restrictions. Specifies if a user is allowed to install applications. 59e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Type: Boolean 60e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #setUserRestrictions(Bundle) 61e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #getUserRestrictions() 62e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani */ 63e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public static final String ALLOW_INSTALL_APPS = "install_apps"; 64e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 65e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** 66e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @hide 67e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Key for user restrictions. Specifies if a user is allowed to uninstall applications. 68e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * Type: Boolean 69e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #setUserRestrictions(Bundle) 70e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani * @see #getUserRestrictions() 71e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani */ 72e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public static final String ALLOW_UNINSTALL_APPS = "uninstall_apps"; 73e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 74258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** @hide */ 75258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public UserManager(Context context, IUserManager service) { 76258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mService = service; 77258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mContext = context; 78258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 79258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 80258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 81258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Returns whether the system supports multiple users. 82258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return true if multiple users can be created, false if it is a single user device. 83e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani * @hide 84258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 854673e7ea8d1f869910a9c0f9c211d4d27ad50b41Jeff Sharkey public static boolean supportsMultipleUsers() { 86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return getMaxSupportedUsers() > 1; 87258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 88258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 89258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 90258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Returns the user handle for the user that this application is running for. 91258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return the user handle of the user making this call. 92258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 93258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * */ 94258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public int getUserHandle() { 9579af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn return UserHandle.myUserId(); 96258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 97258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 98258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 998832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn * Returns the user name of the user making this call. This call is only 1008832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn * available to applications on the system image; it requires the 1018832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn * MANAGE_USERS permission. 102258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return the user name 103258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 104258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public String getUserName() { 105258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 106258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return mService.getUserInfo(getUserHandle()).name; 107258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 108258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not get user name", re); 109258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return ""; 110258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 111258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 112258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 113e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill /** 114e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill * Used to determine whether the user making this call is subject to 115e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill * teleportations. 116e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill * @return whether the user making this call is a goat 117e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill */ 118e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill public boolean isUserAGoat() { 119e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill return false; 120e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill } 121e4ab16ad98b183afbf7a21ad7314372de41a8b57Dan Morrill 122258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 123a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * Return whether the given user is actively running. This means that 124a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * the user is in the "started" state, not "stopped" -- it is currently 125a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * allowed to run code through scheduled alarms, receiving broadcasts, 126a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * etc. A started user may be either the current foreground user or a 127a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * background user; the result here does not distinguish between the two. 128a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * @param user The user to retrieve the running state for. 129a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn */ 130a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn public boolean isUserRunning(UserHandle user) { 131a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn try { 132a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn return ActivityManagerNative.getDefault().isUserRunning( 133a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn user.getIdentifier(), false); 134a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } catch (RemoteException e) { 135a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn return false; 136a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } 137a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } 138a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn 139a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn /** 140a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * Return whether the given user is actively running <em>or</em> stopping. 141a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * This is like {@link #isUserRunning(UserHandle)}, but will also return 142a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * true if the user had been running but is in the process of being stopped 143a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * (but is not yet fully stopped, and still running some code). 144a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn * @param user The user to retrieve the running state for. 145a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn */ 146a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn public boolean isUserRunningOrStopping(UserHandle user) { 147a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn try { 148a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn return ActivityManagerNative.getDefault().isUserRunning( 149a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn user.getIdentifier(), true); 150a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } catch (RemoteException e) { 151a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn return false; 152a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } 153a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn } 154a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn 155a8a9bd65bf5865d83ef44f54552ca39522bfbcf0Dianne Hackborn /** 156258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Returns the UserInfo object describing a specific user. 1571952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 158258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param userHandle the user handle of the user whose information is being requested. 159258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return the UserInfo object for a specific user. 160258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 161b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn */ 162258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public UserInfo getUserInfo(int userHandle) { 163258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 164258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return mService.getUserInfo(userHandle); 165258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 166258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not get user info", re); 167258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return null; 168258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 169258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 170258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 171e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** @hide */ 172e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public Bundle getUserRestrictions() { 173e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani return getUserRestrictions(Process.myUserHandle()); 174e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 175e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 176e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** @hide */ 177e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public Bundle getUserRestrictions(UserHandle userHandle) { 178e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani try { 179e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani return mService.getUserRestrictions(userHandle.getIdentifier()); 180e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } catch (RemoteException re) { 181e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani Log.w(TAG, "Could not get user restrictions", re); 182e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani return Bundle.EMPTY; 183e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 184e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 185e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 186e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** @hide */ 187e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public void setUserRestrictions(Bundle restrictions) { 188e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani setUserRestrictions(restrictions, Process.myUserHandle()); 189e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 190e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 191e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani /** @hide */ 192e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) { 193e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani try { 194e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani mService.setUserRestrictions(restrictions, userHandle.getIdentifier()); 195e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } catch (RemoteException re) { 196e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani Log.w(TAG, "Could not set user restrictions", re); 197e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 198e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 199e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 200258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 20133f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * Return the serial number for a user. This is a device-unique 202b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn * number assigned to that user; if the user is deleted and then a new 203b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn * user created, the new users will not be given the same serial number. 20433f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * @param user The user whose serial number is to be retrieved. 205b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn * @return The serial number of the given user; returns -1 if the 206b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn * given UserHandle does not exist. 20733f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * @see #getUserForSerialNumber(long) 20833f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn */ 20933f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn public long getSerialNumberForUser(UserHandle user) { 21033f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn return getUserSerialNumber(user.getIdentifier()); 21133f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn } 21233f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn 21333f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn /** 21433f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * Return the user associated with a serial number previously 21533f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * returned by {@link #getSerialNumberForUser(UserHandle)}. 21633f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * @param serialNumber The serial number of the user that is being 21733f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * retrieved. 21833f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * @return Return the user associated with the serial number, or null 21933f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * if there is not one. 22033f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn * @see #getSerialNumberForUser(UserHandle) 22133f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn */ 22233f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn public UserHandle getUserForSerialNumber(long serialNumber) { 22333f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn int ident = getUserHandle((int)serialNumber); 22433f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn return ident >= 0 ? new UserHandle(ident) : null; 22533f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn } 22633f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn 22733f9cb8cf01e0a6288eb5b9ce724c56aa4e1e382Dianne Hackborn /** 228258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Creates a user with the specified name and options. 2291952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 230258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 231258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param name the user's name 232258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param flags flags that identify the type of user and other properties. 233258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @see UserInfo 234258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 235258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return the UserInfo object for the created user, or null if the user could not be created. 236258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 237258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 238258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public UserInfo createUser(String name, int flags) { 239258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 240258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return mService.createUser(name, flags); 241258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 242258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not create a user", re); 243258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return null; 244258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 245258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 246258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 247258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 248b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn * Return the number of users currently created on the device. 249b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn */ 250b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn public int getUserCount() { 251b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn List<UserInfo> users = getUsers(); 252b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn return users != null ? users.size() : 1; 253b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn } 254b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn 255b26306ad5277097b3abb345112b24d9a142fb299Dianne Hackborn /** 256258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Returns information for all users on this device. 2571952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 258258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return the list of users that were created. 259258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 260258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 261258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public List<UserInfo> getUsers() { 262258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 263920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani return mService.getUsers(false); 264920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani } catch (RemoteException re) { 265920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani Log.w(TAG, "Could not get user list", re); 266920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani return null; 267920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani } 268920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani } 269920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani 270920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani /** 271920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani * Returns information for all users on this device. 272920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 273920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani * @param excludeDying specify if the list should exclude users being removed. 274920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani * @return the list of users that were created. 275920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani * @hide 276920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani */ 277920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani public List<UserInfo> getUsers(boolean excludeDying) { 278920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani try { 279920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani return mService.getUsers(excludeDying); 280258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 281258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not get user list", re); 282258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return null; 283258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 284258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 285258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 286258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 287258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Removes a user and all associated data. 2881952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 289258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param userHandle the integer handle of the user, where 0 is the primary user. 290258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 291258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 292258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public boolean removeUser(int userHandle) { 293258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 294258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return mService.removeUser(userHandle); 295258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 296258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not remove user ", re); 297258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return false; 298258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 299258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 300258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 301258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 302258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Updates the user's name. 3031952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 304258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * 305258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param userHandle the user's integer handle 306258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param name the new name for the user 307258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 308258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 309258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public void setUserName(int userHandle, String name) { 310258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 311258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mService.setUserName(userHandle, name); 312258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 313258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not set the user name ", re); 314258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 315258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 316258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 317258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 318e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani * Sets the user's photo. 319258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param userHandle the user for whom to change the photo. 320e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani * @param icon the bitmap to set as the photo. 321258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 322258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 323e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani public void setUserIcon(int userHandle, Bitmap icon) { 324258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 325e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani mService.setUserIcon(userHandle, icon); 326258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 327258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not set the user icon ", re); 328258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 329258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 330258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 331258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 3323b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani * Returns a file descriptor for the user's photo. PNG data can be read from this file. 3333b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani * @param userHandle the user whose photo we want to read. 334e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani * @return a {@link Bitmap} of the user's photo, or null if there's no photo. 3353b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani * @hide 3363b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani */ 337e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani public Bitmap getUserIcon(int userHandle) { 3383b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani try { 3393b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani return mService.getUserIcon(userHandle); 3403b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani } catch (RemoteException re) { 341e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani Log.w(TAG, "Could not get the user icon ", re); 3423b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani return null; 3433b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani } 3443b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani } 3453b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani 3463b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani /** 347258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Enable or disable the use of a guest account. If disabled, the existing guest account 348258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * will be wiped. 3491952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 350258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param enable whether to enable a guest account. 351258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 352258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 353258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public void setGuestEnabled(boolean enable) { 354258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 355258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mService.setGuestEnabled(enable); 356258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 357258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not change guest account availability to " + enable); 358258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 359258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 360258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 361258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 362258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Checks if a guest user is enabled for this device. 3631952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 364258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return whether a guest user is enabled 365258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 366258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 367258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public boolean isGuestEnabled() { 368258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 369258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return mService.isGuestEnabled(); 370258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 371258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not retrieve guest enabled state"); 372258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return false; 373258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 374258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 375258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 376258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 377258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Wipes all the data for a user, but doesn't remove the user. 3781952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. 379258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @param userHandle 380258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 381258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 382258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public void wipeUser(int userHandle) { 383258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 384258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mService.wipeUser(userHandle); 385258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 386258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.w(TAG, "Could not wipe user " + userHandle); 387258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 388258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 389258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 390258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** 391258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Returns the maximum number of users that can be created on this device. A return value 392258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * of 1 means that it is a single user device. 393258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @hide 394258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * @return a value greater than or equal to 1 395258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */ 39627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey public static int getMaxSupportedUsers() { 397ff54920ed222a2bd6abe618743a5a3e9fe10bd4bAmith Yamasani // Don't allow multiple users on certain builds 398ff54920ed222a2bd6abe618743a5a3e9fe10bd4bAmith Yamasani if (android.os.Build.ID.startsWith("JVP")) return 1; 39927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey return SystemProperties.getInt("fw.max_users", 40027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers)); 401258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 4022a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani 4032a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani /** 4042a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * Returns a serial number on this device for a given userHandle. User handles can be recycled 4052a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * when deleting and creating users, but serial numbers are not reused until the device is wiped. 4062a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @param userHandle 4072a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @return a serial number associated with that user, or -1 if the userHandle is not valid. 4082a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @hide 4092a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani */ 4102a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani public int getUserSerialNumber(int userHandle) { 4112a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani try { 4122a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani return mService.getUserSerialNumber(userHandle); 4132a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } catch (RemoteException re) { 4142a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani Log.w(TAG, "Could not get serial number for user " + userHandle); 4152a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } 4162a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani return -1; 4172a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } 4182a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani 4192a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani /** 4202a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * Returns a userHandle on this device for a given user serial number. User handles can be 4212a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * recycled when deleting and creating users, but serial numbers are not reused until the device 4222a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * is wiped. 4232a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @param userSerialNumber 4242a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @return the userHandle associated with that user serial number, or -1 if the serial number 4252a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * is not valid. 4262a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani * @hide 4272a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani */ 4282a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani public int getUserHandle(int userSerialNumber) { 4292a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani try { 4302a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani return mService.getUserHandle(userSerialNumber); 4312a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } catch (RemoteException re) { 4322a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani Log.w(TAG, "Could not get userHandle for user " + userSerialNumber); 4332a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } 4342a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani return -1; 4352a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } 436258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani} 437