UserManager.java revision 4673e7ea8d1f869910a9c0f9c211d4d27ad50b41
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;
21e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasaniimport android.graphics.Bitmap;
2227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkeyimport android.content.res.Resources;
23258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.util.Log;
24258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
25258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport java.util.List;
26258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
27258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani/**
28258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani * Manages users and user details on a multi-user system.
29258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani */
30258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasanipublic class UserManager {
31258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
32258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private static String TAG = "UserManager";
33258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private final IUserManager mService;
34258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private final Context mContext;
35258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
36258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /** @hide */
37258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserManager(Context context, IUserManager service) {
38258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mService = service;
39258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mContext = context;
40258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
41258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
42258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
43258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns whether the system supports multiple users.
44258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return true if multiple users can be created, false if it is a single user device.
45e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani     * @hide
46258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
474673e7ea8d1f869910a9c0f9c211d4d27ad50b41Jeff Sharkey    public static boolean supportsMultipleUsers() {
48258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        return getMaxSupportedUsers() > 1;
49258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
50258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
51258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
52258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the user handle for the user that this application is running for.
53258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the user handle of the user making this call.
54258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
55258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * */
56258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public int getUserHandle() {
5779af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn        return UserHandle.myUserId();
58258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
59258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
60258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
618832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn     * Returns the user name of the user making this call.  This call is only
628832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn     * available to applications on the system image; it requires the
638832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn     * MANAGE_USERS permission.
64258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the user name
65258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
66258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public String getUserName() {
67258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
68258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUserInfo(getUserHandle()).name;
69258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
70258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user name", re);
71258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return "";
72258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
73258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
74258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
75258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
76258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the UserInfo object describing a specific user.
771952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
78258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user handle of the user whose information is being requested.
79258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the UserInfo object for a specific user.
80258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
81258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * */
82258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserInfo getUserInfo(int userHandle) {
83258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
84258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUserInfo(userHandle);
85258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user info", re);
87258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
88258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
89258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
90258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
91258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
92258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Creates a user with the specified name and options.
931952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
94258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
95258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param name the user's name
96258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param flags flags that identify the type of user and other properties.
97258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @see UserInfo
98258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
99258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the UserInfo object for the created user, or null if the user could not be created.
100258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
101258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
102258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public UserInfo createUser(String name, int flags) {
103258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
104258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.createUser(name, flags);
105258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
106258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not create a user", re);
107258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
108258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
109258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
110258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
111258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
112258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns information for all users on this device.
1131952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
114258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return the list of users that were created.
115258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
116258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
117258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public List<UserInfo> getUsers() {
118258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
119258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.getUsers();
120258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
121258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not get user list", re);
122258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return null;
123258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
124258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
125258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
126258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
127258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Removes a user and all associated data.
1281952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
129258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the integer handle of the user, where 0 is the primary user.
130258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
131258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
132258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public boolean removeUser(int userHandle) {
133258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
134258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.removeUser(userHandle);
135258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
136258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not remove user ", re);
137258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return false;
138258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
139258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
140258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
141258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
142258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Updates the user's name.
1431952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
144258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     *
145258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user's integer handle
146258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param name the new name for the user
147258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
148258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
149258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void setUserName(int userHandle, String name) {
150258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
151258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.setUserName(userHandle, name);
152258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
153258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not set the user name ", re);
154258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
155258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
156258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
157258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
158e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani     * Sets the user's photo.
159258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle the user for whom to change the photo.
160e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani     * @param icon the bitmap to set as the photo.
161258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
162258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
163e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani    public void setUserIcon(int userHandle, Bitmap icon) {
164258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
165e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani            mService.setUserIcon(userHandle, icon);
166258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
167258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not set the user icon ", re);
168258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
169258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
170258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
171258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
1723b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani     * Returns a file descriptor for the user's photo. PNG data can be read from this file.
1733b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani     * @param userHandle the user whose photo we want to read.
174e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani     * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
1753b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani     * @hide
1763b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani     */
177e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani    public Bitmap getUserIcon(int userHandle) {
1783b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani        try {
1793b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani            return mService.getUserIcon(userHandle);
1803b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani        } catch (RemoteException re) {
181e928d7d95dbb64627e6ff3a0572190c555b59d96Amith Yamasani            Log.w(TAG, "Could not get the user icon ", re);
1823b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani            return null;
1833b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani        }
1843b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani    }
1853b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani
1863b49f07a452e0a77c1d22db2065255689a461d31Amith Yamasani    /**
187258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Enable or disable the use of a guest account. If disabled, the existing guest account
188258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * will be wiped.
1891952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
190258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param enable whether to enable a guest account.
191258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
192258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
193258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void setGuestEnabled(boolean enable) {
194258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
195258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.setGuestEnabled(enable);
196258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
197258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not change guest account availability to " + enable);
198258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
199258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
200258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
201258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
202258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Checks if a guest user is enabled for this device.
2031952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
204258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return whether a guest user is enabled
205258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
206258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
207258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public boolean isGuestEnabled() {
208258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
209258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return mService.isGuestEnabled();
210258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
211258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not retrieve guest enabled state");
212258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            return false;
213258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
214258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
215258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
216258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
217258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Wipes all the data for a user, but doesn't remove the user.
2181952637425eece18aa1ce3d80d4b49086ef3bcf7Amith Yamasani     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
219258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @param userHandle
220258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
221258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
222258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    public void wipeUser(int userHandle) {
223258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        try {
224258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            mService.wipeUser(userHandle);
225258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        } catch (RemoteException re) {
226258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.w(TAG, "Could not wipe user " + userHandle);
227258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
228258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
229258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
230258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    /**
231258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * Returns the maximum number of users that can be created on this device. A return value
232258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * of 1 means that it is a single user device.
233258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @hide
234258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     * @return a value greater than or equal to 1
235258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani     */
23627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey    public static int getMaxSupportedUsers() {
23727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey        return SystemProperties.getInt("fw.max_users",
23827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey                Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
239258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    }
2402a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2412a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    /**
2422a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * Returns a serial number on this device for a given userHandle. User handles can be recycled
2432a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * when deleting and creating users, but serial numbers are not reused until the device is wiped.
2442a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @param userHandle
2452a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @return a serial number associated with that user, or -1 if the userHandle is not valid.
2462a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @hide
2472a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     */
2482a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int getUserSerialNumber(int userHandle) {
2492a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        try {
2502a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            return mService.getUserSerialNumber(userHandle);
2512a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        } catch (RemoteException re) {
2522a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            Log.w(TAG, "Could not get serial number for user " + userHandle);
2532a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        }
2542a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        return -1;
2552a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    }
2562a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2572a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    /**
2582a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * Returns a userHandle on this device for a given user serial number. User handles can be
2592a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * recycled when deleting and creating users, but serial numbers are not reused until the device
2602a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * is wiped.
2612a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @param userSerialNumber
2622a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @return the userHandle associated with that user serial number, or -1 if the serial number
2632a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * is not valid.
2642a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     * @hide
2652a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani     */
2662a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    public int getUserHandle(int userSerialNumber) {
2672a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        try {
2682a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            return mService.getUserHandle(userSerialNumber);
2692a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        } catch (RemoteException re) {
2702a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani            Log.w(TAG, "Could not get userHandle for user " + userSerialNumber);
2712a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        }
2722a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani        return -1;
2732a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani    }
2742a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
2752a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani
276258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani}
277