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