blob: 5d087eab01dcbd7e1d1ac4fa67cd7977c8bfed2a [file] [log] [blame]
Amith Yamasani258848d2012-08-10 17:06:33 -07001/*
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 */
16package android.os;
17
Dianne Hackborna8a9bd62012-10-09 15:36:59 -070018import android.app.ActivityManagerNative;
Amith Yamasani258848d2012-08-10 17:06:33 -070019import android.content.Context;
20import android.content.pm.UserInfo;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -070021import android.content.res.Resources;
Maggie Benthall67944582013-02-22 14:58:27 -050022import android.graphics.Bitmap;
Amith Yamasani258848d2012-08-10 17:06:33 -070023import android.util.Log;
24
Maggie Benthall67944582013-02-22 14:58:27 -050025import com.android.internal.R;
26
Amith Yamasani258848d2012-08-10 17:06:33 -070027import java.util.List;
28
29/**
30 * Manages users and user details on a multi-user system.
31 */
32public class UserManager {
33
34 private static String TAG = "UserManager";
35 private final IUserManager mService;
36 private final Context mContext;
37
Amith Yamasanie4cf7342012-12-17 11:12:09 -080038 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -070039 * Key for user restrictions. Specifies if a user is disallowed from adding and removing
40 * accounts.
41 * The default value is <code>false</code>.
42 * <p/>
Amith Yamasanie4cf7342012-12-17 11:12:09 -080043 * Type: Boolean
44 * @see #setUserRestrictions(Bundle)
45 * @see #getUserRestrictions()
46 */
Amith Yamasani71e6c692013-03-24 17:39:28 -070047 public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
Amith Yamasanie4cf7342012-12-17 11:12:09 -080048
49 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -070050 * Key for user restrictions. Specifies if a user is disallowed from changing Wi-Fi
51 * access points.
52 * The default value is <code>false</code>.
53 * <p/>
Amith Yamasanie4cf7342012-12-17 11:12:09 -080054 * Type: Boolean
55 * @see #setUserRestrictions(Bundle)
56 * @see #getUserRestrictions()
57 */
Amith Yamasani71e6c692013-03-24 17:39:28 -070058 public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
Amith Yamasanie4cf7342012-12-17 11:12:09 -080059
60 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -070061 * Key for user restrictions. Specifies if a user is disallowed from installing applications.
62 * The default value is <code>false</code>.
63 * <p/>
Amith Yamasanie4cf7342012-12-17 11:12:09 -080064 * Type: Boolean
65 * @see #setUserRestrictions(Bundle)
66 * @see #getUserRestrictions()
67 */
Amith Yamasani71e6c692013-03-24 17:39:28 -070068 public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -080069
70 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -070071 * Key for user restrictions. Specifies if a user is disallowed from uninstalling applications.
72 * The default value is <code>false</code>.
73 * <p/>
Amith Yamasanie4cf7342012-12-17 11:12:09 -080074 * Type: Boolean
75 * @see #setUserRestrictions(Bundle)
76 * @see #getUserRestrictions()
77 */
Amith Yamasani71e6c692013-03-24 17:39:28 -070078 public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -080079
Amith Yamasani71e6c692013-03-24 17:39:28 -070080 /**
81 * Key for user restrictions. Specifies if a user is disallowed from toggling location sharing.
82 * The default value is <code>false</code>.
83 * <p/>
Maggie Benthall67944582013-02-22 14:58:27 -050084 * Type: Boolean
85 * @see #setUserRestrictions(Bundle)
86 * @see #getUserRestrictions()
87 */
Maggie Benthalla12fccf2013-03-14 18:02:12 -040088
Amith Yamasani71e6c692013-03-24 17:39:28 -070089 public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
Maggie Benthall67944582013-02-22 14:58:27 -050090
Maggie Benthalla12fccf2013-03-14 18:02:12 -040091 /**
92 * Key for user restrictions. Specifies if a user is disallowed from enabling the
93 * "Unknown Sources" setting, that allows installation of apps from unknown sources.
94 * The default value is <code>false</code>.
95 * <p/>
96 * Type: Boolean
97 * @see #setUserRestrictions(Bundle)
98 * @see #getUserRestrictions()
99 */
100 public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
101
102 /**
103 * Key for user restrictions. Specifies if a user is disallowed from configuring bluetooth.
104 * The default value is <code>false</code>.
105 * <p/>
106 * Type: Boolean
107 * @see #setUserRestrictions(Bundle)
108 * @see #getUserRestrictions()
109 */
110 public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
111
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400112 /**
113 * Key for user restrictions. Specifies if a user is disallowed from transferring files over
114 * USB. The default value is <code>false</code>.
115 * <p/>
116 * Type: Boolean
117 * @see #setUserRestrictions(Bundle)
118 * @see #getUserRestrictions()
119 */
120 public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
121
Emily Bernierb223f732013-04-11 15:46:36 -0400122 /**
123 * Key for user restrictions. Specifies if a user is disallowed from configuring user
124 * credentials. The default value is <code>false</code>.
125 * <p/>
126 * Type: Boolean
127 * @see #setUserRestrictions(Bundle)
128 * @see #getUserRestrictions()
129 */
130 public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
131
132 /**
133 * Key for user restrictions. Specifies if a user is disallowed from removing users.
134 * The default value is <code>false</code>.
135 * <p/>
136 * Type: Boolean
137 * @see #setUserRestrictions(Bundle)
138 * @see #getUserRestrictions()
139 */
140 public static final String DISALLOW_REMOVE_USER = "no_remove_user";
141
Amith Yamasani655d0e22013-06-12 14:19:10 -0700142 /** @hide */
143 public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
144 /** @hide */
145 public static final int PIN_VERIFICATION_FAILED_NOT_SET = -2;
146 /** @hide */
147 public static final int PIN_VERIFICATION_SUCCESS = -1;
148
Amith Yamasani27db4682013-03-30 17:07:47 -0700149 private static UserManager sInstance = null;
150
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700151 /** @hide */
Amith Yamasani27db4682013-03-30 17:07:47 -0700152 public synchronized static UserManager get(Context context) {
153 if (sInstance == null) {
154 sInstance = (UserManager) context.getSystemService(Context.USER_SERVICE);
155 }
156 return sInstance;
157 }
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400158
Amith Yamasani258848d2012-08-10 17:06:33 -0700159 /** @hide */
160 public UserManager(Context context, IUserManager service) {
161 mService = service;
162 mContext = context;
163 }
164
165 /**
166 * Returns whether the system supports multiple users.
167 * @return true if multiple users can be created, false if it is a single user device.
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700168 * @hide
Amith Yamasani258848d2012-08-10 17:06:33 -0700169 */
Jeff Sharkey4673e7e2012-09-19 13:14:30 -0700170 public static boolean supportsMultipleUsers() {
Amith Yamasani258848d2012-08-10 17:06:33 -0700171 return getMaxSupportedUsers() > 1;
172 }
173
Maggie Benthall67944582013-02-22 14:58:27 -0500174 /**
Amith Yamasani258848d2012-08-10 17:06:33 -0700175 * Returns the user handle for the user that this application is running for.
176 * @return the user handle of the user making this call.
177 * @hide
Maggie Benthall67944582013-02-22 14:58:27 -0500178 */
Amith Yamasani258848d2012-08-10 17:06:33 -0700179 public int getUserHandle() {
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700180 return UserHandle.myUserId();
Amith Yamasani258848d2012-08-10 17:06:33 -0700181 }
182
183 /**
Dianne Hackborn8832c182012-09-17 17:20:24 -0700184 * Returns the user name of the user making this call. This call is only
185 * available to applications on the system image; it requires the
186 * MANAGE_USERS permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700187 * @return the user name
188 */
189 public String getUserName() {
190 try {
191 return mService.getUserInfo(getUserHandle()).name;
192 } catch (RemoteException re) {
193 Log.w(TAG, "Could not get user name", re);
194 return "";
195 }
196 }
197
Dan Morrille4ab16a2012-09-20 20:25:55 -0700198 /**
199 * Used to determine whether the user making this call is subject to
200 * teleportations.
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400201 * @return whether the user making this call is a goat
Dan Morrille4ab16a2012-09-20 20:25:55 -0700202 */
203 public boolean isUserAGoat() {
204 return false;
205 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800206
207 /**
Amith Yamasanie1375902013-04-13 16:48:35 -0700208 * Used to check if the user making this call is linked to another user. Linked users may have
Amith Yamasani46bc4eb2013-04-12 13:26:50 -0700209 * a reduced number of available apps, app restrictions and account restrictions.
Amith Yamasanie1375902013-04-13 16:48:35 -0700210 * @return whether the user making this call is a linked user
Amith Yamasani2555daf2013-04-25 13:39:27 -0700211 * @hide
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800212 */
Amith Yamasanie1375902013-04-13 16:48:35 -0700213 public boolean isLinkedUser() {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800214 try {
Amith Yamasani71e6c692013-03-24 17:39:28 -0700215 return mService.isRestricted();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800216 } catch (RemoteException re) {
Amith Yamasani46bc4eb2013-04-12 13:26:50 -0700217 Log.w(TAG, "Could not check if user is limited ", re);
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800218 return false;
219 }
220 }
221
Amith Yamasani258848d2012-08-10 17:06:33 -0700222 /**
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700223 * Return whether the given user is actively running. This means that
224 * the user is in the "started" state, not "stopped" -- it is currently
225 * allowed to run code through scheduled alarms, receiving broadcasts,
226 * etc. A started user may be either the current foreground user or a
227 * background user; the result here does not distinguish between the two.
228 * @param user The user to retrieve the running state for.
229 */
230 public boolean isUserRunning(UserHandle user) {
231 try {
232 return ActivityManagerNative.getDefault().isUserRunning(
233 user.getIdentifier(), false);
234 } catch (RemoteException e) {
235 return false;
236 }
237 }
238
239 /**
240 * Return whether the given user is actively running <em>or</em> stopping.
241 * This is like {@link #isUserRunning(UserHandle)}, but will also return
242 * true if the user had been running but is in the process of being stopped
243 * (but is not yet fully stopped, and still running some code).
244 * @param user The user to retrieve the running state for.
245 */
246 public boolean isUserRunningOrStopping(UserHandle user) {
247 try {
248 return ActivityManagerNative.getDefault().isUserRunning(
249 user.getIdentifier(), true);
250 } catch (RemoteException e) {
251 return false;
252 }
253 }
254
255 /**
Amith Yamasani258848d2012-08-10 17:06:33 -0700256 * Returns the UserInfo object describing a specific user.
Amith Yamasani195263742012-08-21 15:40:12 -0700257 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700258 * @param userHandle the user handle of the user whose information is being requested.
259 * @return the UserInfo object for a specific user.
260 * @hide
Dianne Hackbornb26306a2012-10-24 15:22:21 -0700261 */
Amith Yamasani258848d2012-08-10 17:06:33 -0700262 public UserInfo getUserInfo(int userHandle) {
263 try {
264 return mService.getUserInfo(userHandle);
265 } catch (RemoteException re) {
266 Log.w(TAG, "Could not get user info", re);
267 return null;
268 }
269 }
270
Amith Yamasani71e6c692013-03-24 17:39:28 -0700271 /**
272 * Returns the user-wide restrictions imposed on this user.
273 * @return a Bundle containing all the restrictions.
274 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800275 public Bundle getUserRestrictions() {
276 return getUserRestrictions(Process.myUserHandle());
277 }
278
Amith Yamasani71e6c692013-03-24 17:39:28 -0700279 /**
280 * Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
281 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
282 * @return a Bundle containing all the restrictions.
283 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800284 public Bundle getUserRestrictions(UserHandle userHandle) {
285 try {
286 return mService.getUserRestrictions(userHandle.getIdentifier());
287 } catch (RemoteException re) {
288 Log.w(TAG, "Could not get user restrictions", re);
289 return Bundle.EMPTY;
290 }
291 }
292
Amith Yamasani71e6c692013-03-24 17:39:28 -0700293 /**
294 * Sets all the user-wide restrictions for this user.
Amith Yamasanica050ad2013-03-26 16:15:43 -0700295 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700296 * @param restrictions the Bundle containing all the restrictions.
297 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800298 public void setUserRestrictions(Bundle restrictions) {
299 setUserRestrictions(restrictions, Process.myUserHandle());
300 }
301
Amith Yamasani71e6c692013-03-24 17:39:28 -0700302 /**
303 * Sets all the user-wide restrictions for the specified user.
Amith Yamasanica050ad2013-03-26 16:15:43 -0700304 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700305 * @param restrictions the Bundle containing all the restrictions.
306 * @param userHandle the UserHandle of the user for whom to set the restrictions.
307 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800308 public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) {
309 try {
310 mService.setUserRestrictions(restrictions, userHandle.getIdentifier());
311 } catch (RemoteException re) {
312 Log.w(TAG, "Could not set user restrictions", re);
313 }
314 }
315
Amith Yamasani71e6c692013-03-24 17:39:28 -0700316 /**
317 * Sets the value of a specific restriction.
Amith Yamasanica050ad2013-03-26 16:15:43 -0700318 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700319 * @param key the key of the restriction
320 * @param value the value for the restriction
Amith Yamasani71e6c692013-03-24 17:39:28 -0700321 */
322 public void setUserRestriction(String key, boolean value) {
323 Bundle bundle = getUserRestrictions();
324 bundle.putBoolean(key, value);
325 setUserRestrictions(bundle);
326 }
327
328 /**
329 * @hide
330 * Sets the value of a specific restriction on a specific user.
331 * Requires the {@link android.Manifest.permission#MANAGE_USERS} permission.
332 * @param key the key of the restriction
333 * @param value the value for the restriction
334 * @param userHandle the user whose restriction is to be changed.
335 */
Maggie Benthall67944582013-02-22 14:58:27 -0500336 public void setUserRestriction(String key, boolean value, UserHandle userHandle) {
337 Bundle bundle = getUserRestrictions(userHandle);
338 bundle.putBoolean(key, value);
339 setUserRestrictions(bundle, userHandle);
340 }
341
Amith Yamasani258848d2012-08-10 17:06:33 -0700342 /**
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400343 * @hide
344 * Returns whether the current user has been disallowed from performing certain actions
345 * or setting certain settings.
346 * @param restrictionKey the string key representing the restriction
347 */
348 public boolean hasUserRestriction(String restrictionKey) {
David Christieb12ba932013-09-03 17:15:28 -0700349 return hasUserRestriction(restrictionKey, Process.myUserHandle());
350 }
351
352 /**
353 * @hide
354 * Returns whether the given user has been disallowed from performing certain actions
355 * or setting certain settings.
356 * @param restrictionKey the string key representing the restriction
357 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
358 */
359 public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
360 return getUserRestrictions(userHandle).getBoolean(restrictionKey, false);
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400361 }
362
363 /**
Dianne Hackborn33f9cb82012-10-04 17:15:10 -0700364 * Return the serial number for a user. This is a device-unique
Dianne Hackbornb26306a2012-10-24 15:22:21 -0700365 * number assigned to that user; if the user is deleted and then a new
366 * user created, the new users will not be given the same serial number.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -0700367 * @param user The user whose serial number is to be retrieved.
Dianne Hackbornb26306a2012-10-24 15:22:21 -0700368 * @return The serial number of the given user; returns -1 if the
369 * given UserHandle does not exist.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -0700370 * @see #getUserForSerialNumber(long)
371 */
372 public long getSerialNumberForUser(UserHandle user) {
373 return getUserSerialNumber(user.getIdentifier());
374 }
375
376 /**
377 * Return the user associated with a serial number previously
378 * returned by {@link #getSerialNumberForUser(UserHandle)}.
379 * @param serialNumber The serial number of the user that is being
380 * retrieved.
381 * @return Return the user associated with the serial number, or null
382 * if there is not one.
383 * @see #getSerialNumberForUser(UserHandle)
384 */
385 public UserHandle getUserForSerialNumber(long serialNumber) {
386 int ident = getUserHandle((int)serialNumber);
387 return ident >= 0 ? new UserHandle(ident) : null;
388 }
389
390 /**
Amith Yamasani258848d2012-08-10 17:06:33 -0700391 * Creates a user with the specified name and options.
Amith Yamasani195263742012-08-21 15:40:12 -0700392 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700393 *
394 * @param name the user's name
395 * @param flags flags that identify the type of user and other properties.
396 * @see UserInfo
397 *
398 * @return the UserInfo object for the created user, or null if the user could not be created.
399 * @hide
400 */
401 public UserInfo createUser(String name, int flags) {
402 try {
403 return mService.createUser(name, flags);
404 } catch (RemoteException re) {
405 Log.w(TAG, "Could not create a user", re);
406 return null;
407 }
408 }
409
410 /**
Dianne Hackbornb26306a2012-10-24 15:22:21 -0700411 * Return the number of users currently created on the device.
412 */
413 public int getUserCount() {
414 List<UserInfo> users = getUsers();
415 return users != null ? users.size() : 1;
416 }
417
418 /**
Amith Yamasani258848d2012-08-10 17:06:33 -0700419 * Returns information for all users on this device.
Amith Yamasani195263742012-08-21 15:40:12 -0700420 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700421 * @return the list of users that were created.
422 * @hide
423 */
424 public List<UserInfo> getUsers() {
425 try {
Amith Yamasani920ace02012-09-20 22:15:37 -0700426 return mService.getUsers(false);
427 } catch (RemoteException re) {
428 Log.w(TAG, "Could not get user list", re);
429 return null;
430 }
431 }
432
433 /**
434 * Returns information for all users on this device.
435 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
436 * @param excludeDying specify if the list should exclude users being removed.
437 * @return the list of users that were created.
438 * @hide
439 */
440 public List<UserInfo> getUsers(boolean excludeDying) {
441 try {
442 return mService.getUsers(excludeDying);
Amith Yamasani258848d2012-08-10 17:06:33 -0700443 } catch (RemoteException re) {
444 Log.w(TAG, "Could not get user list", re);
445 return null;
446 }
447 }
448
449 /**
450 * Removes a user and all associated data.
Amith Yamasani195263742012-08-21 15:40:12 -0700451 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700452 * @param userHandle the integer handle of the user, where 0 is the primary user.
453 * @hide
454 */
455 public boolean removeUser(int userHandle) {
456 try {
457 return mService.removeUser(userHandle);
458 } catch (RemoteException re) {
459 Log.w(TAG, "Could not remove user ", re);
460 return false;
461 }
462 }
463
464 /**
465 * Updates the user's name.
Amith Yamasani195263742012-08-21 15:40:12 -0700466 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700467 *
468 * @param userHandle the user's integer handle
469 * @param name the new name for the user
470 * @hide
471 */
472 public void setUserName(int userHandle, String name) {
473 try {
474 mService.setUserName(userHandle, name);
475 } catch (RemoteException re) {
476 Log.w(TAG, "Could not set the user name ", re);
477 }
478 }
479
480 /**
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700481 * Sets the user's photo.
Amith Yamasani258848d2012-08-10 17:06:33 -0700482 * @param userHandle the user for whom to change the photo.
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700483 * @param icon the bitmap to set as the photo.
Amith Yamasani258848d2012-08-10 17:06:33 -0700484 * @hide
485 */
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700486 public void setUserIcon(int userHandle, Bitmap icon) {
Amith Yamasani258848d2012-08-10 17:06:33 -0700487 try {
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700488 mService.setUserIcon(userHandle, icon);
Amith Yamasani258848d2012-08-10 17:06:33 -0700489 } catch (RemoteException re) {
490 Log.w(TAG, "Could not set the user icon ", re);
Amith Yamasani258848d2012-08-10 17:06:33 -0700491 }
492 }
493
494 /**
Amith Yamasani3b49f072012-09-17 10:21:43 -0700495 * Returns a file descriptor for the user's photo. PNG data can be read from this file.
496 * @param userHandle the user whose photo we want to read.
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700497 * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
Amith Yamasani3b49f072012-09-17 10:21:43 -0700498 * @hide
499 */
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700500 public Bitmap getUserIcon(int userHandle) {
Amith Yamasani3b49f072012-09-17 10:21:43 -0700501 try {
502 return mService.getUserIcon(userHandle);
503 } catch (RemoteException re) {
Amith Yamasanie928d7d2012-09-17 21:46:51 -0700504 Log.w(TAG, "Could not get the user icon ", re);
Amith Yamasani3b49f072012-09-17 10:21:43 -0700505 return null;
506 }
507 }
508
509 /**
Amith Yamasani258848d2012-08-10 17:06:33 -0700510 * Enable or disable the use of a guest account. If disabled, the existing guest account
511 * will be wiped.
Amith Yamasani195263742012-08-21 15:40:12 -0700512 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700513 * @param enable whether to enable a guest account.
514 * @hide
515 */
516 public void setGuestEnabled(boolean enable) {
517 try {
518 mService.setGuestEnabled(enable);
519 } catch (RemoteException re) {
520 Log.w(TAG, "Could not change guest account availability to " + enable);
521 }
522 }
523
524 /**
525 * Checks if a guest user is enabled for this device.
Amith Yamasani195263742012-08-21 15:40:12 -0700526 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700527 * @return whether a guest user is enabled
528 * @hide
529 */
530 public boolean isGuestEnabled() {
531 try {
532 return mService.isGuestEnabled();
533 } catch (RemoteException re) {
534 Log.w(TAG, "Could not retrieve guest enabled state");
535 return false;
536 }
537 }
538
539 /**
540 * Wipes all the data for a user, but doesn't remove the user.
Amith Yamasani195263742012-08-21 15:40:12 -0700541 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700542 * @param userHandle
543 * @hide
544 */
545 public void wipeUser(int userHandle) {
546 try {
547 mService.wipeUser(userHandle);
548 } catch (RemoteException re) {
549 Log.w(TAG, "Could not wipe user " + userHandle);
550 }
551 }
552
553 /**
554 * Returns the maximum number of users that can be created on this device. A return value
555 * of 1 means that it is a single user device.
556 * @hide
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400557 * @return a value greater than or equal to 1
Amith Yamasani258848d2012-08-10 17:06:33 -0700558 */
Jeff Sharkey27bd34d2012-09-16 12:49:00 -0700559 public static int getMaxSupportedUsers() {
Amith Yamasaniff549202012-10-12 12:44:49 -0700560 // Don't allow multiple users on certain builds
561 if (android.os.Build.ID.startsWith("JVP")) return 1;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -0700562 return SystemProperties.getInt("fw.max_users",
563 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
Amith Yamasani258848d2012-08-10 17:06:33 -0700564 }
Amith Yamasani2a003292012-08-14 18:25:45 -0700565
566 /**
567 * Returns a serial number on this device for a given userHandle. User handles can be recycled
568 * when deleting and creating users, but serial numbers are not reused until the device is wiped.
569 * @param userHandle
570 * @return a serial number associated with that user, or -1 if the userHandle is not valid.
571 * @hide
572 */
573 public int getUserSerialNumber(int userHandle) {
574 try {
575 return mService.getUserSerialNumber(userHandle);
576 } catch (RemoteException re) {
577 Log.w(TAG, "Could not get serial number for user " + userHandle);
578 }
579 return -1;
580 }
581
582 /**
583 * Returns a userHandle on this device for a given user serial number. User handles can be
584 * recycled when deleting and creating users, but serial numbers are not reused until the device
585 * is wiped.
586 * @param userSerialNumber
587 * @return the userHandle associated with that user serial number, or -1 if the serial number
588 * is not valid.
589 * @hide
590 */
591 public int getUserHandle(int userSerialNumber) {
592 try {
593 return mService.getUserHandle(userSerialNumber);
594 } catch (RemoteException re) {
595 Log.w(TAG, "Could not get userHandle for user " + userSerialNumber);
596 }
597 return -1;
598 }
Maggie Benthall67944582013-02-22 14:58:27 -0500599
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700600 /**
601 * Returns a Bundle containing any saved application restrictions for this user, for the
602 * given package name. Only an application with this package name can call this method.
603 * @param packageName the package name of the calling application
604 * @return a Bundle with the restrictions as key/value pairs, or null if there are no
605 * saved restrictions. The values can be of type Boolean, String or String[], depending
606 * on the restriction type, as defined by the application.
607 */
608 public Bundle getApplicationRestrictions(String packageName) {
609 try {
610 return mService.getApplicationRestrictions(packageName);
611 } catch (RemoteException re) {
612 Log.w(TAG, "Could not get application restrictions for package " + packageName);
613 }
614 return null;
615 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800616
617 /**
618 * @hide
619 */
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700620 public Bundle getApplicationRestrictions(String packageName, UserHandle user) {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800621 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700622 return mService.getApplicationRestrictionsForUser(packageName, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800623 } catch (RemoteException re) {
624 Log.w(TAG, "Could not get application restrictions for user " + user.getIdentifier());
625 }
626 return null;
627 }
628
629 /**
630 * @hide
631 */
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700632 public void setApplicationRestrictions(String packageName, Bundle restrictions,
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800633 UserHandle user) {
634 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700635 mService.setApplicationRestrictions(packageName, restrictions, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800636 } catch (RemoteException re) {
637 Log.w(TAG, "Could not set application restrictions for user " + user.getIdentifier());
638 }
639 }
Amith Yamasani655d0e22013-06-12 14:19:10 -0700640
641 /**
Amith Yamasanid304af62013-09-05 09:30:23 -0700642 * Sets a new challenge PIN for restrictions. This is only for use by pre-installed
643 * apps and requires the MANAGE_USERS permission.
644 * @param newPin the PIN to use for challenge dialogs.
645 * @return Returns true if the challenge PIN was set successfully.
Amith Yamasani655d0e22013-06-12 14:19:10 -0700646 */
Amith Yamasanid304af62013-09-05 09:30:23 -0700647 public boolean setRestrictionsChallenge(String newPin) {
Amith Yamasani655d0e22013-06-12 14:19:10 -0700648 try {
Amith Yamasanid304af62013-09-05 09:30:23 -0700649 return mService.setRestrictionsChallenge(newPin);
Amith Yamasani655d0e22013-06-12 14:19:10 -0700650 } catch (RemoteException re) {
651 Log.w(TAG, "Could not change restrictions pin");
652 }
653 return false;
654 }
655
656 /**
657 * @hide
658 * @param pin The PIN to verify, or null to get the number of milliseconds to wait for before
659 * allowing the user to enter the PIN.
660 * @return Returns a positive number (including zero) for how many milliseconds before
661 * you can accept another PIN, when the input is null or the input doesn't match the saved PIN.
662 * Returns {@link #PIN_VERIFICATION_SUCCESS} if the input matches the saved PIN. Returns
663 * {@link #PIN_VERIFICATION_FAILED_NOT_SET} if there is no PIN set.
664 */
Amith Yamasanid304af62013-09-05 09:30:23 -0700665 public int checkRestrictionsChallenge(String pin) {
Amith Yamasani655d0e22013-06-12 14:19:10 -0700666 try {
Amith Yamasanid304af62013-09-05 09:30:23 -0700667 return mService.checkRestrictionsChallenge(pin);
Amith Yamasani655d0e22013-06-12 14:19:10 -0700668 } catch (RemoteException re) {
669 Log.w(TAG, "Could not check restrictions pin");
670 }
671 return PIN_VERIFICATION_FAILED_INCORRECT;
672 }
673
674 /**
Amith Yamasanid304af62013-09-05 09:30:23 -0700675 * @hide
Amith Yamasani655d0e22013-06-12 14:19:10 -0700676 * Checks whether the user has restrictions that are PIN-protected. An application that
677 * participates in restrictions can check if the owner has requested a PIN challenge for
678 * any restricted operations. If there is a PIN in effect, the application should launch
Amith Yamasanid304af62013-09-05 09:30:23 -0700679 * the PIN challenge activity {@link android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE}.
680 * @see android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE
Amith Yamasani655d0e22013-06-12 14:19:10 -0700681 * @return whether a restrictions PIN is in effect.
682 */
Amith Yamasanid304af62013-09-05 09:30:23 -0700683 public boolean hasRestrictionsChallenge() {
Amith Yamasani655d0e22013-06-12 14:19:10 -0700684 try {
Amith Yamasanid304af62013-09-05 09:30:23 -0700685 return mService.hasRestrictionsChallenge();
Amith Yamasani655d0e22013-06-12 14:19:10 -0700686 } catch (RemoteException re) {
687 Log.w(TAG, "Could not change restrictions pin");
688 }
689 return false;
690 }
Amith Yamasani1a7472e2013-07-02 11:17:30 -0700691
692 /** @hide */
693 public void removeRestrictions() {
694 try {
695 mService.removeRestrictions();
696 } catch (RemoteException re) {
697 Log.w(TAG, "Could not change restrictions pin");
698 }
699 }
Amith Yamasani258848d2012-08-10 17:06:33 -0700700}