UserManager.java revision 1952637425eece18aa1ce3d80d4b49086ef3bcf7
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;
19258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.Context;
20258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.pm.UserInfo;
21258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.util.Log;
22258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
23258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport java.util.List;
24258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
25258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani/**
26258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Manages users and user details on a multi-user system.
27258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */
28258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasanipublic class UserManager {
29258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
30258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private static String TAG = "UserManager";
31258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private final IUserManager mService;
32258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private final Context mContext;
33258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
34258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /** @hide */
35258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserManager(Context context, IUserManager service) {
36258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mService = service;
37258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mContext = context;
38258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
39258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
40258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
41258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns whether the system supports multiple users.
42258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return true if multiple users can be created, false if it is a single user device.
43258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
44258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public boolean supportsMultipleUsers() {
45258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        return getMaxSupportedUsers() > 1;
46258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
47258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
48258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
49258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the user handle for the user that this application is running for.
50258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the user handle of the user making this call.
51258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
52258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * */
53258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public int getUserHandle() {
5479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return UserHandle.myUserId();
55258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
56258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
57258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
58258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the user name of the user making this call.
591952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
60258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the user name
61258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
62258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public String getUserName() {
63258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
64258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUserInfo(getUserHandle()).name;
65258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
66258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user name", re);
67258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return "";
68258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
69258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
70258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
71258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
72258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the UserInfo object describing a specific user.
731952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
74258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user handle of the user whose information is being requested.
75258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the UserInfo object for a specific user.
76258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
77258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * */
78258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserInfo getUserInfo(int userHandle) {
79258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
80258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUserInfo(userHandle);
81258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
82258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user info", re);
83258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
84258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
85258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
87258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
88258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Creates a user with the specified name and options.
891952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
90258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
91258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param name the user's name
92258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param flags flags that identify the type of user and other properties.
93258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @see UserInfo
94258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
95258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the UserInfo object for the created user, or null if the user could not be created.
96258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
97258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
98258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserInfo createUser(String name, int flags) {
99258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
100258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.createUser(name, flags);
101258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
102258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not create a user", re);
103258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
104258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
105258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
106258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
107258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
108258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns information for all users on this device.
1091952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
110258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the list of users that were created.
111258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
112258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
113258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public List<UserInfo> getUsers() {
114258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
115258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUsers();
116258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
117258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user list", re);
118258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
119258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
120258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
121258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
122258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
123258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Removes a user and all associated data.
1241952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
125258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the integer handle of the user, where 0 is the primary user.
126258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
127258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
128258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public boolean removeUser(int userHandle) {
129258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
130258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.removeUser(userHandle);
131258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
132258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not remove user ", re);
133258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return false;
134258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
135258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
136258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
137258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
138258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Updates the user's name.
1391952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
140258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
141258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user's integer handle
142258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param name the new name for the user
143258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
144258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
145258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void setUserName(int userHandle, String name) {
146258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
147258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.setUserName(userHandle, name);
148258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
149258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not set the user name ", re);
150258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
151258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
152258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
153258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
154258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns a file descriptor for the user's photo. PNG data can be written into this file.
155258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user for whom to change the photo.
156258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return a {@link ParcelFileDescriptor} to which to write the photo.
157258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
158258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
159258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public ParcelFileDescriptor setUserIcon(int userHandle) {
160258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
161258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.setUserIcon(userHandle);
162258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
163258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not set the user icon ", re);
164258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
165258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
166258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
167258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
168258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
169258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Enable or disable the use of a guest account. If disabled, the existing guest account
170258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * will be wiped.
1711952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
172258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param enable whether to enable a guest account.
173258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
174258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
175258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void setGuestEnabled(boolean enable) {
176258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
177258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.setGuestEnabled(enable);
178258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
179258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not change guest account availability to " + enable);
180258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
181258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
182258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
183258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
184258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Checks if a guest user is enabled for this device.
1851952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
186258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return whether a guest user is enabled
187258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
188258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
189258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public boolean isGuestEnabled() {
190258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
191258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.isGuestEnabled();
192258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
193258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not retrieve guest enabled state");
194258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return false;
195258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
196258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
197258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
198258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
199258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Wipes all the data for a user, but doesn't remove the user.
2001952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
201258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle
202258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
203258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
204258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void wipeUser(int userHandle) {
205258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
206258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.wipeUser(userHandle);
207258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
208258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not wipe user " + userHandle);
209258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
210258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
211258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
212258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
213258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the maximum number of users that can be created on this device. A return value
214258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * of 1 means that it is a single user device.
215258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
216258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return a value greater than or equal to 1
217258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
218258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public int getMaxSupportedUsers() {
219258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        return mContext.getResources().getInteger(R.integer.config_multiuserMaximumUsers);
220258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
2212a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2222a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    /**
2232a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * Returns a serial number on this device for a given userHandle. User handles can be recycled
2242a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * when deleting and creating users, but serial numbers are not reused until the device is wiped.
2252a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @param userHandle
2262a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @return a serial number associated with that user, or -1 if the userHandle is not valid.
2272a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @hide
2282a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     */
2292a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int getUserSerialNumber(int userHandle) {
2302a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        try {
2312a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            return mService.getUserSerialNumber(userHandle);
2322a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        } catch (RemoteException re) {
2332a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            Log.w(TAG, "Could not get serial number for user " + userHandle);
2342a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        }
2352a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        return -1;
2362a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    }
2372a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2382a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    /**
2392a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * Returns a userHandle on this device for a given user serial number. User handles can be
2402a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * recycled when deleting and creating users, but serial numbers are not reused until the device
2412a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * is wiped.
2422a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @param userSerialNumber
2432a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @return the userHandle associated with that user serial number, or -1 if the serial number
2442a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * is not valid.
2452a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @hide
2462a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     */
2472a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int getUserHandle(int userSerialNumber) {
2482a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        try {
2492a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            return mService.getUserHandle(userSerialNumber);
2502a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        } catch (RemoteException re) {
2512a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            Log.w(TAG, "Could not get userHandle for user " + userSerialNumber);
2522a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        }
2532a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        return -1;
2542a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    }
2552a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2562a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
257258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani}
258