blob: c656b066a51ddfc75f042953ef8fac84cc3b9b9a [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 */
Jeff Sharkey8a372a02016-03-16 16:25:45 -060016
Amith Yamasani258848d2012-08-10 17:06:33 -070017package android.os;
18
Xiaohui Chenb3b92582015-12-07 11:22:13 -080019import android.Manifest;
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -070020import android.accounts.AccountManager;
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +010021import android.annotation.IntDef;
Xiaohui Chen7cb69df2015-07-13 16:01:01 -070022import android.annotation.Nullable;
Xiaohui Chenb3b92582015-12-07 11:22:13 -080023import android.annotation.RequiresPermission;
Amith Yamasani0e8d7d62014-09-03 13:17:28 -070024import android.annotation.SystemApi;
Jeff Sharkey8588bc12016-01-06 16:47:42 -070025import android.annotation.UserIdInt;
Fyodor Kupolov4e9af062016-07-18 16:59:11 -070026import android.annotation.WorkerThread;
Amith Yamasani37ed8d12016-01-27 14:40:16 -080027import android.app.Activity;
Dianne Hackborn409297d2014-07-10 17:39:20 -070028import android.app.ActivityManager;
Dianne Hackborna8a9bd62012-10-09 15:36:59 -070029import android.app.ActivityManagerNative;
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -070030import android.app.admin.DevicePolicyManager;
Makoto Onuki068c54a2015-10-13 14:34:03 -070031import android.content.ComponentName;
Amith Yamasani258848d2012-08-10 17:06:33 -070032import android.content.Context;
Amith Yamasani12747872015-12-07 14:19:49 -080033import android.content.Intent;
Benjamin Franzf02420c2016-04-04 18:52:21 +010034import android.content.IntentSender;
Amith Yamasani258848d2012-08-10 17:06:33 -070035import android.content.pm.UserInfo;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -070036import android.content.res.Resources;
Maggie Benthall67944582013-02-22 14:58:27 -050037import android.graphics.Bitmap;
Adrian Roos1bdff912015-02-17 15:51:35 +010038import android.graphics.BitmapFactory;
Amith Yamasani4f582632014-02-19 14:31:52 -080039import android.graphics.Rect;
Amith Yamasani4f582632014-02-19 14:31:52 -080040import android.graphics.drawable.Drawable;
Amith Yamasani1e9c2182014-06-11 17:25:51 -070041import android.provider.Settings;
Fyodor Kupolov523c4042016-02-24 15:03:13 -080042import android.telephony.TelephonyManager;
Jason Monk1c7c3192014-06-26 12:52:18 -040043import android.view.WindowManager.LayoutParams;
Amith Yamasani258848d2012-08-10 17:06:33 -070044
Maggie Benthall67944582013-02-22 14:58:27 -050045import com.android.internal.R;
John Reckaa67f682016-09-20 14:24:21 -070046import com.android.internal.os.RoSystemProperties;
Maggie Benthall67944582013-02-22 14:58:27 -050047
Adrian Roos1bdff912015-02-17 15:51:35 +010048import java.io.IOException;
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +010049import java.lang.annotation.Retention;
50import java.lang.annotation.RetentionPolicy;
Amith Yamasani4f582632014-02-19 14:31:52 -080051import java.util.ArrayList;
Amith Yamasani258848d2012-08-10 17:06:33 -070052import java.util.List;
53
54/**
Amith Yamasani06964342016-04-15 13:55:01 -070055 * Manages users and user details on a multi-user system. There are two major categories of
56 * users: fully customizable users with their own login, and managed profiles that share a workspace
57 * with a related user.
58 * <p>
59 * Users are different from accounts, which are managed by
60 * {@link AccountManager}. Each user can have their own set of accounts.
61 * <p>
62 * See {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} for more on managed profiles.
Amith Yamasani258848d2012-08-10 17:06:33 -070063 */
64public class UserManager {
65
66 private static String TAG = "UserManager";
67 private final IUserManager mService;
68 private final Context mContext;
69
Amith Yamasanie4cf7342012-12-17 11:12:09 -080070 /**
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +010071 * @hide
72 * No user restriction.
73 */
74 @SystemApi
75 public static final int RESTRICTION_NOT_SET = 0x0;
76
77 /**
78 * @hide
79 * User restriction set by system/user.
80 */
81 @SystemApi
82 public static final int RESTRICTION_SOURCE_SYSTEM = 0x1;
83
84 /**
85 * @hide
86 * User restriction set by a device owner.
87 */
88 @SystemApi
89 public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 0x2;
90
91 /**
92 * @hide
93 * User restriction set by a profile owner.
94 */
95 @SystemApi
96 public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 0x4;
97
98 /** @hide */
99 @Retention(RetentionPolicy.SOURCE)
100 @IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM,
101 RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER})
102 @SystemApi
103 public @interface UserRestrictionSource {}
104
105 /**
Fyodor Kupolov53019282015-07-21 11:48:18 -0700106 * Specifies if a user is disallowed from adding and removing accounts, unless they are
107 * {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by
108 * Authenticator.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700109 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700110 *
Benjamin Franzb6c0ce42015-11-05 10:06:51 +0000111 * <p>From {@link android.os.Build.VERSION_CODES#N} a profile or device owner app can still
112 * use {@link android.accounts.AccountManager} APIs to add or remove accounts when account
113 * management is disallowed.
114 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800115 * <p>Key for user restrictions.
116 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700117 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
118 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800119 * @see #getUserRestrictions()
120 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700121 public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800122
123 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700124 * Specifies if a user is disallowed from changing Wi-Fi
Julia Reynolds2cb384f2014-08-13 15:15:55 -0400125 * access points. The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800126 * <p>This restriction has no effect in a managed profile.
Amith Yamasani26af8292014-09-09 09:57:27 -0700127 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800128 * <p>Key for user restrictions.
129 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700130 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
131 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800132 * @see #getUserRestrictions()
133 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700134 public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800135
136 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700137 * Specifies if a user is disallowed from installing applications.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700138 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700139 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800140 * <p>Key for user restrictions.
141 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700142 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
143 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800144 * @see #getUserRestrictions()
145 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700146 public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800147
148 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700149 * Specifies if a user is disallowed from uninstalling applications.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700150 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700151 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800152 * <p>Key for user restrictions.
153 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700154 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
155 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800156 * @see #getUserRestrictions()
157 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700158 public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800159
Amith Yamasani71e6c692013-03-24 17:39:28 -0700160 /**
Amith Yamasani150514b2015-01-07 16:05:05 -0800161 * Specifies if a user is disallowed from turning on location sharing.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700162 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800163 * <p>In a managed profile, location sharing always reflects the primary user's setting, but
Amith Yamasani150514b2015-01-07 16:05:05 -0800164 * can be overridden and forced off by setting this restriction to true in the managed profile.
Amith Yamasani26af8292014-09-09 09:57:27 -0700165 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800166 * <p>Key for user restrictions.
167 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700168 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
169 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthall67944582013-02-22 14:58:27 -0500170 * @see #getUserRestrictions()
171 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700172 public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
Maggie Benthall67944582013-02-22 14:58:27 -0500173
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400174 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700175 * Specifies if a user is disallowed from enabling the
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400176 * "Unknown Sources" setting, that allows installation of apps from unknown sources.
177 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700178 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800179 * <p>Key for user restrictions.
180 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700181 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
182 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400183 * @see #getUserRestrictions()
184 */
185 public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
186
187 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700188 * Specifies if a user is disallowed from configuring bluetooth.
Nicolas Prevot1c4c4422015-02-16 11:32:21 +0000189 * This does <em>not</em> restrict the user from turning bluetooth on or off.
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400190 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800191 * <p>This restriction has no effect in a managed profile.
Amith Yamasani26af8292014-09-09 09:57:27 -0700192 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800193 * <p>Key for user restrictions.
194 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700195 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
196 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400197 * @see #getUserRestrictions()
198 */
199 public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
200
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400201 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700202 * Specifies if a user is disallowed from transferring files over
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700203 * USB. This can only be set by device owners and profile owners on the primary user.
204 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700205 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800206 * <p>Key for user restrictions.
207 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700208 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
209 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400210 * @see #getUserRestrictions()
211 */
212 public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
213
Emily Bernierb223f732013-04-11 15:46:36 -0400214 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700215 * Specifies if a user is disallowed from configuring user
Emily Bernierb223f732013-04-11 15:46:36 -0400216 * credentials. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700217 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800218 * <p>Key for user restrictions.
219 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700220 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
221 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernierb223f732013-04-11 15:46:36 -0400222 * @see #getUserRestrictions()
223 */
224 public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
225
226 /**
Amith Yamasani150514b2015-01-07 16:05:05 -0800227 * When set on the primary user this specifies if the user can remove other users.
228 * When set on a secondary user, this specifies if the user can remove itself.
229 * This restriction has no effect on managed profiles.
230 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700231 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800232 * <p>Key for user restrictions.
233 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700234 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
235 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernierb223f732013-04-11 15:46:36 -0400236 * @see #getUserRestrictions()
237 */
238 public static final String DISALLOW_REMOVE_USER = "no_remove_user";
239
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400240 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700241 * Specifies if a user is disallowed from enabling or
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400242 * accessing debugging features. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700243 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800244 * <p>Key for user restrictions.
245 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700246 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
247 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400248 * @see #getUserRestrictions()
249 */
250 public static final String DISALLOW_DEBUGGING_FEATURES = "no_debugging_features";
251
252 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700253 * Specifies if a user is disallowed from configuring VPN.
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400254 * The default value is <code>false</code>.
Nicolas Prevot298f98f2015-05-22 16:43:03 -0700255 * This restriction has an effect in a managed profile only from
Dianne Hackborn0e3de6c2015-07-29 15:20:21 -0700256 * {@link android.os.Build.VERSION_CODES#M}
Amith Yamasani26af8292014-09-09 09:57:27 -0700257 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800258 * <p>Key for user restrictions.
259 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700260 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
261 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400262 * @see #getUserRestrictions()
263 */
264 public static final String DISALLOW_CONFIG_VPN = "no_config_vpn";
265
266 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700267 * Specifies if a user is disallowed from configuring Tethering
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700268 * & portable hotspots. This can only be set by device owners and profile owners on the
269 * primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700270 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800271 * <p>Key for user restrictions.
272 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700273 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
274 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400275 * @see #getUserRestrictions()
276 */
277 public static final String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
278
279 /**
Stuart Scotte3e314d2015-04-20 14:07:45 -0700280 * Specifies if a user is disallowed from resetting network settings
281 * from Settings. This can only be set by device owners and profile owners on the primary user.
282 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800283 * <p>This restriction has no effect on secondary users and managed profiles since only the
Stuart Scotte3e314d2015-04-20 14:07:45 -0700284 * primary user can reset the network settings of the device.
285 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800286 * <p>Key for user restrictions.
287 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700288 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
289 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Stuart Scotte3e314d2015-04-20 14:07:45 -0700290 * @see #getUserRestrictions()
291 */
292 public static final String DISALLOW_NETWORK_RESET = "no_network_reset";
293
294 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700295 * Specifies if a user is disallowed from factory resetting
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700296 * from Settings. This can only be set by device owners and profile owners on the primary user.
297 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800298 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800299 * primary user can factory reset the device.
Amith Yamasani26af8292014-09-09 09:57:27 -0700300 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800301 * <p>Key for user restrictions.
302 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700303 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
304 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400305 * @see #getUserRestrictions()
306 */
307 public static final String DISALLOW_FACTORY_RESET = "no_factory_reset";
308
309 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700310 * Specifies if a user is disallowed from adding new users and
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700311 * profiles. This can only be set by device owners and profile owners on the primary user.
312 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800313 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800314 * primary user can add other users.
Amith Yamasani26af8292014-09-09 09:57:27 -0700315 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800316 * <p>Key for user restrictions.
317 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700318 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
319 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400320 * @see #getUserRestrictions()
321 */
322 public static final String DISALLOW_ADD_USER = "no_add_user";
323
324 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700325 * Specifies if a user is disallowed from disabling application
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400326 * verification. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700327 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800328 * <p>Key for user restrictions.
329 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700330 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
331 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400332 * @see #getUserRestrictions()
333 */
334 public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
335
336 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700337 * Specifies if a user is disallowed from configuring cell
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700338 * broadcasts. This can only be set by device owners and profile owners on the primary user.
339 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800340 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800341 * primary user can configure cell broadcasts.
Amith Yamasani26af8292014-09-09 09:57:27 -0700342 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800343 * <p>Key for user restrictions.
344 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700345 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
346 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400347 * @see #getUserRestrictions()
348 */
349 public static final String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
350
351 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700352 * Specifies if a user is disallowed from configuring mobile
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700353 * networks. This can only be set by device owners and profile owners on the primary user.
354 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800355 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800356 * primary user can configure mobile networks.
Amith Yamasani26af8292014-09-09 09:57:27 -0700357 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800358 * <p>Key for user restrictions.
359 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700360 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
361 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400362 * @see #getUserRestrictions()
363 */
364 public static final String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
365
366 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700367 * Specifies if a user is disallowed from modifying
Julia Reynoldsc617f812014-07-25 16:32:27 -0400368 * applications in Settings or launchers. The following actions will not be allowed when this
369 * restriction is enabled:
370 * <li>uninstalling apps</li>
371 * <li>disabling apps</li>
372 * <li>clearing app caches</li>
373 * <li>clearing app data</li>
374 * <li>force stopping apps</li>
375 * <li>clearing app defaults</li>
376 * <p>
377 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700378 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800379 * <p>Key for user restrictions.
380 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700381 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
382 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400383 * @see #getUserRestrictions()
384 */
Julia Reynolds36fbc8d2014-06-18 09:26:30 -0400385 public static final String DISALLOW_APPS_CONTROL = "no_control_apps";
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400386
Emily Bernier394a6cd2014-05-07 12:49:20 -0400387 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700388 * Specifies if a user is disallowed from mounting
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700389 * physical external media. This can only be set by device owners and profile owners on the
390 * primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700391 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800392 * <p>Key for user restrictions.
393 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700394 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
395 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400396 * @see #getUserRestrictions()
397 */
398 public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
399
400 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700401 * Specifies if a user is disallowed from adjusting microphone
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700402 * volume. If set, the microphone will be muted. This can only be set by device owners
403 * and profile owners on the primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700404 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800405 * <p>Key for user restrictions.
406 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700407 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
408 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400409 * @see #getUserRestrictions()
410 */
411 public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
412
413 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700414 * Specifies if a user is disallowed from adjusting the master
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700415 * volume. If set, the master volume will be muted. This can only be set by device owners
416 * and profile owners on the primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700417 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800418 * <p>Key for user restrictions.
419 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700420 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
421 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400422 * @see #getUserRestrictions()
423 */
424 public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
425
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700426 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700427 * Specifies that the user is not allowed to make outgoing
Amith Yamasani390989d2014-07-17 10:52:03 -0700428 * phone calls. Emergency calls are still permitted.
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700429 * The default value is <code>false</code>.
Tony Makeb83ab52016-02-22 18:36:08 +0000430 * <p>This restriction has no effect on managed profiles.
Amith Yamasani26af8292014-09-09 09:57:27 -0700431 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800432 * <p>Key for user restrictions.
433 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700434 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
435 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700436 * @see #getUserRestrictions()
437 */
Amith Yamasani390989d2014-07-17 10:52:03 -0700438 public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
439
440 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700441 * Specifies that the user is not allowed to send or receive
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700442 * SMS messages. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700443 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800444 * <p>Key for user restrictions.
445 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700446 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
447 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani390989d2014-07-17 10:52:03 -0700448 * @see #getUserRestrictions()
449 */
450 public static final String DISALLOW_SMS = "no_sms";
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700451
Jason Monk1c7c3192014-06-26 12:52:18 -0400452 /**
Jeff Sharkey2cc03e52015-03-20 11:24:04 -0700453 * Specifies if the user is not allowed to have fun. In some cases, the
454 * device owner may wish to prevent the user from experiencing amusement or
455 * joy while using the device. The default value is <code>false</code>.
456 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800457 * <p>Key for user restrictions.
458 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700459 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
460 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Jeff Sharkey2cc03e52015-03-20 11:24:04 -0700461 * @see #getUserRestrictions()
462 */
463 public static final String DISALLOW_FUN = "no_fun";
464
465 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700466 * Specifies that windows besides app windows should not be
Jason Monk1c7c3192014-06-26 12:52:18 -0400467 * created. This will block the creation of the following types of windows.
468 * <li>{@link LayoutParams#TYPE_TOAST}</li>
469 * <li>{@link LayoutParams#TYPE_PHONE}</li>
470 * <li>{@link LayoutParams#TYPE_PRIORITY_PHONE}</li>
471 * <li>{@link LayoutParams#TYPE_SYSTEM_ALERT}</li>
472 * <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li>
473 * <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li>
474 *
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700475 * <p>This can only be set by device owners and profile owners on the primary user.
476 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700477 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800478 * <p>Key for user restrictions.
479 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700480 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
481 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Jason Monk1c7c3192014-06-26 12:52:18 -0400482 * @see #getUserRestrictions()
483 */
484 public static final String DISALLOW_CREATE_WINDOWS = "no_create_windows";
485
Nicolas Prevotf1939902014-06-25 09:29:02 +0100486 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700487 * Specifies if what is copied in the clipboard of this profile can
Nicolas Prevotf1939902014-06-25 09:29:02 +0100488 * be pasted in related profiles. Does not restrict if the clipboard of related profiles can be
489 * pasted in this profile.
490 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700491 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800492 * <p>Key for user restrictions.
493 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700494 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
495 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Nicolas Prevotf1939902014-06-25 09:29:02 +0100496 * @see #getUserRestrictions()
497 */
498 public static final String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
499
Amith Yamasani26af8292014-09-09 09:57:27 -0700500 /**
501 * Specifies if the user is not allowed to use NFC to beam out data from apps.
502 * The default value is <code>false</code>.
503 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800504 * <p>Key for user restrictions.
505 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700506 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
507 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani26af8292014-09-09 09:57:27 -0700508 * @see #getUserRestrictions()
509 */
510 public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
511
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000512 /**
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100513 * Hidden user restriction to disallow access to wallpaper manager APIs. This restriction
514 * generally means that wallpapers are not supported for the particular user. This user
515 * restriction is always set for managed profiles, because such profiles don't have wallpapers.
Benjamin Franzf3ece362015-02-11 10:51:10 +0000516 * @hide
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100517 * @see #DISALLOW_SET_WALLPAPER
Makoto Onuki068c54a2015-10-13 14:34:03 -0700518 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
519 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Benjamin Franzf3ece362015-02-11 10:51:10 +0000520 * @see #getUserRestrictions()
521 */
522 public static final String DISALLOW_WALLPAPER = "no_wallpaper";
523
524 /**
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100525 * User restriction to disallow setting a wallpaper. Profile owner and device owner
526 * are able to set wallpaper regardless of this restriction.
527 * The default value is <code>false</code>.
528 *
529 * <p>Key for user restrictions.
530 * <p>Type: Boolean
531 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
532 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
533 * @see #getUserRestrictions()
534 */
535 public static final String DISALLOW_SET_WALLPAPER = "no_set_wallpaper";
536
537 /**
Benjamin Franzbff46ba2015-03-05 18:33:51 +0000538 * Specifies if the user is not allowed to reboot the device into safe boot mode.
539 * This can only be set by device owners and profile owners on the primary user.
540 * The default value is <code>false</code>.
541 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800542 * <p>Key for user restrictions.
543 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700544 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
545 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Benjamin Franzbff46ba2015-03-05 18:33:51 +0000546 * @see #getUserRestrictions()
547 */
548 public static final String DISALLOW_SAFE_BOOT = "no_safe_boot";
549
550 /**
Fyodor Kupolovb5013302015-04-17 17:59:14 -0700551 * Specifies if a user is not allowed to record audio. This restriction is always enabled for
552 * background users. The default value is <code>false</code>.
553 *
Makoto Onuki068c54a2015-10-13 14:34:03 -0700554 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
555 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Fyodor Kupolovb5013302015-04-17 17:59:14 -0700556 * @see #getUserRestrictions()
557 * @hide
558 */
559 public static final String DISALLOW_RECORD_AUDIO = "no_record_audio";
560
561 /**
Fyodor Kupolov9cbfc9e2015-10-07 15:52:33 -0700562 * Specifies if a user is not allowed to run in the background and should be stopped during
563 * user switch. The default value is <code>false</code>.
564 *
565 * <p>This restriction can be set by device owners and profile owners.
566 *
567 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
568 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
569 * @see #getUserRestrictions()
570 * @hide
571 */
572 public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
573
574 /**
Makoto Onuki759a7632015-10-28 16:43:10 -0700575 * Specifies if a user is not allowed to use the camera.
576 *
577 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
578 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
579 * @see #getUserRestrictions()
580 * @hide
581 */
582 public static final String DISALLOW_CAMERA = "no_camera";
583
584 /**
Tony Makc1205112016-07-22 16:02:59 +0100585 * Specifies if a user is not allowed to unmute the device's master volume.
586 *
587 * @see DevicePolicyManager#setMasterVolumeMuted(ComponentName, boolean)
588 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
589 * @see #getUserRestrictions()
590 * @hide
591 */
592 public static final String DISALLLOW_UNMUTE_DEVICE = "disallow_unmute_device";
593
594 /**
Mahaver Chopradea471e2015-12-17 11:02:37 +0000595 * Specifies if a user is not allowed to use cellular data when roaming. This can only be set by
596 * device owners. The default value is <code>false</code>.
597 *
598 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
599 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
600 * @see #getUserRestrictions()
601 */
602 public static final String DISALLOW_DATA_ROAMING = "no_data_roaming";
603
604 /**
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100605 * Specifies if a user is not allowed to change their icon. Device owner and profile owner
606 * can set this restriction. When it is set by device owner, only the target user will be
607 * affected. The default value is <code>false</code>.
608 *
609 * <p>Key for user restrictions.
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100610 * <p>Type: Boolean
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100611 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
612 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
613 * @see #getUserRestrictions()
614 */
615 public static final String DISALLOW_SET_USER_ICON = "no_set_user_icon";
616
617 /**
Mahaver Chopra3d9805d2016-07-07 16:25:05 +0100618 * Specifies if a user is not allowed to enable the oem unlock setting. The default value is
Esteban Talaverac48b20f2016-08-11 11:23:40 +0100619 * <code>false</code>. Setting this restriction has no effect if the bootloader is already
620 * unlocked.
Mahaver Chopra3d9805d2016-07-07 16:25:05 +0100621 *
622 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
623 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
624 * @see #getUserRestrictions()
625 * @hide
626 */
627 public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
628
629 /**
Nicolas Prevotf0029c12015-06-25 14:25:41 -0700630 * Allows apps in the parent profile to handle web links from the managed profile.
631 *
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700632 * This user restriction has an effect only in a managed profile.
633 * If set:
634 * Intent filters of activities in the parent profile with action
635 * {@link android.content.Intent#ACTION_VIEW},
636 * category {@link android.content.Intent#CATEGORY_BROWSABLE}, scheme http or https, and which
637 * define a host can handle intents from the managed profile.
638 * The default value is <code>false</code>.
639 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800640 * <p>Key for user restrictions.
641 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700642 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
643 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700644 * @see #getUserRestrictions()
645 */
Nicolas Prevotf0029c12015-06-25 14:25:41 -0700646 public static final String ALLOW_PARENT_PROFILE_APP_LINKING
647 = "allow_parent_profile_app_linking";
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700648
649 /**
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000650 * Application restriction key that is used to indicate the pending arrival
651 * of real restrictions for the app.
652 *
653 * <p>
654 * Applications that support restrictions should check for the presence of this key.
655 * A <code>true</code> value indicates that restrictions may be applied in the near
656 * future but are not available yet. It is the responsibility of any
657 * management application that sets this flag to update it when the final
658 * restrictions are enforced.
659 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800660 * <p>Key for application restrictions.
661 * <p>Type: Boolean
Nicolas Prevotb14ed952015-01-13 14:23:53 +0000662 * @see android.app.admin.DevicePolicyManager#setApplicationRestrictions(
663 * android.content.ComponentName, String, Bundle)
664 * @see android.app.admin.DevicePolicyManager#getApplicationRestrictions(
665 * android.content.ComponentName, String)
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000666 */
667 public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
668
Amith Yamasani12747872015-12-07 14:19:49 -0800669 private static final String ACTION_CREATE_USER = "android.os.action.CREATE_USER";
670
671 /**
672 * Extra containing a name for the user being created. Optional parameter passed to
673 * ACTION_CREATE_USER activity.
674 * @hide
675 */
676 public static final String EXTRA_USER_NAME = "android.os.extra.USER_NAME";
677
678 /**
679 * Extra containing account name for the user being created. Optional parameter passed to
680 * ACTION_CREATE_USER activity.
681 * @hide
682 */
683 public static final String EXTRA_USER_ACCOUNT_NAME = "android.os.extra.USER_ACCOUNT_NAME";
684
685 /**
686 * Extra containing account type for the user being created. Optional parameter passed to
687 * ACTION_CREATE_USER activity.
688 * @hide
689 */
690 public static final String EXTRA_USER_ACCOUNT_TYPE = "android.os.extra.USER_ACCOUNT_TYPE";
691
692 /**
693 * Extra containing account-specific data for the user being created. Optional parameter passed
694 * to ACTION_CREATE_USER activity.
695 * @hide
696 */
697 public static final String EXTRA_USER_ACCOUNT_OPTIONS
698 = "android.os.extra.USER_ACCOUNT_OPTIONS";
699
Amith Yamasani655d0e22013-06-12 14:19:10 -0700700 /** @hide */
701 public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
702 /** @hide */
703 public static final int PIN_VERIFICATION_FAILED_NOT_SET = -2;
704 /** @hide */
705 public static final int PIN_VERIFICATION_SUCCESS = -1;
706
Amith Yamasani37ed8d12016-01-27 14:40:16 -0800707 /**
708 * Error result indicating that this user is not allowed to add other users on this device.
709 * This is a result code returned from the activity created by the intent
710 * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
711 */
712 public static final int USER_CREATION_FAILED_NOT_PERMITTED = Activity.RESULT_FIRST_USER;
713
714 /**
715 * Error result indicating that no more users can be created on this device.
716 * This is a result code returned from the activity created by the intent
717 * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
718 */
719 public static final int USER_CREATION_FAILED_NO_MORE_USERS = Activity.RESULT_FIRST_USER + 1;
720
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700721 /** @hide */
Amith Yamasanic0688302015-10-30 10:40:03 -0700722 public static UserManager get(Context context) {
723 return (UserManager) context.getSystemService(Context.USER_SERVICE);
Amith Yamasani27db4682013-03-30 17:07:47 -0700724 }
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400725
Amith Yamasani258848d2012-08-10 17:06:33 -0700726 /** @hide */
727 public UserManager(Context context, IUserManager service) {
728 mService = service;
729 mContext = context;
730 }
731
732 /**
Amith Yamasani06964342016-04-15 13:55:01 -0700733 * Returns whether this device supports multiple users with their own login and customizable
734 * space.
735 * @return whether the device supports multiple users.
Amith Yamasani258848d2012-08-10 17:06:33 -0700736 */
Jeff Sharkey4673e7e2012-09-19 13:14:30 -0700737 public static boolean supportsMultipleUsers() {
Kenny Guy1a447532014-02-20 21:55:32 +0000738 return getMaxSupportedUsers() > 1
739 && SystemProperties.getBoolean("fw.show_multiuserui",
740 Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI));
Amith Yamasani258848d2012-08-10 17:06:33 -0700741 }
742
Maggie Benthall67944582013-02-22 14:58:27 -0500743 /**
Xiaohui Chen7cb69df2015-07-13 16:01:01 -0700744 * @hide
745 * @return Whether the device is running with split system user. It means the system user and
746 * primary user are two separate users. Previously system user and primary user are combined as
747 * a single owner user. see @link {android.os.UserHandle#USER_OWNER}
748 */
749 public static boolean isSplitSystemUser() {
John Reckaa67f682016-09-20 14:24:21 -0700750 return RoSystemProperties.FW_SYSTEM_USER_SPLIT;
Xiaohui Chen7cb69df2015-07-13 16:01:01 -0700751 }
752
753 /**
Evan Rosky13a58a92016-07-27 15:51:09 -0700754 * @return Whether guest user is always ephemeral
755 * @hide
756 */
757 public static boolean isGuestUserEphemeral() {
758 return Resources.getSystem()
759 .getBoolean(com.android.internal.R.bool.config_guestUserEphemeral);
760 }
761
762 /**
Fyodor Kupolov523c4042016-02-24 15:03:13 -0800763 * Returns whether switching users is currently allowed.
764 * <p>For instance switching users is not allowed if the current user is in a phone call,
765 * or system user hasn't been unlocked yet
766 * @hide
767 */
768 public boolean canSwitchUsers() {
769 boolean allowUserSwitchingWhenSystemUserLocked = Settings.Global.getInt(
770 mContext.getContentResolver(),
771 Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0;
772 boolean isSystemUserUnlocked = isUserUnlocked(UserHandle.SYSTEM);
773 boolean inCall = TelephonyManager.getDefault().getCallState()
774 != TelephonyManager.CALL_STATE_IDLE;
775 return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall;
776 }
777
778 /**
Amith Yamasani5760e172015-04-17 18:42:41 -0700779 * Returns the user handle for the user that this process is running under.
Jessica Hummelbe81c802014-04-22 15:49:22 +0100780 *
Amith Yamasani5760e172015-04-17 18:42:41 -0700781 * @return the user handle of this process.
Amith Yamasani258848d2012-08-10 17:06:33 -0700782 * @hide
Maggie Benthall67944582013-02-22 14:58:27 -0500783 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700784 public @UserIdInt int getUserHandle() {
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700785 return UserHandle.myUserId();
Amith Yamasani258848d2012-08-10 17:06:33 -0700786 }
787
788 /**
Dianne Hackborn8832c182012-09-17 17:20:24 -0700789 * Returns the user name of the user making this call. This call is only
790 * available to applications on the system image; it requires the
791 * MANAGE_USERS permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700792 * @return the user name
793 */
794 public String getUserName() {
795 try {
796 return mService.getUserInfo(getUserHandle()).name;
797 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700798 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -0700799 }
800 }
801
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700802 /**
Dan Morrille4ab16a2012-09-20 20:25:55 -0700803 * Used to determine whether the user making this call is subject to
804 * teleportations.
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700805 *
Dianne Hackborn955d8d62014-10-07 20:17:19 -0700806 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700807 * now automatically identify goats using advanced goat recognition technology.</p>
808 *
809 * @return Returns true if the user making this call is a goat.
Dan Morrille4ab16a2012-09-20 20:25:55 -0700810 */
811 public boolean isUserAGoat() {
Adam Powell988ae302014-09-17 17:58:33 -0700812 return mContext.getPackageManager()
813 .isPackageAvailable("com.coffeestainstudios.goatsimulator");
Dan Morrille4ab16a2012-09-20 20:25:55 -0700814 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800815
816 /**
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700817 * Used to check if this process is running under the primary user. The primary user
818 * is the first human user on a device.
819 *
820 * @return whether this process is running under the primary user.
821 * @hide
822 */
823 public boolean isPrimaryUser() {
824 UserInfo user = getUserInfo(UserHandle.myUserId());
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700825 return user != null && user.isPrimary();
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700826 }
827
828 /**
Amith Yamasani5760e172015-04-17 18:42:41 -0700829 * Used to check if this process is running under the system user. The system user
830 * is the initial user that is implicitly created on first boot and hosts most of the
831 * system services.
832 *
833 * @return whether this process is running under the system user.
834 */
835 public boolean isSystemUser() {
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700836 return UserHandle.myUserId() == UserHandle.USER_SYSTEM;
Amith Yamasani5760e172015-04-17 18:42:41 -0700837 }
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700838
Amith Yamasani5760e172015-04-17 18:42:41 -0700839 /**
Amith Yamasani462ac3a2015-06-30 14:21:01 -0700840 * @hide
841 * Returns whether the caller is running as an admin user. There can be more than one admin
842 * user.
843 */
844 public boolean isAdminUser() {
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700845 return isUserAdmin(UserHandle.myUserId());
846 }
847
848 /**
849 * @hide
850 * Returns whether the provided user is an admin user. There can be more than one admin
851 * user.
852 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700853 public boolean isUserAdmin(@UserIdInt int userId) {
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700854 UserInfo user = getUserInfo(userId);
855 return user != null && user.isAdmin();
Amith Yamasani462ac3a2015-06-30 14:21:01 -0700856 }
857
858 /**
Amith Yamasanie1375902013-04-13 16:48:35 -0700859 * 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 -0700860 * a reduced number of available apps, app restrictions and account restrictions.
Amith Yamasanie1375902013-04-13 16:48:35 -0700861 * @return whether the user making this call is a linked user
Amith Yamasani2555daf2013-04-25 13:39:27 -0700862 * @hide
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800863 */
Amith Yamasanie1375902013-04-13 16:48:35 -0700864 public boolean isLinkedUser() {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800865 try {
Amith Yamasani71e6c692013-03-24 17:39:28 -0700866 return mService.isRestricted();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800867 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700868 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800869 }
870 }
871
Amith Yamasani258848d2012-08-10 17:06:33 -0700872 /**
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700873 * Checks if specified user can have restricted profile.
874 * @hide
875 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700876 public boolean canHaveRestrictedProfile(@UserIdInt int userId) {
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700877 try {
878 return mService.canHaveRestrictedProfile(userId);
879 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700880 throw re.rethrowFromSystemServer();
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700881 }
882 }
883
884 /**
Evan Rosky13a58a92016-07-27 15:51:09 -0700885 * Checks if a user is a guest user.
886 * @return whether user is a guest user.
887 * @hide
888 */
889 public boolean isGuestUser(int id) {
890 UserInfo user = getUserInfo(id);
891 return user != null && user.isGuest();
892 }
893
894 /**
Amith Yamasani1e9c2182014-06-11 17:25:51 -0700895 * Checks if the calling app is running as a guest user.
896 * @return whether the caller is a guest user.
897 * @hide
898 */
899 public boolean isGuestUser() {
900 UserInfo user = getUserInfo(UserHandle.myUserId());
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700901 return user != null && user.isGuest();
902 }
903
904 /**
Amith Yamasani1c41dc82016-06-28 16:13:15 -0700905 * Checks if the calling app is running in a demo user. When running in a demo user,
906 * apps can be more helpful to the user, or explain their features in more detail.
907 *
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700908 * @return whether the caller is a demo user.
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700909 */
910 public boolean isDemoUser() {
Amith Yamasani1c41dc82016-06-28 16:13:15 -0700911 try {
912 return mService.isDemoUser(UserHandle.myUserId());
913 } catch (RemoteException re) {
914 throw re.rethrowFromSystemServer();
915 }
Amith Yamasani1e9c2182014-06-11 17:25:51 -0700916 }
917
918 /**
Amith Yamasani0e8d7d62014-09-03 13:17:28 -0700919 * Checks if the calling app is running in a managed profile.
920 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
921 *
922 * @return whether the caller is in a managed profile.
923 * @hide
924 */
925 @SystemApi
926 public boolean isManagedProfile() {
Tony Mak8673b282016-03-21 21:10:59 +0000927 try {
928 return mService.isManagedProfile(UserHandle.myUserId());
929 } catch (RemoteException re) {
930 throw re.rethrowFromSystemServer();
931 }
932 }
933
934 /**
935 * Checks if the specified user is a managed profile.
936 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission, otherwise the caller
937 * must be in the same profile group of specified user.
938 *
939 * @return whether the specified user is a managed profile.
940 * @hide
941 */
942 @SystemApi
943 public boolean isManagedProfile(@UserIdInt int userId) {
944 try {
945 return mService.isManagedProfile(userId);
946 } catch (RemoteException re) {
947 throw re.rethrowFromSystemServer();
948 }
Amith Yamasani0e8d7d62014-09-03 13:17:28 -0700949 }
950
951 /**
Lenka Trochtovac4dd0212015-11-18 12:22:06 +0100952 * Checks if the calling app is running as an ephemeral user.
953 *
954 * @return whether the caller is an ephemeral user.
955 * @hide
956 */
957 public boolean isEphemeralUser() {
958 return isUserEphemeral(UserHandle.myUserId());
959 }
960
961 /**
962 * Returns whether the specified user is ephemeral.
963 * @hide
964 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700965 public boolean isUserEphemeral(@UserIdInt int userId) {
Lenka Trochtovac4dd0212015-11-18 12:22:06 +0100966 final UserInfo user = getUserInfo(userId);
967 return user != null && user.isEphemeral();
968 }
969
970 /**
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700971 * Return whether the given user is actively running. This means that
972 * the user is in the "started" state, not "stopped" -- it is currently
973 * allowed to run code through scheduled alarms, receiving broadcasts,
974 * etc. A started user may be either the current foreground user or a
975 * background user; the result here does not distinguish between the two.
976 * @param user The user to retrieve the running state for.
977 */
978 public boolean isUserRunning(UserHandle user) {
Jeff Sharkey0e62384c2016-01-13 18:52:55 -0700979 return isUserRunning(user.getIdentifier());
980 }
981
982 /** {@hide} */
983 public boolean isUserRunning(int userId) {
Amith Yamasaniea1b9d72016-05-27 15:57:38 +0000984 // TODO Switch to using UMS internal isUserRunning
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700985 try {
Jeff Sharkey0e62384c2016-01-13 18:52:55 -0700986 return ActivityManagerNative.getDefault().isUserRunning(userId, 0);
Jeff Sharkey27b2e692016-02-25 17:40:12 -0700987 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700988 throw re.rethrowFromSystemServer();
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700989 }
990 }
991
992 /**
993 * Return whether the given user is actively running <em>or</em> stopping.
994 * This is like {@link #isUserRunning(UserHandle)}, but will also return
995 * true if the user had been running but is in the process of being stopped
996 * (but is not yet fully stopped, and still running some code).
997 * @param user The user to retrieve the running state for.
998 */
999 public boolean isUserRunningOrStopping(UserHandle user) {
1000 try {
Jeff Sharkeye17ac152015-11-06 22:40:29 -08001001 // TODO: reconcile stopped vs stopping?
Dianne Hackborna8a9bd62012-10-09 15:36:59 -07001002 return ActivityManagerNative.getDefault().isUserRunning(
Jeff Sharkeye17ac152015-11-06 22:40:29 -08001003 user.getIdentifier(), ActivityManager.FLAG_OR_STOPPED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001004 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001005 throw re.rethrowFromSystemServer();
Dianne Hackborna8a9bd62012-10-09 15:36:59 -07001006 }
1007 }
1008
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001009 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001010 @Deprecated
Jeff Sharkeye13529a2015-12-09 14:15:27 -07001011 public boolean isUserRunningAndLocked() {
1012 return isUserRunningAndLocked(Process.myUserHandle());
1013 }
1014
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001015 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001016 @Deprecated
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001017 public boolean isUserRunningAndLocked(UserHandle user) {
1018 try {
1019 return ActivityManagerNative.getDefault().isUserRunning(
1020 user.getIdentifier(), ActivityManager.FLAG_AND_LOCKED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001021 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001022 throw re.rethrowFromSystemServer();
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001023 }
1024 }
1025
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001026 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001027 @Deprecated
Jeff Sharkeye13529a2015-12-09 14:15:27 -07001028 public boolean isUserRunningAndUnlocked() {
1029 return isUserRunningAndUnlocked(Process.myUserHandle());
1030 }
1031
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001032 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001033 @Deprecated
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001034 public boolean isUserRunningAndUnlocked(UserHandle user) {
Jeff Sharkey0825ab22015-12-02 13:04:49 -07001035 try {
1036 return ActivityManagerNative.getDefault().isUserRunning(
1037 user.getIdentifier(), ActivityManager.FLAG_AND_UNLOCKED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001038 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001039 throw re.rethrowFromSystemServer();
Jeff Sharkey0825ab22015-12-02 13:04:49 -07001040 }
1041 }
1042
1043 /**
Jeff Sharkeycf3f0a12016-03-17 19:57:58 -06001044 * Return whether the calling user is running in an "unlocked" state.
1045 * <p>
1046 * On devices with direct boot, a user is unlocked only after they've
1047 * entered their credentials (such as a lock pattern or PIN). On devices
1048 * without direct boot, a user is unlocked as soon as it starts.
1049 * <p>
1050 * When a user is locked, only device-protected data storage is available.
1051 * When a user is unlocked, both device-protected and credential-protected
1052 * private app data storage is available.
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001053 *
1054 * @see Intent#ACTION_USER_UNLOCKED
1055 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001056 */
1057 public boolean isUserUnlocked() {
1058 return isUserUnlocked(Process.myUserHandle());
1059 }
1060
1061 /**
Jeff Sharkeycf3f0a12016-03-17 19:57:58 -06001062 * Return whether the given user is running in an "unlocked" state.
1063 * <p>
1064 * On devices with direct boot, a user is unlocked only after they've
1065 * entered their credentials (such as a lock pattern or PIN). On devices
1066 * without direct boot, a user is unlocked as soon as it starts.
1067 * <p>
1068 * When a user is locked, only device-protected data storage is available.
1069 * When a user is unlocked, both device-protected and credential-protected
1070 * private app data storage is available.
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001071 *
1072 * @param user to retrieve the unlocked state for.
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001073 * @see Intent#ACTION_USER_UNLOCKED
1074 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001075 */
1076 public boolean isUserUnlocked(UserHandle user) {
Jeff Sharkey0999c0d2015-12-17 15:12:22 -07001077 return isUserUnlocked(user.getIdentifier());
1078 }
1079
1080 /** {@hide} */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001081 public boolean isUserUnlocked(@UserIdInt int userId) {
Jeff Sharkeyce18c812016-04-27 16:00:41 -06001082 try {
1083 return ActivityManagerNative.getDefault().isUserRunning(userId,
1084 ActivityManager.FLAG_AND_UNLOCKED);
1085 } catch (RemoteException re) {
1086 throw re.rethrowFromSystemServer();
1087 }
1088 }
1089
1090 /** {@hide} */
1091 public boolean isUserUnlockingOrUnlocked(UserHandle user) {
1092 return isUserUnlockingOrUnlocked(user.getIdentifier());
1093 }
1094
1095 /** {@hide} */
1096 public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) {
Fyodor Kupolov6c915ea2016-05-09 19:10:53 -07001097 // TODO Switch to using UMS internal isUserUnlockingOrUnlocked
Jeff Sharkeyce18c812016-04-27 16:00:41 -06001098 try {
1099 return ActivityManagerNative.getDefault().isUserRunning(userId,
1100 ActivityManager.FLAG_AND_UNLOCKING_OR_UNLOCKED);
1101 } catch (RemoteException re) {
1102 throw re.rethrowFromSystemServer();
1103 }
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001104 }
1105
1106 /**
Amith Yamasani258848d2012-08-10 17:06:33 -07001107 * Returns the UserInfo object describing a specific user.
Tony Mak8673b282016-03-21 21:10:59 +00001108 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001109 * @param userHandle the user handle of the user whose information is being requested.
1110 * @return the UserInfo object for a specific user.
1111 * @hide
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001112 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001113 public UserInfo getUserInfo(@UserIdInt int userHandle) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001114 try {
1115 return mService.getUserInfo(userHandle);
1116 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001117 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001118 }
1119 }
1120
Amith Yamasani71e6c692013-03-24 17:39:28 -07001121 /**
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +01001122 * @hide
1123 *
1124 * Returns who set a user restriction on a user.
1125 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1126 * @param restrictionKey the string key representing the restriction
1127 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1128 * @return The source of user restriction. Any combination of {@link #RESTRICTION_NOT_SET},
1129 * {@link #RESTRICTION_SOURCE_SYSTEM}, {@link #RESTRICTION_SOURCE_DEVICE_OWNER}
1130 * and {@link #RESTRICTION_SOURCE_PROFILE_OWNER}
1131 */
1132 @SystemApi
1133 @UserRestrictionSource
1134 public int getUserRestrictionSource(String restrictionKey, UserHandle userHandle) {
1135 try {
1136 return mService.getUserRestrictionSource(restrictionKey, userHandle.getIdentifier());
1137 } catch (RemoteException re) {
1138 throw re.rethrowFromSystemServer();
1139 }
1140 }
1141
1142 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -07001143 * Returns the user-wide restrictions imposed on this user.
1144 * @return a Bundle containing all the restrictions.
1145 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001146 public Bundle getUserRestrictions() {
1147 return getUserRestrictions(Process.myUserHandle());
1148 }
1149
Amith Yamasani71e6c692013-03-24 17:39:28 -07001150 /**
1151 * Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
1152 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1153 * @return a Bundle containing all the restrictions.
1154 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001155 public Bundle getUserRestrictions(UserHandle userHandle) {
1156 try {
1157 return mService.getUserRestrictions(userHandle.getIdentifier());
1158 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001159 throw re.rethrowFromSystemServer();
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001160 }
1161 }
1162
Zoltan Szatmary-Ban3bbcedd2015-11-26 13:45:51 +00001163 /**
1164 * @hide
1165 * Returns whether the given user has been disallowed from performing certain actions
1166 * or setting certain settings through UserManager. This method disregards restrictions
1167 * set by device policy.
1168 * @param restrictionKey the string key representing the restriction
1169 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1170 */
1171 public boolean hasBaseUserRestriction(String restrictionKey, UserHandle userHandle) {
1172 try {
1173 return mService.hasBaseUserRestriction(restrictionKey, userHandle.getIdentifier());
1174 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001175 throw re.rethrowFromSystemServer();
Zoltan Szatmary-Ban3bbcedd2015-11-26 13:45:51 +00001176 }
1177 }
1178
Amith Yamasani71e6c692013-03-24 17:39:28 -07001179 /**
Makoto Onukia3c12502015-10-28 10:18:32 -07001180 * This will no longer work. Device owners and profile owners should use
1181 * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001182 */
Makoto Onukia3c12502015-10-28 10:18:32 -07001183 // System apps should use UserManager.setUserRestriction() instead.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001184 @Deprecated
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001185 public void setUserRestrictions(Bundle restrictions) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001186 throw new UnsupportedOperationException("This method is no longer supported");
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001187 }
1188
Amith Yamasani71e6c692013-03-24 17:39:28 -07001189 /**
Makoto Onukia3c12502015-10-28 10:18:32 -07001190 * This will no longer work. Device owners and profile owners should use
1191 * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001192 */
Makoto Onukia3c12502015-10-28 10:18:32 -07001193 // System apps should use UserManager.setUserRestriction() instead.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001194 @Deprecated
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001195 public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001196 throw new UnsupportedOperationException("This method is no longer supported");
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001197 }
1198
Amith Yamasani71e6c692013-03-24 17:39:28 -07001199 /**
1200 * Sets the value of a specific restriction.
Amith Yamasanibe465322014-04-24 13:45:17 -07001201 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001202 * @param key the key of the restriction
1203 * @param value the value for the restriction
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001204 * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1205 * android.content.ComponentName, String)} or
1206 * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1207 * android.content.ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001208 */
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001209 @Deprecated
Amith Yamasani71e6c692013-03-24 17:39:28 -07001210 public void setUserRestriction(String key, boolean value) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001211 setUserRestriction(key, value, Process.myUserHandle());
Amith Yamasani71e6c692013-03-24 17:39:28 -07001212 }
1213
1214 /**
1215 * @hide
1216 * Sets the value of a specific restriction on a specific user.
Amith Yamasanibe465322014-04-24 13:45:17 -07001217 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001218 * @param key the key of the restriction
1219 * @param value the value for the restriction
1220 * @param userHandle the user whose restriction is to be changed.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001221 * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1222 * android.content.ComponentName, String)} or
1223 * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1224 * android.content.ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001225 */
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001226 @Deprecated
Maggie Benthall67944582013-02-22 14:58:27 -05001227 public void setUserRestriction(String key, boolean value, UserHandle userHandle) {
Fyodor Kupolovb5013302015-04-17 17:59:14 -07001228 try {
1229 mService.setUserRestriction(key, value, userHandle.getIdentifier());
1230 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001231 throw re.rethrowFromSystemServer();
Fyodor Kupolovb5013302015-04-17 17:59:14 -07001232 }
Maggie Benthall67944582013-02-22 14:58:27 -05001233 }
1234
Amith Yamasani258848d2012-08-10 17:06:33 -07001235 /**
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001236 * Returns whether the current user has been disallowed from performing certain actions
1237 * or setting certain settings.
Julia Reynolds2b2cf722014-06-06 11:41:04 -04001238 *
1239 * @param restrictionKey The string key representing the restriction.
1240 * @return {@code true} if the current user has the given restriction, {@code false} otherwise.
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001241 */
1242 public boolean hasUserRestriction(String restrictionKey) {
David Christieb12ba932013-09-03 17:15:28 -07001243 return hasUserRestriction(restrictionKey, Process.myUserHandle());
1244 }
1245
1246 /**
1247 * @hide
1248 * Returns whether the given user has been disallowed from performing certain actions
1249 * or setting certain settings.
1250 * @param restrictionKey the string key representing the restriction
1251 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1252 */
1253 public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
Amith Yamasani8cd28b52014-06-08 17:54:27 -07001254 try {
1255 return mService.hasUserRestriction(restrictionKey,
1256 userHandle.getIdentifier());
1257 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001258 throw re.rethrowFromSystemServer();
Amith Yamasani8cd28b52014-06-08 17:54:27 -07001259 }
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001260 }
1261
1262 /**
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001263 * Return the serial number for a user. This is a device-unique
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001264 * number assigned to that user; if the user is deleted and then a new
1265 * user created, the new users will not be given the same serial number.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001266 * @param user The user whose serial number is to be retrieved.
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001267 * @return The serial number of the given user; returns -1 if the
1268 * given UserHandle does not exist.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001269 * @see #getUserForSerialNumber(long)
1270 */
1271 public long getSerialNumberForUser(UserHandle user) {
1272 return getUserSerialNumber(user.getIdentifier());
1273 }
1274
1275 /**
1276 * Return the user associated with a serial number previously
1277 * returned by {@link #getSerialNumberForUser(UserHandle)}.
1278 * @param serialNumber The serial number of the user that is being
1279 * retrieved.
1280 * @return Return the user associated with the serial number, or null
1281 * if there is not one.
1282 * @see #getSerialNumberForUser(UserHandle)
1283 */
1284 public UserHandle getUserForSerialNumber(long serialNumber) {
Fyodor Kupolovef249092015-05-06 13:18:46 -07001285 int ident = getUserHandle((int) serialNumber);
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001286 return ident >= 0 ? new UserHandle(ident) : null;
1287 }
1288
1289 /**
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001290 * Creates a user with the specified name and options. For non-admin users, default user
1291 * restrictions are going to be applied.
Amith Yamasani195263742012-08-21 15:40:12 -07001292 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001293 *
1294 * @param name the user's name
1295 * @param flags flags that identify the type of user and other properties.
1296 * @see UserInfo
1297 *
1298 * @return the UserInfo object for the created user, or null if the user could not be created.
1299 * @hide
1300 */
1301 public UserInfo createUser(String name, int flags) {
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001302 UserInfo user = null;
Amith Yamasani258848d2012-08-10 17:06:33 -07001303 try {
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001304 user = mService.createUser(name, flags);
phweisse9c44062016-02-10 12:57:38 +01001305 // TODO: Keep this in sync with
1306 // UserManagerService.LocalService.createUserEvenWhenDisallowed
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001307 if (user != null && !user.isAdmin()) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001308 mService.setUserRestriction(DISALLOW_SMS, true, user.id);
1309 mService.setUserRestriction(DISALLOW_OUTGOING_CALLS, true, user.id);
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001310 }
Amith Yamasani258848d2012-08-10 17:06:33 -07001311 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001312 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001313 }
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001314 return user;
Amith Yamasani258848d2012-08-10 17:06:33 -07001315 }
1316
1317 /**
Amith Yamasani1e9c2182014-06-11 17:25:51 -07001318 * Creates a guest user and configures it.
1319 * @param context an application context
1320 * @param name the name to set for the user
1321 * @hide
1322 */
1323 public UserInfo createGuest(Context context, String name) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001324 UserInfo guest = null;
1325 try {
1326 guest = mService.createUser(name, UserInfo.FLAG_GUEST);
1327 if (guest != null) {
1328 Settings.Secure.putStringForUser(context.getContentResolver(),
1329 Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
Amith Yamasanibf3a9462014-07-28 14:26:42 -07001330 }
Makoto Onuki068c54a2015-10-13 14:34:03 -07001331 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001332 throw re.rethrowFromSystemServer();
Amith Yamasani1e9c2182014-06-11 17:25:51 -07001333 }
1334 return guest;
1335 }
1336
Amith Yamasaniaa6634e2014-10-06 14:20:28 -07001337 /**
Kenny Guy2a764942014-04-02 13:29:20 +01001338 * Creates a user with the specified name and options as a profile of another user.
Kenny Guya52dc3e2014-02-11 15:33:14 +00001339 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1340 *
1341 * @param name the user's name
1342 * @param flags flags that identify the type of user and other properties.
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07001343 * @param userHandle new user will be a profile of this user.
Kenny Guya52dc3e2014-02-11 15:33:14 +00001344 *
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07001345 * @return the {@link UserInfo} object for the created user, or null if the user
1346 * could not be created.
Kenny Guya52dc3e2014-02-11 15:33:14 +00001347 * @hide
1348 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001349 public UserInfo createProfileForUser(String name, int flags, @UserIdInt int userHandle) {
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07001350 return createProfileForUser(name, flags, userHandle, null);
1351 }
1352
1353 /**
1354 * Version of {@link #createProfileForUser(String, int, int)} that allows you to specify
1355 * any packages that should not be installed in the new profile by default, these packages can
1356 * still be installed later by the user if needed.
1357 *
1358 * @param name the user's name
1359 * @param flags flags that identify the type of user and other properties.
1360 * @param userHandle new user will be a profile of this user.
1361 * @param disallowedPackages packages that will not be installed in the profile being created.
1362 *
1363 * @return the {@link UserInfo} object for the created user, or null if the user
1364 * could not be created.
1365 * @hide
1366 */
1367 public UserInfo createProfileForUser(String name, int flags, @UserIdInt int userHandle,
1368 String[] disallowedPackages) {
Kenny Guya52dc3e2014-02-11 15:33:14 +00001369 try {
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07001370 return mService.createProfileForUser(name, flags, userHandle, disallowedPackages);
Kenny Guya52dc3e2014-02-11 15:33:14 +00001371 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001372 throw re.rethrowFromSystemServer();
Kenny Guya52dc3e2014-02-11 15:33:14 +00001373 }
1374 }
1375
1376 /**
Tony Mak6dc428f2016-10-10 15:48:27 +01001377 * Similar to {@link #createProfileForUser(String, int, int, String[])}
1378 * except bypassing the checking of {@link UserManager#DISALLOW_ADD_USER}.
1379 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1380 *
1381 * @see #createProfileForUser(String, int, int, String[])
1382 * @hide
1383 */
1384 public UserInfo createProfileForUserEvenWhenDisallowed(String name, int flags,
1385 @UserIdInt int userHandle, String[] disallowedPackages) {
1386 try {
1387 return mService.createProfileForUserEvenWhenDisallowed(name, flags, userHandle,
1388 disallowedPackages);
1389 } catch (RemoteException re) {
1390 throw re.rethrowFromSystemServer();
1391 }
1392 }
1393
1394 /**
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001395 * Creates a restricted profile with the specified name. This method also sets necessary
1396 * restrictions and adds shared accounts.
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001397 *
1398 * @param name profile's name
1399 * @return UserInfo object for the created user, or null if the user could not be created.
1400 * @hide
1401 */
1402 public UserInfo createRestrictedProfile(String name) {
1403 try {
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001404 UserHandle parentUserHandle = Process.myUserHandle();
1405 UserInfo user = mService.createRestrictedProfile(name,
1406 parentUserHandle.getIdentifier());
1407 if (user != null) {
1408 AccountManager.get(mContext).addSharedAccountsFromParentUser(parentUserHandle,
1409 UserHandle.of(user.id));
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001410 }
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001411 return user;
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001412 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001413 throw re.rethrowFromSystemServer();
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001414 }
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001415 }
1416
1417 /**
Amith Yamasani06964342016-04-15 13:55:01 -07001418 * Returns an intent to create a user for the provided name and account name. The name
1419 * and account name will be used when the setup process for the new user is started.
1420 * <p>
Amith Yamasani12747872015-12-07 14:19:49 -08001421 * The intent should be launched using startActivityForResult and the return result will
Amith Yamasani37ed8d12016-01-27 14:40:16 -08001422 * indicate if the user consented to adding a new user and if the operation succeeded. Any
1423 * errors in creating the user will be returned in the result code. If the user cancels the
1424 * request, the return result will be {@link Activity#RESULT_CANCELED}. On success, the
1425 * result code will be {@link Activity#RESULT_OK}.
Amith Yamasani06964342016-04-15 13:55:01 -07001426 * <p>
1427 * Use {@link #supportsMultipleUsers()} to first check if the device supports this operation
1428 * at all.
1429 * <p>
Amith Yamasani12747872015-12-07 14:19:49 -08001430 * The new user is created but not initialized. After switching into the user for the first
1431 * time, the preferred user name and account information are used by the setup process for that
1432 * user.
1433 *
1434 * @param userName Optional name to assign to the user.
Amith Yamasani06964342016-04-15 13:55:01 -07001435 * @param accountName Optional account name that will be used by the setup wizard to initialize
Amith Yamasani12747872015-12-07 14:19:49 -08001436 * the user.
1437 * @param accountType Optional account type for the account to be created. This is required
1438 * if the account name is specified.
1439 * @param accountOptions Optional bundle of data to be passed in during account creation in the
1440 * new user via {@link AccountManager#addAccount(String, String, String[],
1441 * Bundle, android.app.Activity, android.accounts.AccountManagerCallback,
1442 * Handler)}.
Amith Yamasani06964342016-04-15 13:55:01 -07001443 * @return An Intent that can be launched from an Activity.
Amith Yamasani37ed8d12016-01-27 14:40:16 -08001444 * @see #USER_CREATION_FAILED_NOT_PERMITTED
1445 * @see #USER_CREATION_FAILED_NO_MORE_USERS
Amith Yamasani06964342016-04-15 13:55:01 -07001446 * @see #supportsMultipleUsers
Amith Yamasani12747872015-12-07 14:19:49 -08001447 */
1448 public static Intent createUserCreationIntent(@Nullable String userName,
1449 @Nullable String accountName,
1450 @Nullable String accountType, @Nullable PersistableBundle accountOptions) {
Amith Yamasani12747872015-12-07 14:19:49 -08001451 Intent intent = new Intent(ACTION_CREATE_USER);
1452 if (userName != null) {
1453 intent.putExtra(EXTRA_USER_NAME, userName);
1454 }
1455 if (accountName != null && accountType == null) {
1456 throw new IllegalArgumentException("accountType must be specified if accountName is "
1457 + "specified");
1458 }
1459 if (accountName != null) {
1460 intent.putExtra(EXTRA_USER_ACCOUNT_NAME, accountName);
1461 }
1462 if (accountType != null) {
1463 intent.putExtra(EXTRA_USER_ACCOUNT_TYPE, accountType);
1464 }
1465 if (accountOptions != null) {
1466 intent.putExtra(EXTRA_USER_ACCOUNT_OPTIONS, accountOptions);
1467 }
1468 return intent;
1469 }
1470
1471 /**
1472 * @hide
1473 *
1474 * Returns the preferred account name for user creation. Requires MANAGE_USERS permission.
1475 */
1476 @SystemApi
1477 public String getSeedAccountName() {
1478 try {
1479 return mService.getSeedAccountName();
1480 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001481 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001482 }
1483 }
1484
1485 /**
1486 * @hide
1487 *
1488 * Returns the preferred account type for user creation. Requires MANAGE_USERS permission.
1489 */
1490 @SystemApi
1491 public String getSeedAccountType() {
1492 try {
1493 return mService.getSeedAccountType();
1494 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001495 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001496 }
1497 }
1498
1499 /**
1500 * @hide
1501 *
1502 * Returns the preferred account's options bundle for user creation. Requires MANAGE_USERS
1503 * permission.
1504 * @return Any options set by the requestor that created the user.
1505 */
1506 @SystemApi
1507 public PersistableBundle getSeedAccountOptions() {
1508 try {
1509 return mService.getSeedAccountOptions();
1510 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001511 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001512 }
1513 }
1514
1515 /**
1516 * @hide
1517 *
1518 * Called by a system activity to set the seed account information of a user created
1519 * through the user creation intent.
1520 * @param userId
1521 * @param accountName
1522 * @param accountType
1523 * @param accountOptions
1524 * @see #createUserCreationIntent(String, String, String, PersistableBundle)
1525 */
1526 public void setSeedAccountData(int userId, String accountName, String accountType,
1527 PersistableBundle accountOptions) {
1528 try {
1529 mService.setSeedAccountData(userId, accountName, accountType, accountOptions,
1530 /* persist= */ true);
1531 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001532 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001533 }
1534 }
1535
1536 /**
1537 * @hide
1538 * Clears the seed information used to create this user. Requires MANAGE_USERS permission.
1539 */
1540 @SystemApi
1541 public void clearSeedAccountData() {
1542 try {
1543 mService.clearSeedAccountData();
1544 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001545 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001546 }
1547 }
1548
1549 /**
Amith Yamasani1df14732014-08-29 21:37:27 -07001550 * @hide
1551 * Marks the guest user for deletion to allow a new guest to be created before deleting
1552 * the current user who is a guest.
1553 * @param userHandle
1554 * @return
1555 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001556 public boolean markGuestForDeletion(@UserIdInt int userHandle) {
Amith Yamasani1df14732014-08-29 21:37:27 -07001557 try {
1558 return mService.markGuestForDeletion(userHandle);
1559 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001560 throw re.rethrowFromSystemServer();
Amith Yamasani1df14732014-08-29 21:37:27 -07001561 }
1562 }
1563
1564 /**
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001565 * Sets the user as enabled, if such an user exists.
Lenka Trochtova1ddda472016-02-12 10:42:12 +01001566 *
1567 * <p>Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1568 *
1569 * <p>Note that the default is true, it's only that managed profiles might not be enabled.
1570 * Also ephemeral users can be disabled to indicate that their removal is in progress and they
1571 * shouldn't be re-entered. Therefore ephemeral users should not be re-enabled once disabled.
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001572 *
1573 * @param userHandle the id of the profile to enable
1574 * @hide
1575 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001576 public void setUserEnabled(@UserIdInt int userHandle) {
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001577 try {
1578 mService.setUserEnabled(userHandle);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001579 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001580 throw re.rethrowFromSystemServer();
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001581 }
1582 }
1583
1584 /**
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001585 * Return the number of users currently created on the device.
1586 */
1587 public int getUserCount() {
1588 List<UserInfo> users = getUsers();
1589 return users != null ? users.size() : 1;
1590 }
1591
1592 /**
Amith Yamasanid04aaa32016-06-13 12:09:36 -07001593 * Returns information for all users on this device, including ones marked for deletion.
1594 * To retrieve only users that are alive, use {@link #getUsers(boolean)}.
1595 * <p>
Amith Yamasani195263742012-08-21 15:40:12 -07001596 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001597 * @return the list of users that exist on the device.
Amith Yamasani258848d2012-08-10 17:06:33 -07001598 * @hide
1599 */
1600 public List<UserInfo> getUsers() {
1601 try {
Amith Yamasani920ace02012-09-20 22:15:37 -07001602 return mService.getUsers(false);
1603 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001604 throw re.rethrowFromSystemServer();
Amith Yamasani920ace02012-09-20 22:15:37 -07001605 }
1606 }
1607
1608 /**
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001609 * Returns serial numbers of all users on this device.
1610 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1611 *
1612 * @param excludeDying specify if the list should exclude users being removed.
1613 * @return the list of serial numbers of users that exist on the device.
1614 * @hide
1615 */
1616 @SystemApi
1617 public long[] getSerialNumbersOfUsers(boolean excludeDying) {
1618 try {
1619 List<UserInfo> users = mService.getUsers(excludeDying);
1620 long[] result = new long[users.size()];
1621 for (int i = 0; i < result.length; i++) {
1622 result[i] = users.get(i).serialNumber;
1623 }
1624 return result;
1625 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001626 throw re.rethrowFromSystemServer();
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001627 }
1628 }
1629
1630 /**
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001631 * @return the user's account name, null if not found.
1632 * @hide
1633 */
1634 @RequiresPermission( allOf = {
1635 Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1636 Manifest.permission.MANAGE_USERS
1637 })
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001638 public @Nullable String getUserAccount(@UserIdInt int userHandle) {
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001639 try {
1640 return mService.getUserAccount(userHandle);
1641 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001642 throw re.rethrowFromSystemServer();
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001643 }
1644 }
1645
1646 /**
1647 * Set account name for the given user.
1648 * @hide
1649 */
1650 @RequiresPermission( allOf = {
1651 Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1652 Manifest.permission.MANAGE_USERS
1653 })
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001654 public void setUserAccount(@UserIdInt int userHandle, @Nullable String accountName) {
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001655 try {
1656 mService.setUserAccount(userHandle, accountName);
1657 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001658 throw re.rethrowFromSystemServer();
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001659 }
1660 }
1661
1662 /**
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001663 * Returns information for Primary user.
1664 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1665 *
1666 * @return the Primary user, null if not found.
1667 * @hide
1668 */
Xiaohui Chen7cb69df2015-07-13 16:01:01 -07001669 public @Nullable UserInfo getPrimaryUser() {
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001670 try {
1671 return mService.getPrimaryUser();
1672 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001673 throw re.rethrowFromSystemServer();
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001674 }
1675 }
1676
1677 /**
Amith Yamasani95ab7842014-08-11 17:09:26 -07001678 * Checks whether it's possible to add more users. Caller must hold the MANAGE_USERS
1679 * permission.
1680 *
1681 * @return true if more users can be added, false if limit has been reached.
1682 * @hide
1683 */
1684 public boolean canAddMoreUsers() {
1685 final List<UserInfo> users = getUsers(true);
1686 final int totalUserCount = users.size();
1687 int aliveUserCount = 0;
1688 for (int i = 0; i < totalUserCount; i++) {
1689 UserInfo user = users.get(i);
1690 if (!user.isGuest()) {
1691 aliveUserCount++;
1692 }
1693 }
1694 return aliveUserCount < getMaxSupportedUsers();
1695 }
1696
1697 /**
Nicolas Prevot72434b72015-05-13 12:15:03 -07001698 * Checks whether it's possible to add more managed profiles. Caller must hold the MANAGE_USERS
1699 * permission.
Nicolas Prevot07387fe2015-10-30 17:53:30 +00001700 * if allowedToRemoveOne is true and if the user already has a managed profile, then return if
1701 * we could add a new managed profile to this user after removing the existing one.
Nicolas Prevot72434b72015-05-13 12:15:03 -07001702 *
1703 * @return true if more managed profiles can be added, false if limit has been reached.
1704 * @hide
1705 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001706 public boolean canAddMoreManagedProfiles(@UserIdInt int userId, boolean allowedToRemoveOne) {
Nicolas Prevot72434b72015-05-13 12:15:03 -07001707 try {
Nicolas Prevot07387fe2015-10-30 17:53:30 +00001708 return mService.canAddMoreManagedProfiles(userId, allowedToRemoveOne);
Nicolas Prevot72434b72015-05-13 12:15:03 -07001709 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001710 throw re.rethrowFromSystemServer();
Nicolas Prevot72434b72015-05-13 12:15:03 -07001711 }
1712 }
1713
1714 /**
Kenny Guy2a764942014-04-02 13:29:20 +01001715 * Returns list of the profiles of userHandle including
1716 * userHandle itself.
Amith Yamasani4f7e2e32014-08-14 18:49:48 -07001717 * Note that this returns both enabled and not enabled profiles. See
Ruben Brunk7f75da22015-04-30 17:46:30 -07001718 * {@link #getEnabledProfiles(int)} if you need only the enabled ones.
Amith Yamasani4f582632014-02-19 14:31:52 -08001719 *
Kenny Guy2a764942014-04-02 13:29:20 +01001720 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1721 * @param userHandle profiles of this user will be returned.
1722 * @return the list of profiles.
1723 * @hide
1724 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001725 public List<UserInfo> getProfiles(@UserIdInt int userHandle) {
Kenny Guya52dc3e2014-02-11 15:33:14 +00001726 try {
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001727 return mService.getProfiles(userHandle, false /* enabledOnly */);
Kenny Guya52dc3e2014-02-11 15:33:14 +00001728 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001729 throw re.rethrowFromSystemServer();
Kenny Guya52dc3e2014-02-11 15:33:14 +00001730 }
1731 }
1732
1733 /**
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001734 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1735 * @param userId one of the two user ids to check.
1736 * @param otherUserId one of the two user ids to check.
1737 * @return true if the two user ids are in the same profile group.
1738 * @hide
1739 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001740 public boolean isSameProfileGroup(@UserIdInt int userId, int otherUserId) {
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001741 try {
1742 return mService.isSameProfileGroup(userId, otherUserId);
1743 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001744 throw re.rethrowFromSystemServer();
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001745 }
1746 }
1747
1748 /**
Ruben Brunk7f75da22015-04-30 17:46:30 -07001749 * Returns list of the profiles of userHandle including
1750 * userHandle itself.
1751 * Note that this returns only enabled.
1752 *
1753 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1754 * @param userHandle profiles of this user will be returned.
1755 * @return the list of profiles.
1756 * @hide
1757 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001758 public List<UserInfo> getEnabledProfiles(@UserIdInt int userHandle) {
Ruben Brunk7f75da22015-04-30 17:46:30 -07001759 try {
1760 return mService.getProfiles(userHandle, true /* enabledOnly */);
1761 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001762 throw re.rethrowFromSystemServer();
Ruben Brunk7f75da22015-04-30 17:46:30 -07001763 }
1764 }
1765
1766 /**
Jessica Hummelbe81c802014-04-22 15:49:22 +01001767 * Returns a list of UserHandles for profiles associated with the user that the calling process
1768 * is running on, including the user itself.
Amith Yamasani4f582632014-02-19 14:31:52 -08001769 *
1770 * @return A non-empty list of UserHandles associated with the calling user.
1771 */
1772 public List<UserHandle> getUserProfiles() {
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001773 int[] userIds = getProfileIds(UserHandle.myUserId(), true /* enabledOnly */);
1774 List<UserHandle> result = new ArrayList<>(userIds.length);
1775 for (int userId : userIds) {
1776 result.add(UserHandle.of(userId));
1777 }
1778 return result;
1779 }
1780
1781 /**
1782 * Returns a list of ids for profiles associated with the specified user including the user
1783 * itself.
1784 *
1785 * @param userId id of the user to return profiles for
1786 * @param enabledOnly whether return only {@link UserInfo#isEnabled() enabled} profiles
1787 * @return A non-empty list of ids of profiles associated with the specified user.
1788 *
1789 * @hide
1790 */
1791 public int[] getProfileIds(@UserIdInt int userId, boolean enabledOnly) {
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001792 try {
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001793 return mService.getProfileIds(userId, enabledOnly);
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001794 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001795 throw re.rethrowFromSystemServer();
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001796 }
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001797 }
1798
1799 /**
1800 * @see #getProfileIds(int, boolean)
1801 * @hide
1802 */
1803 public int[] getProfileIdsWithDisabled(@UserIdInt int userId) {
1804 return getProfileIds(userId, false /* enabledOnly */);
1805 }
1806
1807 /**
1808 * @see #getProfileIds(int, boolean)
1809 * @hide
1810 */
1811 public int[] getEnabledProfileIds(@UserIdInt int userId) {
1812 return getProfileIds(userId, true /* enabledOnly */);
Amith Yamasani4f582632014-02-19 14:31:52 -08001813 }
1814
Amith Yamasani7dda2652014-04-11 14:57:12 -07001815 /**
Andres Moralesc5548c02015-08-05 10:23:12 -07001816 * Returns the device credential owner id of the profile from
1817 * which this method is called, or userHandle if called from a user that
1818 * is not a profile.
1819 *
1820 * @hide
1821 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001822 public int getCredentialOwnerProfile(@UserIdInt int userHandle) {
Andres Moralesc5548c02015-08-05 10:23:12 -07001823 try {
1824 return mService.getCredentialOwnerProfile(userHandle);
1825 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001826 throw re.rethrowFromSystemServer();
Andres Moralesc5548c02015-08-05 10:23:12 -07001827 }
1828 }
1829
1830 /**
Jessica Hummelbe81c802014-04-22 15:49:22 +01001831 * Returns the parent of the profile which this method is called from
1832 * or null if called from a user that is not a profile.
1833 *
1834 * @hide
1835 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001836 public UserInfo getProfileParent(@UserIdInt int userHandle) {
Jessica Hummelbe81c802014-04-22 15:49:22 +01001837 try {
1838 return mService.getProfileParent(userHandle);
1839 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001840 throw re.rethrowFromSystemServer();
Jessica Hummelbe81c802014-04-22 15:49:22 +01001841 }
1842 }
1843
1844 /**
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001845 * Set quiet mode of a managed profile.
1846 *
1847 * @param userHandle The user handle of the profile.
1848 * @param enableQuietMode Whether quiet mode should be enabled or disabled.
1849 * @hide
1850 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001851 public void setQuietModeEnabled(@UserIdInt int userHandle, boolean enableQuietMode) {
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001852 try {
1853 mService.setQuietModeEnabled(userHandle, enableQuietMode);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001854 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001855 throw re.rethrowFromSystemServer();
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001856 }
1857 }
1858
1859 /**
1860 * Returns whether the given profile is in quiet mode or not.
Ricky Wai7881cf82016-04-15 17:20:12 +01001861 * Notes: Quiet mode is only supported for managed profiles.
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001862 *
1863 * @param userHandle The user handle of the profile to be queried.
1864 * @return true if the profile is in quiet mode, false otherwise.
1865 */
1866 public boolean isQuietModeEnabled(UserHandle userHandle) {
1867 try {
1868 return mService.isQuietModeEnabled(userHandle.getIdentifier());
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001869 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001870 throw re.rethrowFromSystemServer();
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001871 }
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001872 }
1873
1874 /**
Benjamin Franzf02420c2016-04-04 18:52:21 +01001875 * Tries disabling quiet mode for a given user. If the user is still locked, we unlock the user
1876 * first by showing the confirm credentials screen and disable quiet mode upon successful
1877 * unlocking. If the user is already unlocked, we call through to {@link #setQuietModeEnabled}
1878 * directly.
1879 *
1880 * @return true if the quiet mode was disabled immediately
1881 * @hide
1882 */
1883 public boolean trySetQuietModeDisabled(@UserIdInt int userHandle, IntentSender target) {
1884 try {
1885 return mService.trySetQuietModeDisabled(userHandle, target);
1886 } catch (RemoteException re) {
1887 throw re.rethrowFromSystemServer();
1888 }
1889 }
1890
1891 /**
Amith Yamasani7dda2652014-04-11 14:57:12 -07001892 * If the target user is a managed profile of the calling user or the caller
1893 * is itself a managed profile, then this returns a badged copy of the given
Svetoslavc71c42f2014-08-05 18:57:05 -07001894 * icon to be able to distinguish it from the original icon. For badging an
1895 * arbitrary drawable use {@link #getBadgedDrawableForUser(
1896 * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
1897 * <p>
1898 * If the original drawable is a BitmapDrawable and the backing bitmap is
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001899 * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
Svetoslavc71c42f2014-08-05 18:57:05 -07001900 * is performed in place and the original drawable is returned.
1901 * </p>
Amith Yamasani7dda2652014-04-11 14:57:12 -07001902 *
1903 * @param icon The icon to badge.
1904 * @param user The target user.
1905 * @return A drawable that combines the original icon and a badge as
1906 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001907 * @removed
Amith Yamasani7dda2652014-04-11 14:57:12 -07001908 */
Svetoslavc71c42f2014-08-05 18:57:05 -07001909 public Drawable getBadgedIconForUser(Drawable icon, UserHandle user) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001910 return mContext.getPackageManager().getUserBadgedIcon(icon, user);
Amith Yamasani4f582632014-02-19 14:31:52 -08001911 }
1912
Kenny Guy701ea7c2014-05-08 23:34:12 +01001913 /**
1914 * If the target user is a managed profile of the calling user or the caller
Svetoslavc71c42f2014-08-05 18:57:05 -07001915 * is itself a managed profile, then this returns a badged copy of the given
1916 * drawable allowing the user to distinguish it from the original drawable.
1917 * The caller can specify the location in the bounds of the drawable to be
1918 * badged where the badge should be applied as well as the density of the
1919 * badge to be used.
1920 * <p>
1921 * If the original drawable is a BitmapDrawable and the backing bitmap is
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001922 * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
Svetoslavc71c42f2014-08-05 18:57:05 -07001923 * is performed in place and the original drawable is returned.
1924 * </p>
1925 *
1926 * @param badgedDrawable The drawable to badge.
1927 * @param user The target user.
1928 * @param badgeLocation Where in the bounds of the badged drawable to place
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001929 * the badge. If it's {@code null}, the badge is applied on top of the entire
Svetoslavc71c42f2014-08-05 18:57:05 -07001930 * drawable being badged.
1931 * @param badgeDensity The optional desired density for the badge as per
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001932 * {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
Svetoslavc71c42f2014-08-05 18:57:05 -07001933 * the density of the display is used.
1934 * @return A drawable that combines the original drawable and a badge as
1935 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001936 * @removed
Svetoslavc71c42f2014-08-05 18:57:05 -07001937 */
1938 public Drawable getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user,
1939 Rect badgeLocation, int badgeDensity) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001940 return mContext.getPackageManager().getUserBadgedDrawableForDensity(badgedDrawable, user,
1941 badgeLocation, badgeDensity);
Svetoslavc71c42f2014-08-05 18:57:05 -07001942 }
1943
1944 /**
1945 * If the target user is a managed profile of the calling user or the caller
Kenny Guyf7ecf7c2014-06-18 11:32:05 +01001946 * is itself a managed profile, then this returns a copy of the label with
1947 * badging for accessibility services like talkback. E.g. passing in "Email"
1948 * and it might return "Work Email" for Email in the work profile.
1949 *
1950 * @param label The label to change.
1951 * @param user The target user.
1952 * @return A label that combines the original label and a badge as
1953 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001954 * @removed
Kenny Guyf7ecf7c2014-06-18 11:32:05 +01001955 */
Kenny Guy237aecd2014-07-21 14:06:09 +01001956 public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001957 return mContext.getPackageManager().getUserBadgedLabel(label, user);
Amith Yamasani4f582632014-02-19 14:31:52 -08001958 }
1959
1960 /**
1961 * Returns information for all users on this device. Requires
1962 * {@link android.Manifest.permission#MANAGE_USERS} permission.
Emily Bernier394a6cd2014-05-07 12:49:20 -04001963 *
Amith Yamasani4f582632014-02-19 14:31:52 -08001964 * @param excludeDying specify if the list should exclude users being
1965 * removed.
Amith Yamasani920ace02012-09-20 22:15:37 -07001966 * @return the list of users that were created.
1967 * @hide
1968 */
1969 public List<UserInfo> getUsers(boolean excludeDying) {
1970 try {
1971 return mService.getUsers(excludeDying);
Amith Yamasani258848d2012-08-10 17:06:33 -07001972 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001973 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001974 }
1975 }
1976
1977 /**
1978 * Removes a user and all associated data.
Amith Yamasani195263742012-08-21 15:40:12 -07001979 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001980 * @param userHandle the integer handle of the user, where 0 is the primary user.
1981 * @hide
1982 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001983 public boolean removeUser(@UserIdInt int userHandle) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001984 try {
1985 return mService.removeUser(userHandle);
1986 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001987 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001988 }
1989 }
1990
1991 /**
1992 * Updates the user's name.
Amith Yamasani195263742012-08-21 15:40:12 -07001993 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001994 *
1995 * @param userHandle the user's integer handle
1996 * @param name the new name for the user
1997 * @hide
1998 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001999 public void setUserName(@UserIdInt int userHandle, String name) {
Amith Yamasani258848d2012-08-10 17:06:33 -07002000 try {
2001 mService.setUserName(userHandle, name);
2002 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002003 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07002004 }
2005 }
2006
2007 /**
Amith Yamasanie928d7d2012-09-17 21:46:51 -07002008 * Sets the user's photo.
Amith Yamasani258848d2012-08-10 17:06:33 -07002009 * @param userHandle the user for whom to change the photo.
Amith Yamasanie928d7d2012-09-17 21:46:51 -07002010 * @param icon the bitmap to set as the photo.
Amith Yamasani258848d2012-08-10 17:06:33 -07002011 * @hide
2012 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002013 public void setUserIcon(@UserIdInt int userHandle, Bitmap icon) {
Amith Yamasani258848d2012-08-10 17:06:33 -07002014 try {
Amith Yamasanie928d7d2012-09-17 21:46:51 -07002015 mService.setUserIcon(userHandle, icon);
Amith Yamasani258848d2012-08-10 17:06:33 -07002016 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002017 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07002018 }
2019 }
2020
2021 /**
Amith Yamasani3b49f072012-09-17 10:21:43 -07002022 * Returns a file descriptor for the user's photo. PNG data can be read from this file.
2023 * @param userHandle the user whose photo we want to read.
Amith Yamasanie928d7d2012-09-17 21:46:51 -07002024 * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
Alexandra Gherghina64d4dca2014-08-28 18:26:56 +01002025 * @see com.android.internal.util.UserIcons#getDefaultUserIcon for a default.
Amith Yamasani3b49f072012-09-17 10:21:43 -07002026 * @hide
2027 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002028 public Bitmap getUserIcon(@UserIdInt int userHandle) {
Amith Yamasani3b49f072012-09-17 10:21:43 -07002029 try {
Adrian Roos1bdff912015-02-17 15:51:35 +01002030 ParcelFileDescriptor fd = mService.getUserIcon(userHandle);
2031 if (fd != null) {
2032 try {
2033 return BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());
2034 } finally {
2035 try {
2036 fd.close();
2037 } catch (IOException e) {
2038 }
2039 }
2040 }
Amith Yamasani3b49f072012-09-17 10:21:43 -07002041 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002042 throw re.rethrowFromSystemServer();
Amith Yamasani3b49f072012-09-17 10:21:43 -07002043 }
Adrian Roos1bdff912015-02-17 15:51:35 +01002044 return null;
Amith Yamasani3b49f072012-09-17 10:21:43 -07002045 }
2046
2047 /**
Amith Yamasani258848d2012-08-10 17:06:33 -07002048 * Returns the maximum number of users that can be created on this device. A return value
2049 * of 1 means that it is a single user device.
2050 * @hide
Maggie Benthalla12fccf2013-03-14 18:02:12 -04002051 * @return a value greater than or equal to 1
Amith Yamasani258848d2012-08-10 17:06:33 -07002052 */
Jeff Sharkey27bd34d2012-09-16 12:49:00 -07002053 public static int getMaxSupportedUsers() {
Amith Yamasaniff549202012-10-12 12:44:49 -07002054 // Don't allow multiple users on certain builds
2055 if (android.os.Build.ID.startsWith("JVP")) return 1;
Dianne Hackborn409297d2014-07-10 17:39:20 -07002056 // Svelte devices don't get multi-user.
2057 if (ActivityManager.isLowRamDeviceStatic()) return 1;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -07002058 return SystemProperties.getInt("fw.max_users",
2059 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
Amith Yamasani258848d2012-08-10 17:06:33 -07002060 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002061
2062 /**
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002063 * Returns true if the user switcher should be shown, this will be if device supports multi-user
2064 * and there are at least 2 users available that are not managed profiles.
Kenny Guy1a447532014-02-20 21:55:32 +00002065 * @hide
2066 * @return true if user switcher should be shown.
2067 */
2068 public boolean isUserSwitcherEnabled() {
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002069 if (!supportsMultipleUsers()) {
2070 return false;
2071 }
Amith Yamasanieb437d42016-04-29 09:31:25 -07002072 // If Demo Mode is on, don't show user switcher
2073 if (isDeviceInDemoMode(mContext)) {
2074 return false;
2075 }
Kenny Guy1a447532014-02-20 21:55:32 +00002076 List<UserInfo> users = getUsers(true);
2077 if (users == null) {
2078 return false;
2079 }
2080 int switchableUserCount = 0;
2081 for (UserInfo user : users) {
Xiaohui Chen7cb69df2015-07-13 16:01:01 -07002082 if (user.supportsSwitchToByUser()) {
Kenny Guy1a447532014-02-20 21:55:32 +00002083 ++switchableUserCount;
2084 }
2085 }
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002086 final boolean guestEnabled = !mContext.getSystemService(DevicePolicyManager.class)
2087 .getGuestUserDisabled(null);
Amith Yamasania596ff82014-06-12 18:12:38 -07002088 return switchableUserCount > 1 || guestEnabled;
Kenny Guy1a447532014-02-20 21:55:32 +00002089 }
2090
2091 /**
Amith Yamasanieb437d42016-04-29 09:31:25 -07002092 * @hide
2093 */
2094 public static boolean isDeviceInDemoMode(Context context) {
2095 return Settings.Global.getInt(context.getContentResolver(),
2096 Settings.Global.DEVICE_DEMO_MODE, 0) > 0;
2097 }
2098
2099 /**
Amith Yamasani2a003292012-08-14 18:25:45 -07002100 * Returns a serial number on this device for a given userHandle. User handles can be recycled
2101 * when deleting and creating users, but serial numbers are not reused until the device is wiped.
2102 * @param userHandle
2103 * @return a serial number associated with that user, or -1 if the userHandle is not valid.
2104 * @hide
2105 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002106 public int getUserSerialNumber(@UserIdInt int userHandle) {
Amith Yamasani2a003292012-08-14 18:25:45 -07002107 try {
2108 return mService.getUserSerialNumber(userHandle);
2109 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002110 throw re.rethrowFromSystemServer();
Amith Yamasani2a003292012-08-14 18:25:45 -07002111 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002112 }
2113
2114 /**
2115 * Returns a userHandle on this device for a given user serial number. User handles can be
2116 * recycled when deleting and creating users, but serial numbers are not reused until the device
2117 * is wiped.
2118 * @param userSerialNumber
2119 * @return the userHandle associated with that user serial number, or -1 if the serial number
2120 * is not valid.
2121 * @hide
2122 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002123 public @UserIdInt int getUserHandle(int userSerialNumber) {
Amith Yamasani2a003292012-08-14 18:25:45 -07002124 try {
2125 return mService.getUserHandle(userSerialNumber);
2126 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002127 throw re.rethrowFromSystemServer();
Amith Yamasani2a003292012-08-14 18:25:45 -07002128 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002129 }
Maggie Benthall67944582013-02-22 14:58:27 -05002130
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002131 /**
Esteban Talavera953fe482016-06-07 15:25:20 +01002132 * Returns a {@link Bundle} containing any saved application restrictions for this user, for the
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002133 * given package name. Only an application with this package name can call this method.
Esteban Talavera5b9f1672015-12-11 15:22:34 +00002134 *
2135 * <p>The returned {@link Bundle} consists of key-value pairs, as defined by the application,
2136 * where the types of values may be:
2137 * <ul>
2138 * <li>{@code boolean}
2139 * <li>{@code int}
2140 * <li>{@code String} or {@code String[]}
2141 * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]}
2142 * </ul>
2143 *
Fyodor Kupolov4e9af062016-07-18 16:59:11 -07002144 * <p>NOTE: The method performs disk I/O and shouldn't be called on the main thread
2145 *
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002146 * @param packageName the package name of the calling application
Esteban Talavera953fe482016-06-07 15:25:20 +01002147 * @return a {@link Bundle} with the restrictions for that package, or an empty {@link Bundle}
2148 * if there are no saved restrictions.
Esteban Talavera5b9f1672015-12-11 15:22:34 +00002149 *
2150 * @see #KEY_RESTRICTIONS_PENDING
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002151 */
Fyodor Kupolov4e9af062016-07-18 16:59:11 -07002152 @WorkerThread
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002153 public Bundle getApplicationRestrictions(String packageName) {
2154 try {
2155 return mService.getApplicationRestrictions(packageName);
2156 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002157 throw re.rethrowFromSystemServer();
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002158 }
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002159 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002160
2161 /**
2162 * @hide
2163 */
Fyodor Kupolov4e9af062016-07-18 16:59:11 -07002164 @WorkerThread
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002165 public Bundle getApplicationRestrictions(String packageName, UserHandle user) {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002166 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002167 return mService.getApplicationRestrictionsForUser(packageName, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002168 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002169 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002170 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002171 }
2172
2173 /**
2174 * @hide
2175 */
Fyodor Kupolov4e9af062016-07-18 16:59:11 -07002176 @WorkerThread
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002177 public void setApplicationRestrictions(String packageName, Bundle restrictions,
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002178 UserHandle user) {
2179 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002180 mService.setApplicationRestrictions(packageName, restrictions, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002181 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002182 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002183 }
2184 }
Amith Yamasani655d0e22013-06-12 14:19:10 -07002185
2186 /**
Amith Yamasanid304af62013-09-05 09:30:23 -07002187 * Sets a new challenge PIN for restrictions. This is only for use by pre-installed
2188 * apps and requires the MANAGE_USERS permission.
2189 * @param newPin the PIN to use for challenge dialogs.
2190 * @return Returns true if the challenge PIN was set successfully.
Fyodor Kupolovef249092015-05-06 13:18:46 -07002191 * @deprecated The restrictions PIN functionality is no longer provided by the system.
2192 * This method is preserved for backwards compatibility reasons and always returns false.
Amith Yamasani655d0e22013-06-12 14:19:10 -07002193 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07002194 @Deprecated
Amith Yamasanid304af62013-09-05 09:30:23 -07002195 public boolean setRestrictionsChallenge(String newPin) {
Amith Yamasani655d0e22013-06-12 14:19:10 -07002196 return false;
2197 }
Amith Yamasani1a7472e2013-07-02 11:17:30 -07002198
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302199 /**
2200 * @hide
2201 * Set restrictions that should apply to any future guest user that's created.
2202 */
2203 public void setDefaultGuestRestrictions(Bundle restrictions) {
2204 try {
2205 mService.setDefaultGuestRestrictions(restrictions);
2206 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002207 throw re.rethrowFromSystemServer();
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302208 }
2209 }
2210
2211 /**
2212 * @hide
2213 * Gets the default guest restrictions.
2214 */
2215 public Bundle getDefaultGuestRestrictions() {
2216 try {
2217 return mService.getDefaultGuestRestrictions();
2218 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002219 throw re.rethrowFromSystemServer();
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302220 }
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302221 }
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002222
2223 /**
2224 * Returns creation time of the user or of a managed profile associated with the calling user.
2225 * @param userHandle user handle of the user or a managed profile associated with the
2226 * calling user.
2227 * @return creation time in milliseconds since Epoch time.
2228 */
Fyodor Kupolov385de622015-04-10 18:00:19 -07002229 public long getUserCreationTime(UserHandle userHandle) {
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002230 try {
Fyodor Kupolov385de622015-04-10 18:00:19 -07002231 return mService.getUserCreationTime(userHandle.getIdentifier());
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002232 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002233 throw re.rethrowFromSystemServer();
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002234 }
2235 }
Amith Yamasani12747872015-12-07 14:19:49 -08002236
2237 /**
2238 * @hide
2239 * Checks if any uninitialized user has the specific seed account name and type.
2240 *
2241 * @param mAccountName The account name to check for
2242 * @param mAccountType The account type of the account to check for
2243 * @return whether the seed account was found
2244 */
2245 public boolean someUserHasSeedAccount(String accountName, String accountType) {
2246 try {
2247 return mService.someUserHasSeedAccount(accountName, accountType);
2248 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002249 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08002250 }
2251 }
Amith Yamasani258848d2012-08-10 17:06:33 -07002252}