blob: 2278414f3a03fdce183fc117c932d3fbd4406962 [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;
Amith Yamasani37ed8d12016-01-27 14:40:16 -080026import android.app.Activity;
Dianne Hackborn409297d2014-07-10 17:39:20 -070027import android.app.ActivityManager;
Dianne Hackborna8a9bd62012-10-09 15:36:59 -070028import android.app.ActivityManagerNative;
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -070029import android.app.admin.DevicePolicyManager;
Makoto Onuki068c54a2015-10-13 14:34:03 -070030import android.content.ComponentName;
Amith Yamasani258848d2012-08-10 17:06:33 -070031import android.content.Context;
Amith Yamasani12747872015-12-07 14:19:49 -080032import android.content.Intent;
Benjamin Franzf02420c2016-04-04 18:52:21 +010033import android.content.IntentSender;
Amith Yamasani258848d2012-08-10 17:06:33 -070034import android.content.pm.UserInfo;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -070035import android.content.res.Resources;
Maggie Benthall67944582013-02-22 14:58:27 -050036import android.graphics.Bitmap;
Adrian Roos1bdff912015-02-17 15:51:35 +010037import android.graphics.BitmapFactory;
Amith Yamasani4f582632014-02-19 14:31:52 -080038import android.graphics.Rect;
Amith Yamasani4f582632014-02-19 14:31:52 -080039import android.graphics.drawable.Drawable;
Amith Yamasani1e9c2182014-06-11 17:25:51 -070040import android.provider.Settings;
Fyodor Kupolov523c4042016-02-24 15:03:13 -080041import android.telephony.TelephonyManager;
Jason Monk1c7c3192014-06-26 12:52:18 -040042import android.view.WindowManager.LayoutParams;
Amith Yamasani258848d2012-08-10 17:06:33 -070043
Maggie Benthall67944582013-02-22 14:58:27 -050044import com.android.internal.R;
45
Adrian Roos1bdff912015-02-17 15:51:35 +010046import java.io.IOException;
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +010047import java.lang.annotation.Retention;
48import java.lang.annotation.RetentionPolicy;
Amith Yamasani4f582632014-02-19 14:31:52 -080049import java.util.ArrayList;
Amith Yamasani258848d2012-08-10 17:06:33 -070050import java.util.List;
51
52/**
Amith Yamasani06964342016-04-15 13:55:01 -070053 * Manages users and user details on a multi-user system. There are two major categories of
54 * users: fully customizable users with their own login, and managed profiles that share a workspace
55 * with a related user.
56 * <p>
57 * Users are different from accounts, which are managed by
58 * {@link AccountManager}. Each user can have their own set of accounts.
59 * <p>
60 * See {@link DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} for more on managed profiles.
Amith Yamasani258848d2012-08-10 17:06:33 -070061 */
62public class UserManager {
63
64 private static String TAG = "UserManager";
65 private final IUserManager mService;
66 private final Context mContext;
67
Amith Yamasanie4cf7342012-12-17 11:12:09 -080068 /**
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +010069 * @hide
70 * No user restriction.
71 */
72 @SystemApi
73 public static final int RESTRICTION_NOT_SET = 0x0;
74
75 /**
76 * @hide
77 * User restriction set by system/user.
78 */
79 @SystemApi
80 public static final int RESTRICTION_SOURCE_SYSTEM = 0x1;
81
82 /**
83 * @hide
84 * User restriction set by a device owner.
85 */
86 @SystemApi
87 public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 0x2;
88
89 /**
90 * @hide
91 * User restriction set by a profile owner.
92 */
93 @SystemApi
94 public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 0x4;
95
96 /** @hide */
97 @Retention(RetentionPolicy.SOURCE)
98 @IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM,
99 RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER})
100 @SystemApi
101 public @interface UserRestrictionSource {}
102
103 /**
Fyodor Kupolov53019282015-07-21 11:48:18 -0700104 * Specifies if a user is disallowed from adding and removing accounts, unless they are
105 * {@link android.accounts.AccountManager#addAccountExplicitly programmatically} added by
106 * Authenticator.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700107 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700108 *
Benjamin Franzb6c0ce42015-11-05 10:06:51 +0000109 * <p>From {@link android.os.Build.VERSION_CODES#N} a profile or device owner app can still
110 * use {@link android.accounts.AccountManager} APIs to add or remove accounts when account
111 * management is disallowed.
112 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800113 * <p>Key for user restrictions.
114 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700115 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
116 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800117 * @see #getUserRestrictions()
118 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700119 public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800120
121 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700122 * Specifies if a user is disallowed from changing Wi-Fi
Julia Reynolds2cb384f2014-08-13 15:15:55 -0400123 * access points. The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800124 * <p>This restriction has no effect in a managed profile.
Amith Yamasani26af8292014-09-09 09:57:27 -0700125 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800126 * <p>Key for user restrictions.
127 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700128 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
129 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800130 * @see #getUserRestrictions()
131 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700132 public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800133
134 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700135 * Specifies if a user is disallowed from installing applications.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700136 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700137 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800138 * <p>Key for user restrictions.
139 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700140 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
141 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800142 * @see #getUserRestrictions()
143 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700144 public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800145
146 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700147 * Specifies if a user is disallowed from uninstalling applications.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700148 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700149 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800150 * <p>Key for user restrictions.
151 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700152 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
153 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800154 * @see #getUserRestrictions()
155 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700156 public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
Amith Yamasanie4cf7342012-12-17 11:12:09 -0800157
Amith Yamasani71e6c692013-03-24 17:39:28 -0700158 /**
Amith Yamasani150514b2015-01-07 16:05:05 -0800159 * Specifies if a user is disallowed from turning on location sharing.
Amith Yamasani71e6c692013-03-24 17:39:28 -0700160 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800161 * <p>In a managed profile, location sharing always reflects the primary user's setting, but
Amith Yamasani150514b2015-01-07 16:05:05 -0800162 * can be overridden and forced off by setting this restriction to true in the managed profile.
Amith Yamasani26af8292014-09-09 09:57:27 -0700163 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800164 * <p>Key for user restrictions.
165 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700166 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
167 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthall67944582013-02-22 14:58:27 -0500168 * @see #getUserRestrictions()
169 */
Amith Yamasani71e6c692013-03-24 17:39:28 -0700170 public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
Maggie Benthall67944582013-02-22 14:58:27 -0500171
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400172 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700173 * Specifies if a user is disallowed from enabling the
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400174 * "Unknown Sources" setting, that allows installation of apps from unknown sources.
175 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700176 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800177 * <p>Key for user restrictions.
178 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700179 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
180 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400181 * @see #getUserRestrictions()
182 */
183 public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
184
185 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700186 * Specifies if a user is disallowed from configuring bluetooth.
Nicolas Prevot1c4c4422015-02-16 11:32:21 +0000187 * This does <em>not</em> restrict the user from turning bluetooth on or off.
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400188 * The default value is <code>false</code>.
Lenka Trochtova13a05192016-12-02 12:19:39 +0100189 * <p>This restriction doesn't prevent the user from using bluetooth. For disallowing usage of
190 * bluetooth completely on the device, use {@link #DISALLOW_BLUETOOTH}.
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 /**
Lenka Trochtova13a05192016-12-02 12:19:39 +0100202 * Specifies if bluetooth is disallowed on the device.
203 *
204 * <p> This restriction can only be set by the device owner and the profile owner on the
205 * primary user and it applies globally - i.e. it disables bluetooth on the entire device.
206 * <p>The default value is <code>false</code>.
207 * <p>Key for user restrictions.
208 * <p>Type: Boolean
209 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
210 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
211 * @see #getUserRestrictions()
212 */
213 public static final String DISALLOW_BLUETOOTH = "no_bluetooth";
214
215 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700216 * Specifies if a user is disallowed from transferring files over
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700217 * USB. This can only be set by device owners and profile owners on the primary user.
218 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700219 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800220 * <p>Key for user restrictions.
221 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700222 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
223 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400224 * @see #getUserRestrictions()
225 */
226 public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
227
Emily Bernierb223f732013-04-11 15:46:36 -0400228 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700229 * Specifies if a user is disallowed from configuring user
Emily Bernierb223f732013-04-11 15:46:36 -0400230 * credentials. 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_CONFIG_CREDENTIALS = "no_config_credentials";
239
240 /**
Amith Yamasani150514b2015-01-07 16:05:05 -0800241 * When set on the primary user this specifies if the user can remove other users.
242 * When set on a secondary user, this specifies if the user can remove itself.
243 * This restriction has no effect on managed profiles.
244 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700245 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800246 * <p>Key for user restrictions.
247 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700248 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
249 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernierb223f732013-04-11 15:46:36 -0400250 * @see #getUserRestrictions()
251 */
252 public static final String DISALLOW_REMOVE_USER = "no_remove_user";
253
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400254 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700255 * Specifies if a user is disallowed from enabling or
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400256 * accessing debugging features. The default value is <code>false</code>.
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_DEBUGGING_FEATURES = "no_debugging_features";
265
266 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700267 * Specifies if a user is disallowed from configuring VPN.
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400268 * The default value is <code>false</code>.
Nicolas Prevot298f98f2015-05-22 16:43:03 -0700269 * This restriction has an effect in a managed profile only from
Dianne Hackborn0e3de6c2015-07-29 15:20:21 -0700270 * {@link android.os.Build.VERSION_CODES#M}
Amith Yamasani26af8292014-09-09 09:57:27 -0700271 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800272 * <p>Key for user restrictions.
273 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700274 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
275 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400276 * @see #getUserRestrictions()
277 */
278 public static final String DISALLOW_CONFIG_VPN = "no_config_vpn";
279
280 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700281 * Specifies if a user is disallowed from configuring Tethering
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700282 * & portable hotspots. This can only be set by device owners and profile owners on the
283 * primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700284 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800285 * <p>Key for user restrictions.
286 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700287 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
288 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400289 * @see #getUserRestrictions()
290 */
291 public static final String DISALLOW_CONFIG_TETHERING = "no_config_tethering";
292
293 /**
Stuart Scotte3e314d2015-04-20 14:07:45 -0700294 * Specifies if a user is disallowed from resetting network settings
295 * from Settings. This can only be set by device owners and profile owners on the primary user.
296 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800297 * <p>This restriction has no effect on secondary users and managed profiles since only the
Stuart Scotte3e314d2015-04-20 14:07:45 -0700298 * primary user can reset the network settings of the device.
299 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800300 * <p>Key for user restrictions.
301 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700302 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
303 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Stuart Scotte3e314d2015-04-20 14:07:45 -0700304 * @see #getUserRestrictions()
305 */
306 public static final String DISALLOW_NETWORK_RESET = "no_network_reset";
307
308 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700309 * Specifies if a user is disallowed from factory resetting
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700310 * from Settings. This can only be set by device owners and profile owners on the primary user.
311 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800312 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800313 * primary user can factory reset the device.
Amith Yamasani26af8292014-09-09 09:57:27 -0700314 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800315 * <p>Key for user restrictions.
316 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700317 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
318 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400319 * @see #getUserRestrictions()
320 */
321 public static final String DISALLOW_FACTORY_RESET = "no_factory_reset";
322
323 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700324 * Specifies if a user is disallowed from adding new users and
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700325 * profiles. This can only be set by device owners and profile owners on the primary user.
326 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800327 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800328 * primary user can add other users.
Amith Yamasani26af8292014-09-09 09:57:27 -0700329 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800330 * <p>Key for user restrictions.
331 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700332 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
333 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400334 * @see #getUserRestrictions()
335 */
336 public static final String DISALLOW_ADD_USER = "no_add_user";
337
338 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700339 * Specifies if a user is disallowed from disabling application
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400340 * verification. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700341 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800342 * <p>Key for user restrictions.
343 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700344 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
345 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400346 * @see #getUserRestrictions()
347 */
348 public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps";
349
350 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700351 * Specifies if a user is disallowed from configuring cell
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700352 * broadcasts. This can only be set by device owners and profile owners on the primary user.
353 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800354 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800355 * primary user can configure cell broadcasts.
Amith Yamasani26af8292014-09-09 09:57:27 -0700356 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800357 * <p>Key for user restrictions.
358 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700359 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
360 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400361 * @see #getUserRestrictions()
362 */
363 public static final String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
364
365 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700366 * Specifies if a user is disallowed from configuring mobile
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700367 * networks. This can only be set by device owners and profile owners on the primary user.
368 * The default value is <code>false</code>.
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800369 * <p>This restriction has no effect on secondary users and managed profiles since only the
Amith Yamasani150514b2015-01-07 16:05:05 -0800370 * primary user can configure mobile networks.
Amith Yamasani26af8292014-09-09 09:57:27 -0700371 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800372 * <p>Key for user restrictions.
373 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700374 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
375 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400376 * @see #getUserRestrictions()
377 */
378 public static final String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks";
379
380 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700381 * Specifies if a user is disallowed from modifying
Julia Reynoldsc617f812014-07-25 16:32:27 -0400382 * applications in Settings or launchers. The following actions will not be allowed when this
383 * restriction is enabled:
384 * <li>uninstalling apps</li>
385 * <li>disabling apps</li>
386 * <li>clearing app caches</li>
387 * <li>clearing app data</li>
388 * <li>force stopping apps</li>
389 * <li>clearing app defaults</li>
390 * <p>
391 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700392 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800393 * <p>Key for user restrictions.
394 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700395 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
396 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400397 * @see #getUserRestrictions()
398 */
Julia Reynolds36fbc8d2014-06-18 09:26:30 -0400399 public static final String DISALLOW_APPS_CONTROL = "no_control_apps";
Julia Reynoldsd46d0f92014-04-23 15:23:24 -0400400
Emily Bernier394a6cd2014-05-07 12:49:20 -0400401 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700402 * Specifies if a user is disallowed from mounting
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700403 * physical external media. This can only be set by device owners and profile owners on the
404 * primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700405 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800406 * <p>Key for user restrictions.
407 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700408 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
409 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400410 * @see #getUserRestrictions()
411 */
412 public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
413
414 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700415 * Specifies if a user is disallowed from adjusting microphone
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700416 * volume. If set, the microphone will be muted. This can only be set by device owners
417 * and profile owners on the primary user. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700418 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800419 * <p>Key for user restrictions.
420 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700421 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
422 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400423 * @see #getUserRestrictions()
424 */
425 public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
426
427 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700428 * Specifies if a user is disallowed from adjusting the master
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700429 * volume. If set, the master volume will be muted. This can only be set by device owners
430 * and profile owners on the primary user. The default value is <code>false</code>.
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)
Emily Bernier394a6cd2014-05-07 12:49:20 -0400436 * @see #getUserRestrictions()
437 */
438 public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume";
439
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700440 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700441 * Specifies that the user is not allowed to make outgoing
Amith Yamasani390989d2014-07-17 10:52:03 -0700442 * phone calls. Emergency calls are still permitted.
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700443 * The default value is <code>false</code>.
Tony Makeb83ab52016-02-22 18:36:08 +0000444 * <p>This restriction has no effect on managed profiles.
Amith Yamasani26af8292014-09-09 09:57:27 -0700445 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800446 * <p>Key for user restrictions.
447 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700448 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
449 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700450 * @see #getUserRestrictions()
451 */
Amith Yamasani390989d2014-07-17 10:52:03 -0700452 public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
453
454 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700455 * Specifies that the user is not allowed to send or receive
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700456 * SMS messages. The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700457 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800458 * <p>Key for user restrictions.
459 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700460 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
461 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani390989d2014-07-17 10:52:03 -0700462 * @see #getUserRestrictions()
463 */
464 public static final String DISALLOW_SMS = "no_sms";
Amith Yamasani9f6c25f2014-05-16 14:49:15 -0700465
Jason Monk1c7c3192014-06-26 12:52:18 -0400466 /**
Jeff Sharkey2cc03e52015-03-20 11:24:04 -0700467 * Specifies if the user is not allowed to have fun. In some cases, the
468 * device owner may wish to prevent the user from experiencing amusement or
469 * joy while using the device. The default value is <code>false</code>.
470 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800471 * <p>Key for user restrictions.
472 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700473 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
474 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Jeff Sharkey2cc03e52015-03-20 11:24:04 -0700475 * @see #getUserRestrictions()
476 */
477 public static final String DISALLOW_FUN = "no_fun";
478
479 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700480 * Specifies that windows besides app windows should not be
Jason Monk1c7c3192014-06-26 12:52:18 -0400481 * created. This will block the creation of the following types of windows.
482 * <li>{@link LayoutParams#TYPE_TOAST}</li>
483 * <li>{@link LayoutParams#TYPE_PHONE}</li>
484 * <li>{@link LayoutParams#TYPE_PRIORITY_PHONE}</li>
485 * <li>{@link LayoutParams#TYPE_SYSTEM_ALERT}</li>
486 * <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li>
487 * <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li>
488 *
Amith Yamasanic34dc7c2014-09-18 09:42:42 -0700489 * <p>This can only be set by device owners and profile owners on the primary user.
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)
Jason Monk1c7c3192014-06-26 12:52:18 -0400496 * @see #getUserRestrictions()
497 */
498 public static final String DISALLOW_CREATE_WINDOWS = "no_create_windows";
499
Nicolas Prevotf1939902014-06-25 09:29:02 +0100500 /**
Amith Yamasani26af8292014-09-09 09:57:27 -0700501 * Specifies if what is copied in the clipboard of this profile can
Nicolas Prevotf1939902014-06-25 09:29:02 +0100502 * be pasted in related profiles. Does not restrict if the clipboard of related profiles can be
503 * pasted in this profile.
504 * The default value is <code>false</code>.
Amith Yamasani26af8292014-09-09 09:57:27 -0700505 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800506 * <p>Key for user restrictions.
507 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700508 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
509 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Nicolas Prevotf1939902014-06-25 09:29:02 +0100510 * @see #getUserRestrictions()
511 */
512 public static final String DISALLOW_CROSS_PROFILE_COPY_PASTE = "no_cross_profile_copy_paste";
513
Amith Yamasani26af8292014-09-09 09:57:27 -0700514 /**
515 * Specifies if the user is not allowed to use NFC to beam out data from apps.
516 * The default value is <code>false</code>.
517 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800518 * <p>Key for user restrictions.
519 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700520 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
521 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Amith Yamasani26af8292014-09-09 09:57:27 -0700522 * @see #getUserRestrictions()
523 */
524 public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
525
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000526 /**
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100527 * Hidden user restriction to disallow access to wallpaper manager APIs. This restriction
528 * generally means that wallpapers are not supported for the particular user. This user
529 * restriction is always set for managed profiles, because such profiles don't have wallpapers.
Benjamin Franzf3ece362015-02-11 10:51:10 +0000530 * @hide
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100531 * @see #DISALLOW_SET_WALLPAPER
Makoto Onuki068c54a2015-10-13 14:34:03 -0700532 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
533 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Benjamin Franzf3ece362015-02-11 10:51:10 +0000534 * @see #getUserRestrictions()
535 */
536 public static final String DISALLOW_WALLPAPER = "no_wallpaper";
537
538 /**
Oleksandr Peletskyif2519812016-01-26 20:16:06 +0100539 * User restriction to disallow setting a wallpaper. Profile owner and device owner
540 * are able to set wallpaper regardless of this restriction.
541 * The default value is <code>false</code>.
542 *
543 * <p>Key for user restrictions.
544 * <p>Type: Boolean
545 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
546 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
547 * @see #getUserRestrictions()
548 */
549 public static final String DISALLOW_SET_WALLPAPER = "no_set_wallpaper";
550
551 /**
Benjamin Franzbff46ba2015-03-05 18:33:51 +0000552 * Specifies if the user is not allowed to reboot the device into safe boot mode.
553 * This can only be set by device owners and profile owners on the primary user.
554 * The default value is <code>false</code>.
555 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800556 * <p>Key for user restrictions.
557 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700558 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
559 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Benjamin Franzbff46ba2015-03-05 18:33:51 +0000560 * @see #getUserRestrictions()
561 */
562 public static final String DISALLOW_SAFE_BOOT = "no_safe_boot";
563
564 /**
Fyodor Kupolovb5013302015-04-17 17:59:14 -0700565 * Specifies if a user is not allowed to record audio. This restriction is always enabled for
566 * background users. The default value is <code>false</code>.
567 *
Makoto Onuki068c54a2015-10-13 14:34:03 -0700568 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
569 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Fyodor Kupolovb5013302015-04-17 17:59:14 -0700570 * @see #getUserRestrictions()
571 * @hide
572 */
573 public static final String DISALLOW_RECORD_AUDIO = "no_record_audio";
574
575 /**
Fyodor Kupolov9cbfc9e2015-10-07 15:52:33 -0700576 * Specifies if a user is not allowed to run in the background and should be stopped during
577 * user switch. The default value is <code>false</code>.
578 *
579 * <p>This restriction can be set by device owners and profile owners.
580 *
581 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
582 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
583 * @see #getUserRestrictions()
584 * @hide
585 */
586 public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
587
588 /**
Makoto Onuki759a7632015-10-28 16:43:10 -0700589 * Specifies if a user is not allowed to use the camera.
590 *
591 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
592 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
593 * @see #getUserRestrictions()
594 * @hide
595 */
596 public static final String DISALLOW_CAMERA = "no_camera";
597
598 /**
Tony Makc1205112016-07-22 16:02:59 +0100599 * Specifies if a user is not allowed to unmute the device's master volume.
600 *
601 * @see DevicePolicyManager#setMasterVolumeMuted(ComponentName, boolean)
602 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
603 * @see #getUserRestrictions()
604 * @hide
605 */
606 public static final String DISALLLOW_UNMUTE_DEVICE = "disallow_unmute_device";
607
608 /**
Mahaver Chopradea471e2015-12-17 11:02:37 +0000609 * Specifies if a user is not allowed to use cellular data when roaming. This can only be set by
610 * device owners. The default value is <code>false</code>.
611 *
612 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
613 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
614 * @see #getUserRestrictions()
615 */
616 public static final String DISALLOW_DATA_ROAMING = "no_data_roaming";
617
618 /**
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100619 * Specifies if a user is not allowed to change their icon. Device owner and profile owner
620 * can set this restriction. When it is set by device owner, only the target user will be
621 * affected. The default value is <code>false</code>.
622 *
623 * <p>Key for user restrictions.
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100624 * <p>Type: Boolean
Oleksandr Peletskyi7f1f1df2016-01-18 15:40:21 +0100625 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
626 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
627 * @see #getUserRestrictions()
628 */
629 public static final String DISALLOW_SET_USER_ICON = "no_set_user_icon";
630
631 /**
Mahaver Chopra3d9805d2016-07-07 16:25:05 +0100632 * Specifies if a user is not allowed to enable the oem unlock setting. The default value is
Esteban Talaverac48b20f2016-08-11 11:23:40 +0100633 * <code>false</code>. Setting this restriction has no effect if the bootloader is already
634 * unlocked.
Mahaver Chopra3d9805d2016-07-07 16:25:05 +0100635 *
636 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
637 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
638 * @see #getUserRestrictions()
639 * @hide
640 */
641 public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
642
643 /**
Nicolas Prevotf0029c12015-06-25 14:25:41 -0700644 * Allows apps in the parent profile to handle web links from the managed profile.
645 *
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700646 * This user restriction has an effect only in a managed profile.
647 * If set:
648 * Intent filters of activities in the parent profile with action
649 * {@link android.content.Intent#ACTION_VIEW},
650 * category {@link android.content.Intent#CATEGORY_BROWSABLE}, scheme http or https, and which
651 * define a host can handle intents from the managed profile.
652 * The default value is <code>false</code>.
653 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800654 * <p>Key for user restrictions.
655 * <p>Type: Boolean
Makoto Onuki068c54a2015-10-13 14:34:03 -0700656 * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
657 * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700658 * @see #getUserRestrictions()
659 */
Nicolas Prevotf0029c12015-06-25 14:25:41 -0700660 public static final String ALLOW_PARENT_PROFILE_APP_LINKING
661 = "allow_parent_profile_app_linking";
Nicolas Prevot9edbda12015-06-17 11:09:48 -0700662
663 /**
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000664 * Application restriction key that is used to indicate the pending arrival
665 * of real restrictions for the app.
666 *
667 * <p>
668 * Applications that support restrictions should check for the presence of this key.
669 * A <code>true</code> value indicates that restrictions may be applied in the near
670 * future but are not available yet. It is the responsibility of any
671 * management application that sets this flag to update it when the final
672 * restrictions are enforced.
673 *
Fyodor Kupolov0ffbfea2016-01-19 10:07:54 -0800674 * <p>Key for application restrictions.
675 * <p>Type: Boolean
Nicolas Prevotb14ed952015-01-13 14:23:53 +0000676 * @see android.app.admin.DevicePolicyManager#setApplicationRestrictions(
677 * android.content.ComponentName, String, Bundle)
678 * @see android.app.admin.DevicePolicyManager#getApplicationRestrictions(
679 * android.content.ComponentName, String)
Sander Alewijnse53d63dc2014-11-07 21:43:00 +0000680 */
681 public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
682
Amith Yamasani12747872015-12-07 14:19:49 -0800683 private static final String ACTION_CREATE_USER = "android.os.action.CREATE_USER";
684
685 /**
686 * Extra containing a name for the user being created. Optional parameter passed to
687 * ACTION_CREATE_USER activity.
688 * @hide
689 */
690 public static final String EXTRA_USER_NAME = "android.os.extra.USER_NAME";
691
692 /**
693 * Extra containing account name for the user being created. Optional parameter passed to
694 * ACTION_CREATE_USER activity.
695 * @hide
696 */
697 public static final String EXTRA_USER_ACCOUNT_NAME = "android.os.extra.USER_ACCOUNT_NAME";
698
699 /**
700 * Extra containing account type for the user being created. Optional parameter passed to
701 * ACTION_CREATE_USER activity.
702 * @hide
703 */
704 public static final String EXTRA_USER_ACCOUNT_TYPE = "android.os.extra.USER_ACCOUNT_TYPE";
705
706 /**
707 * Extra containing account-specific data for the user being created. Optional parameter passed
708 * to ACTION_CREATE_USER activity.
709 * @hide
710 */
711 public static final String EXTRA_USER_ACCOUNT_OPTIONS
712 = "android.os.extra.USER_ACCOUNT_OPTIONS";
713
Amith Yamasani655d0e22013-06-12 14:19:10 -0700714 /** @hide */
715 public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
716 /** @hide */
717 public static final int PIN_VERIFICATION_FAILED_NOT_SET = -2;
718 /** @hide */
719 public static final int PIN_VERIFICATION_SUCCESS = -1;
720
Amith Yamasani37ed8d12016-01-27 14:40:16 -0800721 /**
722 * Error result indicating that this user is not allowed to add other users on this device.
723 * This is a result code returned from the activity created by the intent
724 * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
725 */
726 public static final int USER_CREATION_FAILED_NOT_PERMITTED = Activity.RESULT_FIRST_USER;
727
728 /**
729 * Error result indicating that no more users can be created on this device.
730 * This is a result code returned from the activity created by the intent
731 * {@link #createUserCreationIntent(String, String, String, PersistableBundle)}.
732 */
733 public static final int USER_CREATION_FAILED_NO_MORE_USERS = Activity.RESULT_FIRST_USER + 1;
734
Amith Yamasani7e99bc02013-04-16 18:24:51 -0700735 /** @hide */
Amith Yamasanic0688302015-10-30 10:40:03 -0700736 public static UserManager get(Context context) {
737 return (UserManager) context.getSystemService(Context.USER_SERVICE);
Amith Yamasani27db4682013-03-30 17:07:47 -0700738 }
Maggie Benthalla12fccf2013-03-14 18:02:12 -0400739
Amith Yamasani258848d2012-08-10 17:06:33 -0700740 /** @hide */
741 public UserManager(Context context, IUserManager service) {
742 mService = service;
743 mContext = context;
744 }
745
746 /**
Amith Yamasani06964342016-04-15 13:55:01 -0700747 * Returns whether this device supports multiple users with their own login and customizable
748 * space.
749 * @return whether the device supports multiple users.
Amith Yamasani258848d2012-08-10 17:06:33 -0700750 */
Jeff Sharkey4673e7e2012-09-19 13:14:30 -0700751 public static boolean supportsMultipleUsers() {
Kenny Guy1a447532014-02-20 21:55:32 +0000752 return getMaxSupportedUsers() > 1
753 && SystemProperties.getBoolean("fw.show_multiuserui",
754 Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI));
Amith Yamasani258848d2012-08-10 17:06:33 -0700755 }
756
Maggie Benthall67944582013-02-22 14:58:27 -0500757 /**
Xiaohui Chen7cb69df2015-07-13 16:01:01 -0700758 * @hide
759 * @return Whether the device is running with split system user. It means the system user and
760 * primary user are two separate users. Previously system user and primary user are combined as
761 * a single owner user. see @link {android.os.UserHandle#USER_OWNER}
762 */
763 public static boolean isSplitSystemUser() {
764 return SystemProperties.getBoolean("ro.fw.system_user_split", false);
765 }
766
767 /**
Fyodor Kupolov523c4042016-02-24 15:03:13 -0800768 * Returns whether switching users is currently allowed.
769 * <p>For instance switching users is not allowed if the current user is in a phone call,
770 * or system user hasn't been unlocked yet
771 * @hide
772 */
773 public boolean canSwitchUsers() {
774 boolean allowUserSwitchingWhenSystemUserLocked = Settings.Global.getInt(
775 mContext.getContentResolver(),
776 Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0;
777 boolean isSystemUserUnlocked = isUserUnlocked(UserHandle.SYSTEM);
778 boolean inCall = TelephonyManager.getDefault().getCallState()
779 != TelephonyManager.CALL_STATE_IDLE;
780 return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall;
781 }
782
783 /**
Amith Yamasani5760e172015-04-17 18:42:41 -0700784 * Returns the user handle for the user that this process is running under.
Jessica Hummelbe81c802014-04-22 15:49:22 +0100785 *
Amith Yamasani5760e172015-04-17 18:42:41 -0700786 * @return the user handle of this process.
Amith Yamasani258848d2012-08-10 17:06:33 -0700787 * @hide
Maggie Benthall67944582013-02-22 14:58:27 -0500788 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700789 public @UserIdInt int getUserHandle() {
Dianne Hackborn79af1dd2012-08-16 16:42:52 -0700790 return UserHandle.myUserId();
Amith Yamasani258848d2012-08-10 17:06:33 -0700791 }
792
793 /**
Dianne Hackborn8832c182012-09-17 17:20:24 -0700794 * Returns the user name of the user making this call. This call is only
795 * available to applications on the system image; it requires the
796 * MANAGE_USERS permission.
Amith Yamasani258848d2012-08-10 17:06:33 -0700797 * @return the user name
798 */
799 public String getUserName() {
800 try {
801 return mService.getUserInfo(getUserHandle()).name;
802 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700803 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -0700804 }
805 }
806
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700807 /**
Dan Morrille4ab16a2012-09-20 20:25:55 -0700808 * Used to determine whether the user making this call is subject to
809 * teleportations.
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700810 *
Dianne Hackborn955d8d62014-10-07 20:17:19 -0700811 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
Dianne Hackborn67a101a2014-10-02 12:42:18 -0700812 * now automatically identify goats using advanced goat recognition technology.</p>
813 *
814 * @return Returns true if the user making this call is a goat.
Dan Morrille4ab16a2012-09-20 20:25:55 -0700815 */
816 public boolean isUserAGoat() {
Adam Powell988ae302014-09-17 17:58:33 -0700817 return mContext.getPackageManager()
818 .isPackageAvailable("com.coffeestainstudios.goatsimulator");
Dan Morrille4ab16a2012-09-20 20:25:55 -0700819 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800820
821 /**
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700822 * Used to check if this process is running under the primary user. The primary user
823 * is the first human user on a device.
824 *
825 * @return whether this process is running under the primary user.
826 * @hide
827 */
828 public boolean isPrimaryUser() {
829 UserInfo user = getUserInfo(UserHandle.myUserId());
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700830 return user != null && user.isPrimary();
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700831 }
832
833 /**
Amith Yamasani5760e172015-04-17 18:42:41 -0700834 * Used to check if this process is running under the system user. The system user
835 * is the initial user that is implicitly created on first boot and hosts most of the
836 * system services.
837 *
838 * @return whether this process is running under the system user.
839 */
840 public boolean isSystemUser() {
Xiaohui Chen70f6c382015-04-28 14:21:43 -0700841 return UserHandle.myUserId() == UserHandle.USER_SYSTEM;
Amith Yamasani5760e172015-04-17 18:42:41 -0700842 }
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700843
Amith Yamasani5760e172015-04-17 18:42:41 -0700844 /**
Amith Yamasani462ac3a2015-06-30 14:21:01 -0700845 * @hide
846 * Returns whether the caller is running as an admin user. There can be more than one admin
847 * user.
848 */
849 public boolean isAdminUser() {
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700850 return isUserAdmin(UserHandle.myUserId());
851 }
852
853 /**
854 * @hide
855 * Returns whether the provided user is an admin user. There can be more than one admin
856 * user.
857 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700858 public boolean isUserAdmin(@UserIdInt int userId) {
Xiaohui Chen2b45f8a2015-08-04 15:12:23 -0700859 UserInfo user = getUserInfo(userId);
860 return user != null && user.isAdmin();
Amith Yamasani462ac3a2015-06-30 14:21:01 -0700861 }
862
863 /**
Amith Yamasanie1375902013-04-13 16:48:35 -0700864 * 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 -0700865 * a reduced number of available apps, app restrictions and account restrictions.
Amith Yamasanie1375902013-04-13 16:48:35 -0700866 * @return whether the user making this call is a linked user
Amith Yamasani2555daf2013-04-25 13:39:27 -0700867 * @hide
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800868 */
Amith Yamasanie1375902013-04-13 16:48:35 -0700869 public boolean isLinkedUser() {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800870 try {
Amith Yamasani71e6c692013-03-24 17:39:28 -0700871 return mService.isRestricted();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800872 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700873 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -0800874 }
875 }
876
Amith Yamasani258848d2012-08-10 17:06:33 -0700877 /**
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700878 * Checks if specified user can have restricted profile.
879 * @hide
880 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700881 public boolean canHaveRestrictedProfile(@UserIdInt int userId) {
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700882 try {
883 return mService.canHaveRestrictedProfile(userId);
884 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700885 throw re.rethrowFromSystemServer();
Fyodor Kupolov1c363152015-09-02 13:27:21 -0700886 }
887 }
888
889 /**
Amith Yamasani1e9c2182014-06-11 17:25:51 -0700890 * Checks if the calling app is running as a guest user.
891 * @return whether the caller is a guest user.
892 * @hide
893 */
894 public boolean isGuestUser() {
895 UserInfo user = getUserInfo(UserHandle.myUserId());
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700896 return user != null && user.isGuest();
897 }
898
899 /**
Amith Yamasani1c41dc82016-06-28 16:13:15 -0700900 * Checks if the calling app is running in a demo user. When running in a demo user,
901 * apps can be more helpful to the user, or explain their features in more detail.
902 *
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700903 * @return whether the caller is a demo user.
Amith Yamasanid35a89c2016-05-26 16:58:43 -0700904 */
905 public boolean isDemoUser() {
Amith Yamasani1c41dc82016-06-28 16:13:15 -0700906 try {
907 return mService.isDemoUser(UserHandle.myUserId());
908 } catch (RemoteException re) {
909 throw re.rethrowFromSystemServer();
910 }
Amith Yamasani1e9c2182014-06-11 17:25:51 -0700911 }
912
913 /**
Amith Yamasani0e8d7d62014-09-03 13:17:28 -0700914 * Checks if the calling app is running in a managed profile.
915 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
916 *
917 * @return whether the caller is in a managed profile.
918 * @hide
919 */
920 @SystemApi
921 public boolean isManagedProfile() {
Tony Mak8673b282016-03-21 21:10:59 +0000922 try {
923 return mService.isManagedProfile(UserHandle.myUserId());
924 } catch (RemoteException re) {
925 throw re.rethrowFromSystemServer();
926 }
927 }
928
929 /**
930 * Checks if the specified user is a managed profile.
931 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission, otherwise the caller
932 * must be in the same profile group of specified user.
933 *
934 * @return whether the specified user is a managed profile.
935 * @hide
936 */
937 @SystemApi
938 public boolean isManagedProfile(@UserIdInt int userId) {
939 try {
940 return mService.isManagedProfile(userId);
941 } catch (RemoteException re) {
942 throw re.rethrowFromSystemServer();
943 }
Amith Yamasani0e8d7d62014-09-03 13:17:28 -0700944 }
945
946 /**
Lenka Trochtovac4dd0212015-11-18 12:22:06 +0100947 * Checks if the calling app is running as an ephemeral user.
948 *
949 * @return whether the caller is an ephemeral user.
950 * @hide
951 */
952 public boolean isEphemeralUser() {
953 return isUserEphemeral(UserHandle.myUserId());
954 }
955
956 /**
957 * Returns whether the specified user is ephemeral.
958 * @hide
959 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -0700960 public boolean isUserEphemeral(@UserIdInt int userId) {
Lenka Trochtovac4dd0212015-11-18 12:22:06 +0100961 final UserInfo user = getUserInfo(userId);
962 return user != null && user.isEphemeral();
963 }
964
965 /**
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700966 * Return whether the given user is actively running. This means that
967 * the user is in the "started" state, not "stopped" -- it is currently
968 * allowed to run code through scheduled alarms, receiving broadcasts,
969 * etc. A started user may be either the current foreground user or a
970 * background user; the result here does not distinguish between the two.
971 * @param user The user to retrieve the running state for.
972 */
973 public boolean isUserRunning(UserHandle user) {
Jeff Sharkey0e62384c2016-01-13 18:52:55 -0700974 return isUserRunning(user.getIdentifier());
975 }
976
977 /** {@hide} */
978 public boolean isUserRunning(int userId) {
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700979 try {
Fyodor Kupolov7a1e6822016-12-05 13:23:28 -0800980 return mService.isUserRunning(userId);
Jeff Sharkey27b2e692016-02-25 17:40:12 -0700981 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700982 throw re.rethrowFromSystemServer();
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700983 }
984 }
985
986 /**
987 * Return whether the given user is actively running <em>or</em> stopping.
988 * This is like {@link #isUserRunning(UserHandle)}, but will also return
989 * true if the user had been running but is in the process of being stopped
990 * (but is not yet fully stopped, and still running some code).
991 * @param user The user to retrieve the running state for.
992 */
993 public boolean isUserRunningOrStopping(UserHandle user) {
994 try {
Jeff Sharkeye17ac152015-11-06 22:40:29 -0800995 // TODO: reconcile stopped vs stopping?
Dianne Hackborna8a9bd62012-10-09 15:36:59 -0700996 return ActivityManagerNative.getDefault().isUserRunning(
Jeff Sharkeye17ac152015-11-06 22:40:29 -0800997 user.getIdentifier(), ActivityManager.FLAG_OR_STOPPED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -0700998 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700999 throw re.rethrowFromSystemServer();
Dianne Hackborna8a9bd62012-10-09 15:36:59 -07001000 }
1001 }
1002
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001003 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001004 @Deprecated
Jeff Sharkeye13529a2015-12-09 14:15:27 -07001005 public boolean isUserRunningAndLocked() {
1006 return isUserRunningAndLocked(Process.myUserHandle());
1007 }
1008
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001009 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001010 @Deprecated
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001011 public boolean isUserRunningAndLocked(UserHandle user) {
1012 try {
1013 return ActivityManagerNative.getDefault().isUserRunning(
1014 user.getIdentifier(), ActivityManager.FLAG_AND_LOCKED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001015 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001016 throw re.rethrowFromSystemServer();
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001017 }
1018 }
1019
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001020 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001021 @Deprecated
Jeff Sharkeye13529a2015-12-09 14:15:27 -07001022 public boolean isUserRunningAndUnlocked() {
1023 return isUserRunningAndUnlocked(Process.myUserHandle());
1024 }
1025
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001026 /** @removed */
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001027 @Deprecated
Jeff Sharkey9d8a1042015-12-03 17:56:20 -07001028 public boolean isUserRunningAndUnlocked(UserHandle user) {
Jeff Sharkey0825ab22015-12-02 13:04:49 -07001029 try {
1030 return ActivityManagerNative.getDefault().isUserRunning(
1031 user.getIdentifier(), ActivityManager.FLAG_AND_UNLOCKED);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001032 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001033 throw re.rethrowFromSystemServer();
Jeff Sharkey0825ab22015-12-02 13:04:49 -07001034 }
1035 }
1036
1037 /**
Jeff Sharkeycf3f0a12016-03-17 19:57:58 -06001038 * Return whether the calling user is running in an "unlocked" state.
1039 * <p>
1040 * On devices with direct boot, a user is unlocked only after they've
1041 * entered their credentials (such as a lock pattern or PIN). On devices
1042 * without direct boot, a user is unlocked as soon as it starts.
1043 * <p>
1044 * When a user is locked, only device-protected data storage is available.
1045 * When a user is unlocked, both device-protected and credential-protected
1046 * private app data storage is available.
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001047 *
1048 * @see Intent#ACTION_USER_UNLOCKED
1049 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001050 */
1051 public boolean isUserUnlocked() {
1052 return isUserUnlocked(Process.myUserHandle());
1053 }
1054
1055 /**
Jeff Sharkeycf3f0a12016-03-17 19:57:58 -06001056 * Return whether the given user is running in an "unlocked" state.
1057 * <p>
1058 * On devices with direct boot, a user is unlocked only after they've
1059 * entered their credentials (such as a lock pattern or PIN). On devices
1060 * without direct boot, a user is unlocked as soon as it starts.
1061 * <p>
1062 * When a user is locked, only device-protected data storage is available.
1063 * When a user is unlocked, both device-protected and credential-protected
1064 * private app data storage is available.
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001065 *
1066 * @param user to retrieve the unlocked state for.
Jeff Sharkey8a372a02016-03-16 16:25:45 -06001067 * @see Intent#ACTION_USER_UNLOCKED
1068 * @see Context#createDeviceProtectedStorageContext()
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001069 */
1070 public boolean isUserUnlocked(UserHandle user) {
Jeff Sharkey0999c0d2015-12-17 15:12:22 -07001071 return isUserUnlocked(user.getIdentifier());
1072 }
1073
1074 /** {@hide} */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001075 public boolean isUserUnlocked(@UserIdInt int userId) {
Jeff Sharkeyce18c812016-04-27 16:00:41 -06001076 try {
Fyodor Kupolov7a1e6822016-12-05 13:23:28 -08001077 return mService.isUserUnlocked(userId);
Jeff Sharkeyce18c812016-04-27 16:00:41 -06001078 } catch (RemoteException re) {
1079 throw re.rethrowFromSystemServer();
1080 }
1081 }
1082
1083 /** {@hide} */
1084 public boolean isUserUnlockingOrUnlocked(UserHandle user) {
1085 return isUserUnlockingOrUnlocked(user.getIdentifier());
1086 }
1087
1088 /** {@hide} */
1089 public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) {
1090 try {
Fyodor Kupolov7a1e6822016-12-05 13:23:28 -08001091 return mService.isUserUnlockingOrUnlocked(userId);
Jeff Sharkeyce18c812016-04-27 16:00:41 -06001092 } catch (RemoteException re) {
1093 throw re.rethrowFromSystemServer();
1094 }
Jeff Sharkeyb6423872015-12-11 11:11:58 -07001095 }
1096
1097 /**
Amith Yamasani258848d2012-08-10 17:06:33 -07001098 * Returns the UserInfo object describing a specific user.
Tony Mak8673b282016-03-21 21:10:59 +00001099 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001100 * @param userHandle the user handle of the user whose information is being requested.
1101 * @return the UserInfo object for a specific user.
1102 * @hide
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001103 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001104 public UserInfo getUserInfo(@UserIdInt int userHandle) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001105 try {
1106 return mService.getUserInfo(userHandle);
1107 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001108 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001109 }
1110 }
1111
Amith Yamasani71e6c692013-03-24 17:39:28 -07001112 /**
Zoltan Szatmary-Bane7834602016-04-08 18:41:11 +01001113 * @hide
1114 *
1115 * Returns who set a user restriction on a user.
1116 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1117 * @param restrictionKey the string key representing the restriction
1118 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1119 * @return The source of user restriction. Any combination of {@link #RESTRICTION_NOT_SET},
1120 * {@link #RESTRICTION_SOURCE_SYSTEM}, {@link #RESTRICTION_SOURCE_DEVICE_OWNER}
1121 * and {@link #RESTRICTION_SOURCE_PROFILE_OWNER}
1122 */
1123 @SystemApi
1124 @UserRestrictionSource
1125 public int getUserRestrictionSource(String restrictionKey, UserHandle userHandle) {
1126 try {
1127 return mService.getUserRestrictionSource(restrictionKey, userHandle.getIdentifier());
1128 } catch (RemoteException re) {
1129 throw re.rethrowFromSystemServer();
1130 }
1131 }
1132
1133 /**
Amith Yamasani71e6c692013-03-24 17:39:28 -07001134 * Returns the user-wide restrictions imposed on this user.
1135 * @return a Bundle containing all the restrictions.
1136 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001137 public Bundle getUserRestrictions() {
1138 return getUserRestrictions(Process.myUserHandle());
1139 }
1140
Amith Yamasani71e6c692013-03-24 17:39:28 -07001141 /**
1142 * Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
1143 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1144 * @return a Bundle containing all the restrictions.
1145 */
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001146 public Bundle getUserRestrictions(UserHandle userHandle) {
1147 try {
1148 return mService.getUserRestrictions(userHandle.getIdentifier());
1149 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001150 throw re.rethrowFromSystemServer();
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001151 }
1152 }
1153
Zoltan Szatmary-Ban3bbcedd2015-11-26 13:45:51 +00001154 /**
1155 * @hide
1156 * Returns whether the given user has been disallowed from performing certain actions
1157 * or setting certain settings through UserManager. This method disregards restrictions
1158 * set by device policy.
1159 * @param restrictionKey the string key representing the restriction
1160 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1161 */
1162 public boolean hasBaseUserRestriction(String restrictionKey, UserHandle userHandle) {
1163 try {
1164 return mService.hasBaseUserRestriction(restrictionKey, userHandle.getIdentifier());
1165 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001166 throw re.rethrowFromSystemServer();
Zoltan Szatmary-Ban3bbcedd2015-11-26 13:45:51 +00001167 }
1168 }
1169
Amith Yamasani71e6c692013-03-24 17:39:28 -07001170 /**
Makoto Onukia3c12502015-10-28 10:18:32 -07001171 * This will no longer work. Device owners and profile owners should use
1172 * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001173 */
Makoto Onukia3c12502015-10-28 10:18:32 -07001174 // System apps should use UserManager.setUserRestriction() instead.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001175 @Deprecated
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001176 public void setUserRestrictions(Bundle restrictions) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001177 throw new UnsupportedOperationException("This method is no longer supported");
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001178 }
1179
Amith Yamasani71e6c692013-03-24 17:39:28 -07001180 /**
Makoto Onukia3c12502015-10-28 10:18:32 -07001181 * This will no longer work. Device owners and profile owners should use
1182 * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001183 */
Makoto Onukia3c12502015-10-28 10:18:32 -07001184 // System apps should use UserManager.setUserRestriction() instead.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001185 @Deprecated
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001186 public void setUserRestrictions(Bundle restrictions, UserHandle userHandle) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001187 throw new UnsupportedOperationException("This method is no longer supported");
Amith Yamasanie4cf7342012-12-17 11:12:09 -08001188 }
1189
Amith Yamasani71e6c692013-03-24 17:39:28 -07001190 /**
1191 * Sets the value of a specific restriction.
Amith Yamasanibe465322014-04-24 13:45:17 -07001192 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001193 * @param key the key of the restriction
1194 * @param value the value for the restriction
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001195 * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1196 * android.content.ComponentName, String)} or
1197 * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1198 * android.content.ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001199 */
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001200 @Deprecated
Amith Yamasani71e6c692013-03-24 17:39:28 -07001201 public void setUserRestriction(String key, boolean value) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001202 setUserRestriction(key, value, Process.myUserHandle());
Amith Yamasani71e6c692013-03-24 17:39:28 -07001203 }
1204
1205 /**
1206 * @hide
1207 * Sets the value of a specific restriction on a specific user.
Amith Yamasanibe465322014-04-24 13:45:17 -07001208 * Requires the MANAGE_USERS permission.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001209 * @param key the key of the restriction
1210 * @param value the value for the restriction
1211 * @param userHandle the user whose restriction is to be changed.
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001212 * @deprecated use {@link android.app.admin.DevicePolicyManager#addUserRestriction(
1213 * android.content.ComponentName, String)} or
1214 * {@link android.app.admin.DevicePolicyManager#clearUserRestriction(
1215 * android.content.ComponentName, String)} instead.
Amith Yamasani71e6c692013-03-24 17:39:28 -07001216 */
Julia Reynolds3d9eb782014-08-11 16:40:08 -04001217 @Deprecated
Maggie Benthall67944582013-02-22 14:58:27 -05001218 public void setUserRestriction(String key, boolean value, UserHandle userHandle) {
Fyodor Kupolovb5013302015-04-17 17:59:14 -07001219 try {
1220 mService.setUserRestriction(key, value, userHandle.getIdentifier());
1221 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001222 throw re.rethrowFromSystemServer();
Fyodor Kupolovb5013302015-04-17 17:59:14 -07001223 }
Maggie Benthall67944582013-02-22 14:58:27 -05001224 }
1225
Amith Yamasani258848d2012-08-10 17:06:33 -07001226 /**
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001227 * Returns whether the current user has been disallowed from performing certain actions
1228 * or setting certain settings.
Julia Reynolds2b2cf722014-06-06 11:41:04 -04001229 *
1230 * @param restrictionKey The string key representing the restriction.
1231 * @return {@code true} if the current user has the given restriction, {@code false} otherwise.
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001232 */
1233 public boolean hasUserRestriction(String restrictionKey) {
David Christieb12ba932013-09-03 17:15:28 -07001234 return hasUserRestriction(restrictionKey, Process.myUserHandle());
1235 }
1236
1237 /**
1238 * @hide
1239 * Returns whether the given user has been disallowed from performing certain actions
1240 * or setting certain settings.
1241 * @param restrictionKey the string key representing the restriction
1242 * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
1243 */
1244 public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
Amith Yamasani8cd28b52014-06-08 17:54:27 -07001245 try {
1246 return mService.hasUserRestriction(restrictionKey,
1247 userHandle.getIdentifier());
1248 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001249 throw re.rethrowFromSystemServer();
Amith Yamasani8cd28b52014-06-08 17:54:27 -07001250 }
Maggie Benthalla12fccf2013-03-14 18:02:12 -04001251 }
1252
1253 /**
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001254 * Return the serial number for a user. This is a device-unique
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001255 * number assigned to that user; if the user is deleted and then a new
1256 * user created, the new users will not be given the same serial number.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001257 * @param user The user whose serial number is to be retrieved.
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001258 * @return The serial number of the given user; returns -1 if the
1259 * given UserHandle does not exist.
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001260 * @see #getUserForSerialNumber(long)
1261 */
1262 public long getSerialNumberForUser(UserHandle user) {
1263 return getUserSerialNumber(user.getIdentifier());
1264 }
1265
1266 /**
1267 * Return the user associated with a serial number previously
1268 * returned by {@link #getSerialNumberForUser(UserHandle)}.
1269 * @param serialNumber The serial number of the user that is being
1270 * retrieved.
1271 * @return Return the user associated with the serial number, or null
1272 * if there is not one.
1273 * @see #getSerialNumberForUser(UserHandle)
1274 */
1275 public UserHandle getUserForSerialNumber(long serialNumber) {
Fyodor Kupolovef249092015-05-06 13:18:46 -07001276 int ident = getUserHandle((int) serialNumber);
Dianne Hackborn33f9cb82012-10-04 17:15:10 -07001277 return ident >= 0 ? new UserHandle(ident) : null;
1278 }
1279
1280 /**
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001281 * Creates a user with the specified name and options. For non-admin users, default user
1282 * restrictions are going to be applied.
Amith Yamasani195263742012-08-21 15:40:12 -07001283 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001284 *
1285 * @param name the user's name
1286 * @param flags flags that identify the type of user and other properties.
1287 * @see UserInfo
1288 *
1289 * @return the UserInfo object for the created user, or null if the user could not be created.
1290 * @hide
1291 */
1292 public UserInfo createUser(String name, int flags) {
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001293 UserInfo user = null;
Amith Yamasani258848d2012-08-10 17:06:33 -07001294 try {
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001295 user = mService.createUser(name, flags);
phweisse9c44062016-02-10 12:57:38 +01001296 // TODO: Keep this in sync with
1297 // UserManagerService.LocalService.createUserEvenWhenDisallowed
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001298 if (user != null && !user.isAdmin()) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001299 mService.setUserRestriction(DISALLOW_SMS, true, user.id);
1300 mService.setUserRestriction(DISALLOW_OUTGOING_CALLS, true, user.id);
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001301 }
Amith Yamasani258848d2012-08-10 17:06:33 -07001302 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001303 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001304 }
Xiaohui Chencfe64c82015-07-16 14:30:50 -07001305 return user;
Amith Yamasani258848d2012-08-10 17:06:33 -07001306 }
1307
1308 /**
Amith Yamasani1e9c2182014-06-11 17:25:51 -07001309 * Creates a guest user and configures it.
1310 * @param context an application context
1311 * @param name the name to set for the user
1312 * @hide
1313 */
1314 public UserInfo createGuest(Context context, String name) {
Makoto Onuki068c54a2015-10-13 14:34:03 -07001315 UserInfo guest = null;
1316 try {
1317 guest = mService.createUser(name, UserInfo.FLAG_GUEST);
1318 if (guest != null) {
1319 Settings.Secure.putStringForUser(context.getContentResolver(),
1320 Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
Amith Yamasanibf3a9462014-07-28 14:26:42 -07001321 }
Makoto Onuki068c54a2015-10-13 14:34:03 -07001322 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001323 throw re.rethrowFromSystemServer();
Amith Yamasani1e9c2182014-06-11 17:25:51 -07001324 }
1325 return guest;
1326 }
1327
Amith Yamasaniaa6634e2014-10-06 14:20:28 -07001328 /**
Kenny Guy2a764942014-04-02 13:29:20 +01001329 * Creates a user with the specified name and options as a profile of another user.
Kenny Guya52dc3e2014-02-11 15:33:14 +00001330 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1331 *
1332 * @param name the user's name
1333 * @param flags flags that identify the type of user and other properties.
1334 * @see UserInfo
Kenny Guy2a764942014-04-02 13:29:20 +01001335 * @param userHandle new user will be a profile of this use.
Kenny Guya52dc3e2014-02-11 15:33:14 +00001336 *
1337 * @return the UserInfo object for the created user, or null if the user could not be created.
1338 * @hide
1339 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001340 public UserInfo createProfileForUser(String name, int flags, @UserIdInt int userHandle) {
Kenny Guya52dc3e2014-02-11 15:33:14 +00001341 try {
Kenny Guy2a764942014-04-02 13:29:20 +01001342 return mService.createProfileForUser(name, flags, userHandle);
Kenny Guya52dc3e2014-02-11 15:33:14 +00001343 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001344 throw re.rethrowFromSystemServer();
Kenny Guya52dc3e2014-02-11 15:33:14 +00001345 }
1346 }
1347
1348 /**
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001349 * Creates a restricted profile with the specified name. This method also sets necessary
1350 * restrictions and adds shared accounts.
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001351 *
1352 * @param name profile's name
1353 * @return UserInfo object for the created user, or null if the user could not be created.
1354 * @hide
1355 */
1356 public UserInfo createRestrictedProfile(String name) {
1357 try {
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001358 UserHandle parentUserHandle = Process.myUserHandle();
1359 UserInfo user = mService.createRestrictedProfile(name,
1360 parentUserHandle.getIdentifier());
1361 if (user != null) {
1362 AccountManager.get(mContext).addSharedAccountsFromParentUser(parentUserHandle,
1363 UserHandle.of(user.id));
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001364 }
Fyodor Kupolov02cb6e72015-09-18 18:20:55 -07001365 return user;
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001366 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001367 throw re.rethrowFromSystemServer();
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001368 }
Fyodor Kupolov06a484a2015-08-21 16:33:20 -07001369 }
1370
1371 /**
Amith Yamasani06964342016-04-15 13:55:01 -07001372 * Returns an intent to create a user for the provided name and account name. The name
1373 * and account name will be used when the setup process for the new user is started.
1374 * <p>
Amith Yamasani12747872015-12-07 14:19:49 -08001375 * The intent should be launched using startActivityForResult and the return result will
Amith Yamasani37ed8d12016-01-27 14:40:16 -08001376 * indicate if the user consented to adding a new user and if the operation succeeded. Any
1377 * errors in creating the user will be returned in the result code. If the user cancels the
1378 * request, the return result will be {@link Activity#RESULT_CANCELED}. On success, the
1379 * result code will be {@link Activity#RESULT_OK}.
Amith Yamasani06964342016-04-15 13:55:01 -07001380 * <p>
1381 * Use {@link #supportsMultipleUsers()} to first check if the device supports this operation
1382 * at all.
1383 * <p>
Amith Yamasani12747872015-12-07 14:19:49 -08001384 * The new user is created but not initialized. After switching into the user for the first
1385 * time, the preferred user name and account information are used by the setup process for that
1386 * user.
1387 *
1388 * @param userName Optional name to assign to the user.
Amith Yamasani06964342016-04-15 13:55:01 -07001389 * @param accountName Optional account name that will be used by the setup wizard to initialize
Amith Yamasani12747872015-12-07 14:19:49 -08001390 * the user.
1391 * @param accountType Optional account type for the account to be created. This is required
1392 * if the account name is specified.
1393 * @param accountOptions Optional bundle of data to be passed in during account creation in the
1394 * new user via {@link AccountManager#addAccount(String, String, String[],
1395 * Bundle, android.app.Activity, android.accounts.AccountManagerCallback,
1396 * Handler)}.
Amith Yamasani06964342016-04-15 13:55:01 -07001397 * @return An Intent that can be launched from an Activity.
Amith Yamasani37ed8d12016-01-27 14:40:16 -08001398 * @see #USER_CREATION_FAILED_NOT_PERMITTED
1399 * @see #USER_CREATION_FAILED_NO_MORE_USERS
Amith Yamasani06964342016-04-15 13:55:01 -07001400 * @see #supportsMultipleUsers
Amith Yamasani12747872015-12-07 14:19:49 -08001401 */
1402 public static Intent createUserCreationIntent(@Nullable String userName,
1403 @Nullable String accountName,
1404 @Nullable String accountType, @Nullable PersistableBundle accountOptions) {
Amith Yamasani12747872015-12-07 14:19:49 -08001405 Intent intent = new Intent(ACTION_CREATE_USER);
1406 if (userName != null) {
1407 intent.putExtra(EXTRA_USER_NAME, userName);
1408 }
1409 if (accountName != null && accountType == null) {
1410 throw new IllegalArgumentException("accountType must be specified if accountName is "
1411 + "specified");
1412 }
1413 if (accountName != null) {
1414 intent.putExtra(EXTRA_USER_ACCOUNT_NAME, accountName);
1415 }
1416 if (accountType != null) {
1417 intent.putExtra(EXTRA_USER_ACCOUNT_TYPE, accountType);
1418 }
1419 if (accountOptions != null) {
1420 intent.putExtra(EXTRA_USER_ACCOUNT_OPTIONS, accountOptions);
1421 }
1422 return intent;
1423 }
1424
1425 /**
1426 * @hide
1427 *
1428 * Returns the preferred account name for user creation. Requires MANAGE_USERS permission.
1429 */
1430 @SystemApi
1431 public String getSeedAccountName() {
1432 try {
1433 return mService.getSeedAccountName();
1434 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001435 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001436 }
1437 }
1438
1439 /**
1440 * @hide
1441 *
1442 * Returns the preferred account type for user creation. Requires MANAGE_USERS permission.
1443 */
1444 @SystemApi
1445 public String getSeedAccountType() {
1446 try {
1447 return mService.getSeedAccountType();
1448 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001449 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001450 }
1451 }
1452
1453 /**
1454 * @hide
1455 *
1456 * Returns the preferred account's options bundle for user creation. Requires MANAGE_USERS
1457 * permission.
1458 * @return Any options set by the requestor that created the user.
1459 */
1460 @SystemApi
1461 public PersistableBundle getSeedAccountOptions() {
1462 try {
1463 return mService.getSeedAccountOptions();
1464 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001465 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001466 }
1467 }
1468
1469 /**
1470 * @hide
1471 *
1472 * Called by a system activity to set the seed account information of a user created
1473 * through the user creation intent.
1474 * @param userId
1475 * @param accountName
1476 * @param accountType
1477 * @param accountOptions
1478 * @see #createUserCreationIntent(String, String, String, PersistableBundle)
1479 */
1480 public void setSeedAccountData(int userId, String accountName, String accountType,
1481 PersistableBundle accountOptions) {
1482 try {
1483 mService.setSeedAccountData(userId, accountName, accountType, accountOptions,
1484 /* persist= */ true);
1485 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001486 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001487 }
1488 }
1489
1490 /**
1491 * @hide
1492 * Clears the seed information used to create this user. Requires MANAGE_USERS permission.
1493 */
1494 @SystemApi
1495 public void clearSeedAccountData() {
1496 try {
1497 mService.clearSeedAccountData();
1498 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001499 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08001500 }
1501 }
1502
1503 /**
Amith Yamasani1df14732014-08-29 21:37:27 -07001504 * @hide
1505 * Marks the guest user for deletion to allow a new guest to be created before deleting
1506 * the current user who is a guest.
1507 * @param userHandle
1508 * @return
1509 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001510 public boolean markGuestForDeletion(@UserIdInt int userHandle) {
Amith Yamasani1df14732014-08-29 21:37:27 -07001511 try {
1512 return mService.markGuestForDeletion(userHandle);
1513 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001514 throw re.rethrowFromSystemServer();
Amith Yamasani1df14732014-08-29 21:37:27 -07001515 }
1516 }
1517
1518 /**
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001519 * Sets the user as enabled, if such an user exists.
Lenka Trochtova1ddda472016-02-12 10:42:12 +01001520 *
1521 * <p>Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1522 *
1523 * <p>Note that the default is true, it's only that managed profiles might not be enabled.
1524 * Also ephemeral users can be disabled to indicate that their removal is in progress and they
1525 * shouldn't be re-entered. Therefore ephemeral users should not be re-enabled once disabled.
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001526 *
1527 * @param userHandle the id of the profile to enable
1528 * @hide
1529 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001530 public void setUserEnabled(@UserIdInt int userHandle) {
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001531 try {
1532 mService.setUserEnabled(userHandle);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001533 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001534 throw re.rethrowFromSystemServer();
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01001535 }
1536 }
1537
1538 /**
Dianne Hackbornb26306a2012-10-24 15:22:21 -07001539 * Return the number of users currently created on the device.
1540 */
1541 public int getUserCount() {
1542 List<UserInfo> users = getUsers();
1543 return users != null ? users.size() : 1;
1544 }
1545
1546 /**
Amith Yamasanid04aaa32016-06-13 12:09:36 -07001547 * Returns information for all users on this device, including ones marked for deletion.
1548 * To retrieve only users that are alive, use {@link #getUsers(boolean)}.
1549 * <p>
Amith Yamasani195263742012-08-21 15:40:12 -07001550 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001551 * @return the list of users that exist on the device.
Amith Yamasani258848d2012-08-10 17:06:33 -07001552 * @hide
1553 */
1554 public List<UserInfo> getUsers() {
1555 try {
Amith Yamasani920ace02012-09-20 22:15:37 -07001556 return mService.getUsers(false);
1557 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001558 throw re.rethrowFromSystemServer();
Amith Yamasani920ace02012-09-20 22:15:37 -07001559 }
1560 }
1561
1562 /**
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001563 * Returns serial numbers of all users on this device.
1564 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1565 *
1566 * @param excludeDying specify if the list should exclude users being removed.
1567 * @return the list of serial numbers of users that exist on the device.
1568 * @hide
1569 */
1570 @SystemApi
1571 public long[] getSerialNumbersOfUsers(boolean excludeDying) {
1572 try {
1573 List<UserInfo> users = mService.getUsers(excludeDying);
1574 long[] result = new long[users.size()];
1575 for (int i = 0; i < result.length; i++) {
1576 result[i] = users.get(i).serialNumber;
1577 }
1578 return result;
1579 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001580 throw re.rethrowFromSystemServer();
Fyodor Kupolov940e8572016-01-26 12:03:51 -08001581 }
1582 }
1583
1584 /**
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001585 * @return the user's account name, null if not found.
1586 * @hide
1587 */
1588 @RequiresPermission( allOf = {
1589 Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1590 Manifest.permission.MANAGE_USERS
1591 })
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001592 public @Nullable String getUserAccount(@UserIdInt int userHandle) {
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001593 try {
1594 return mService.getUserAccount(userHandle);
1595 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001596 throw re.rethrowFromSystemServer();
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001597 }
1598 }
1599
1600 /**
1601 * Set account name for the given user.
1602 * @hide
1603 */
1604 @RequiresPermission( allOf = {
1605 Manifest.permission.INTERACT_ACROSS_USERS_FULL,
1606 Manifest.permission.MANAGE_USERS
1607 })
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001608 public void setUserAccount(@UserIdInt int userHandle, @Nullable String accountName) {
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001609 try {
1610 mService.setUserAccount(userHandle, accountName);
1611 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001612 throw re.rethrowFromSystemServer();
Xiaohui Chenb3b92582015-12-07 11:22:13 -08001613 }
1614 }
1615
1616 /**
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001617 * Returns information for Primary user.
1618 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1619 *
1620 * @return the Primary user, null if not found.
1621 * @hide
1622 */
Xiaohui Chen7cb69df2015-07-13 16:01:01 -07001623 public @Nullable UserInfo getPrimaryUser() {
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001624 try {
1625 return mService.getPrimaryUser();
1626 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001627 throw re.rethrowFromSystemServer();
Xiaohui Chen70f6c382015-04-28 14:21:43 -07001628 }
1629 }
1630
1631 /**
Amith Yamasani95ab7842014-08-11 17:09:26 -07001632 * Checks whether it's possible to add more users. Caller must hold the MANAGE_USERS
1633 * permission.
1634 *
1635 * @return true if more users can be added, false if limit has been reached.
1636 * @hide
1637 */
1638 public boolean canAddMoreUsers() {
1639 final List<UserInfo> users = getUsers(true);
1640 final int totalUserCount = users.size();
1641 int aliveUserCount = 0;
1642 for (int i = 0; i < totalUserCount; i++) {
1643 UserInfo user = users.get(i);
1644 if (!user.isGuest()) {
1645 aliveUserCount++;
1646 }
1647 }
1648 return aliveUserCount < getMaxSupportedUsers();
1649 }
1650
1651 /**
Nicolas Prevot72434b72015-05-13 12:15:03 -07001652 * Checks whether it's possible to add more managed profiles. Caller must hold the MANAGE_USERS
1653 * permission.
Nicolas Prevot07387fe2015-10-30 17:53:30 +00001654 * if allowedToRemoveOne is true and if the user already has a managed profile, then return if
1655 * we could add a new managed profile to this user after removing the existing one.
Nicolas Prevot72434b72015-05-13 12:15:03 -07001656 *
1657 * @return true if more managed profiles can be added, false if limit has been reached.
1658 * @hide
1659 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001660 public boolean canAddMoreManagedProfiles(@UserIdInt int userId, boolean allowedToRemoveOne) {
Nicolas Prevot72434b72015-05-13 12:15:03 -07001661 try {
Nicolas Prevot07387fe2015-10-30 17:53:30 +00001662 return mService.canAddMoreManagedProfiles(userId, allowedToRemoveOne);
Nicolas Prevot72434b72015-05-13 12:15:03 -07001663 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001664 throw re.rethrowFromSystemServer();
Nicolas Prevot72434b72015-05-13 12:15:03 -07001665 }
1666 }
1667
1668 /**
Kenny Guy2a764942014-04-02 13:29:20 +01001669 * Returns list of the profiles of userHandle including
1670 * userHandle itself.
Amith Yamasani4f7e2e32014-08-14 18:49:48 -07001671 * Note that this returns both enabled and not enabled profiles. See
Ruben Brunk7f75da22015-04-30 17:46:30 -07001672 * {@link #getEnabledProfiles(int)} if you need only the enabled ones.
Amith Yamasani4f582632014-02-19 14:31:52 -08001673 *
Kenny Guy2a764942014-04-02 13:29:20 +01001674 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1675 * @param userHandle profiles of this user will be returned.
1676 * @return the list of profiles.
1677 * @hide
1678 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001679 public List<UserInfo> getProfiles(@UserIdInt int userHandle) {
Kenny Guya52dc3e2014-02-11 15:33:14 +00001680 try {
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001681 return mService.getProfiles(userHandle, false /* enabledOnly */);
Kenny Guya52dc3e2014-02-11 15:33:14 +00001682 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001683 throw re.rethrowFromSystemServer();
Kenny Guya52dc3e2014-02-11 15:33:14 +00001684 }
1685 }
1686
1687 /**
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001688 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1689 * @param userId one of the two user ids to check.
1690 * @param otherUserId one of the two user ids to check.
1691 * @return true if the two user ids are in the same profile group.
1692 * @hide
1693 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001694 public boolean isSameProfileGroup(@UserIdInt int userId, int otherUserId) {
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001695 try {
1696 return mService.isSameProfileGroup(userId, otherUserId);
1697 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001698 throw re.rethrowFromSystemServer();
Xiaohui Chenfd5b7742015-10-14 15:47:04 -07001699 }
1700 }
1701
1702 /**
Ruben Brunk7f75da22015-04-30 17:46:30 -07001703 * Returns list of the profiles of userHandle including
1704 * userHandle itself.
1705 * Note that this returns only enabled.
1706 *
1707 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
1708 * @param userHandle profiles of this user will be returned.
1709 * @return the list of profiles.
1710 * @hide
1711 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001712 public List<UserInfo> getEnabledProfiles(@UserIdInt int userHandle) {
Ruben Brunk7f75da22015-04-30 17:46:30 -07001713 try {
1714 return mService.getProfiles(userHandle, true /* enabledOnly */);
1715 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001716 throw re.rethrowFromSystemServer();
Ruben Brunk7f75da22015-04-30 17:46:30 -07001717 }
1718 }
1719
1720 /**
Jessica Hummelbe81c802014-04-22 15:49:22 +01001721 * Returns a list of UserHandles for profiles associated with the user that the calling process
1722 * is running on, including the user itself.
Amith Yamasani4f582632014-02-19 14:31:52 -08001723 *
1724 * @return A non-empty list of UserHandles associated with the calling user.
1725 */
1726 public List<UserHandle> getUserProfiles() {
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001727 int[] userIds = getProfileIds(UserHandle.myUserId(), true /* enabledOnly */);
1728 List<UserHandle> result = new ArrayList<>(userIds.length);
1729 for (int userId : userIds) {
1730 result.add(UserHandle.of(userId));
1731 }
1732 return result;
1733 }
1734
1735 /**
1736 * Returns a list of ids for profiles associated with the specified user including the user
1737 * itself.
1738 *
1739 * @param userId id of the user to return profiles for
1740 * @param enabledOnly whether return only {@link UserInfo#isEnabled() enabled} profiles
1741 * @return A non-empty list of ids of profiles associated with the specified user.
1742 *
1743 * @hide
1744 */
1745 public int[] getProfileIds(@UserIdInt int userId, boolean enabledOnly) {
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001746 try {
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001747 return mService.getProfileIds(userId, enabledOnly);
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001748 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001749 throw re.rethrowFromSystemServer();
Alexandra Gherghina385124d2014-04-03 13:37:39 +01001750 }
Fyodor Kupolov7f98aa42016-04-07 14:56:25 -07001751 }
1752
1753 /**
1754 * @see #getProfileIds(int, boolean)
1755 * @hide
1756 */
1757 public int[] getProfileIdsWithDisabled(@UserIdInt int userId) {
1758 return getProfileIds(userId, false /* enabledOnly */);
1759 }
1760
1761 /**
1762 * @see #getProfileIds(int, boolean)
1763 * @hide
1764 */
1765 public int[] getEnabledProfileIds(@UserIdInt int userId) {
1766 return getProfileIds(userId, true /* enabledOnly */);
Amith Yamasani4f582632014-02-19 14:31:52 -08001767 }
1768
Amith Yamasani7dda2652014-04-11 14:57:12 -07001769 /**
Andres Moralesc5548c02015-08-05 10:23:12 -07001770 * Returns the device credential owner id of the profile from
1771 * which this method is called, or userHandle if called from a user that
1772 * is not a profile.
1773 *
1774 * @hide
1775 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001776 public int getCredentialOwnerProfile(@UserIdInt int userHandle) {
Andres Moralesc5548c02015-08-05 10:23:12 -07001777 try {
1778 return mService.getCredentialOwnerProfile(userHandle);
1779 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001780 throw re.rethrowFromSystemServer();
Andres Moralesc5548c02015-08-05 10:23:12 -07001781 }
1782 }
1783
1784 /**
Jessica Hummelbe81c802014-04-22 15:49:22 +01001785 * Returns the parent of the profile which this method is called from
1786 * or null if called from a user that is not a profile.
1787 *
1788 * @hide
1789 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001790 public UserInfo getProfileParent(@UserIdInt int userHandle) {
Jessica Hummelbe81c802014-04-22 15:49:22 +01001791 try {
1792 return mService.getProfileParent(userHandle);
1793 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001794 throw re.rethrowFromSystemServer();
Jessica Hummelbe81c802014-04-22 15:49:22 +01001795 }
1796 }
1797
1798 /**
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001799 * Set quiet mode of a managed profile.
1800 *
1801 * @param userHandle The user handle of the profile.
1802 * @param enableQuietMode Whether quiet mode should be enabled or disabled.
1803 * @hide
1804 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001805 public void setQuietModeEnabled(@UserIdInt int userHandle, boolean enableQuietMode) {
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001806 try {
1807 mService.setQuietModeEnabled(userHandle, enableQuietMode);
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001808 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001809 throw re.rethrowFromSystemServer();
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001810 }
1811 }
1812
1813 /**
1814 * Returns whether the given profile is in quiet mode or not.
Ricky Wai7881cf82016-04-15 17:20:12 +01001815 * Notes: Quiet mode is only supported for managed profiles.
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001816 *
1817 * @param userHandle The user handle of the profile to be queried.
1818 * @return true if the profile is in quiet mode, false otherwise.
1819 */
1820 public boolean isQuietModeEnabled(UserHandle userHandle) {
1821 try {
1822 return mService.isQuietModeEnabled(userHandle.getIdentifier());
Jeff Sharkey27b2e692016-02-25 17:40:12 -07001823 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001824 throw re.rethrowFromSystemServer();
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001825 }
Rubin Xu0a29ecd2015-11-04 15:11:48 +00001826 }
1827
1828 /**
Benjamin Franzf02420c2016-04-04 18:52:21 +01001829 * Tries disabling quiet mode for a given user. If the user is still locked, we unlock the user
1830 * first by showing the confirm credentials screen and disable quiet mode upon successful
1831 * unlocking. If the user is already unlocked, we call through to {@link #setQuietModeEnabled}
1832 * directly.
1833 *
1834 * @return true if the quiet mode was disabled immediately
1835 * @hide
1836 */
1837 public boolean trySetQuietModeDisabled(@UserIdInt int userHandle, IntentSender target) {
1838 try {
1839 return mService.trySetQuietModeDisabled(userHandle, target);
1840 } catch (RemoteException re) {
1841 throw re.rethrowFromSystemServer();
1842 }
1843 }
1844
1845 /**
Amith Yamasani7dda2652014-04-11 14:57:12 -07001846 * If the target user is a managed profile of the calling user or the caller
1847 * is itself a managed profile, then this returns a badged copy of the given
Svetoslavc71c42f2014-08-05 18:57:05 -07001848 * icon to be able to distinguish it from the original icon. For badging an
1849 * arbitrary drawable use {@link #getBadgedDrawableForUser(
1850 * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
1851 * <p>
1852 * If the original drawable is a BitmapDrawable and the backing bitmap is
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001853 * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
Svetoslavc71c42f2014-08-05 18:57:05 -07001854 * is performed in place and the original drawable is returned.
1855 * </p>
Amith Yamasani7dda2652014-04-11 14:57:12 -07001856 *
1857 * @param icon The icon to badge.
1858 * @param user The target user.
1859 * @return A drawable that combines the original icon and a badge as
1860 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001861 * @removed
Amith Yamasani7dda2652014-04-11 14:57:12 -07001862 */
Svetoslavc71c42f2014-08-05 18:57:05 -07001863 public Drawable getBadgedIconForUser(Drawable icon, UserHandle user) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001864 return mContext.getPackageManager().getUserBadgedIcon(icon, user);
Amith Yamasani4f582632014-02-19 14:31:52 -08001865 }
1866
Kenny Guy701ea7c2014-05-08 23:34:12 +01001867 /**
1868 * If the target user is a managed profile of the calling user or the caller
Svetoslavc71c42f2014-08-05 18:57:05 -07001869 * is itself a managed profile, then this returns a badged copy of the given
1870 * drawable allowing the user to distinguish it from the original drawable.
1871 * The caller can specify the location in the bounds of the drawable to be
1872 * badged where the badge should be applied as well as the density of the
1873 * badge to be used.
1874 * <p>
1875 * If the original drawable is a BitmapDrawable and the backing bitmap is
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001876 * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
Svetoslavc71c42f2014-08-05 18:57:05 -07001877 * is performed in place and the original drawable is returned.
1878 * </p>
1879 *
1880 * @param badgedDrawable The drawable to badge.
1881 * @param user The target user.
1882 * @param badgeLocation Where in the bounds of the badged drawable to place
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001883 * the badge. If it's {@code null}, the badge is applied on top of the entire
Svetoslavc71c42f2014-08-05 18:57:05 -07001884 * drawable being badged.
1885 * @param badgeDensity The optional desired density for the badge as per
Vadim Tryshev66ae66a2016-02-18 15:41:21 -08001886 * {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
Svetoslavc71c42f2014-08-05 18:57:05 -07001887 * the density of the display is used.
1888 * @return A drawable that combines the original drawable and a badge as
1889 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001890 * @removed
Svetoslavc71c42f2014-08-05 18:57:05 -07001891 */
1892 public Drawable getBadgedDrawableForUser(Drawable badgedDrawable, UserHandle user,
1893 Rect badgeLocation, int badgeDensity) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001894 return mContext.getPackageManager().getUserBadgedDrawableForDensity(badgedDrawable, user,
1895 badgeLocation, badgeDensity);
Svetoslavc71c42f2014-08-05 18:57:05 -07001896 }
1897
1898 /**
1899 * If the target user is a managed profile of the calling user or the caller
Kenny Guyf7ecf7c2014-06-18 11:32:05 +01001900 * is itself a managed profile, then this returns a copy of the label with
1901 * badging for accessibility services like talkback. E.g. passing in "Email"
1902 * and it might return "Work Email" for Email in the work profile.
1903 *
1904 * @param label The label to change.
1905 * @param user The target user.
1906 * @return A label that combines the original label and a badge as
1907 * determined by the system.
Svetoslavc7d62f02014-09-04 15:39:54 -07001908 * @removed
Kenny Guyf7ecf7c2014-06-18 11:32:05 +01001909 */
Kenny Guy237aecd2014-07-21 14:06:09 +01001910 public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) {
Svetoslavc7d62f02014-09-04 15:39:54 -07001911 return mContext.getPackageManager().getUserBadgedLabel(label, user);
Amith Yamasani4f582632014-02-19 14:31:52 -08001912 }
1913
1914 /**
1915 * Returns information for all users on this device. Requires
1916 * {@link android.Manifest.permission#MANAGE_USERS} permission.
Emily Bernier394a6cd2014-05-07 12:49:20 -04001917 *
Amith Yamasani4f582632014-02-19 14:31:52 -08001918 * @param excludeDying specify if the list should exclude users being
1919 * removed.
Amith Yamasani920ace02012-09-20 22:15:37 -07001920 * @return the list of users that were created.
1921 * @hide
1922 */
1923 public List<UserInfo> getUsers(boolean excludeDying) {
1924 try {
1925 return mService.getUsers(excludeDying);
Amith Yamasani258848d2012-08-10 17:06:33 -07001926 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001927 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001928 }
1929 }
1930
1931 /**
1932 * Removes a user and all associated data.
Amith Yamasani195263742012-08-21 15:40:12 -07001933 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001934 * @param userHandle the integer handle of the user, where 0 is the primary user.
1935 * @hide
1936 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001937 public boolean removeUser(@UserIdInt int userHandle) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001938 try {
1939 return mService.removeUser(userHandle);
1940 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001941 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001942 }
1943 }
1944
1945 /**
1946 * Updates the user's name.
Amith Yamasani195263742012-08-21 15:40:12 -07001947 * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
Amith Yamasani258848d2012-08-10 17:06:33 -07001948 *
1949 * @param userHandle the user's integer handle
1950 * @param name the new name for the user
1951 * @hide
1952 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001953 public void setUserName(@UserIdInt int userHandle, String name) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001954 try {
1955 mService.setUserName(userHandle, name);
1956 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001957 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001958 }
1959 }
1960
1961 /**
Amith Yamasanie928d7d2012-09-17 21:46:51 -07001962 * Sets the user's photo.
Amith Yamasani258848d2012-08-10 17:06:33 -07001963 * @param userHandle the user for whom to change the photo.
Amith Yamasanie928d7d2012-09-17 21:46:51 -07001964 * @param icon the bitmap to set as the photo.
Amith Yamasani258848d2012-08-10 17:06:33 -07001965 * @hide
1966 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001967 public void setUserIcon(@UserIdInt int userHandle, Bitmap icon) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001968 try {
Amith Yamasanie928d7d2012-09-17 21:46:51 -07001969 mService.setUserIcon(userHandle, icon);
Amith Yamasani258848d2012-08-10 17:06:33 -07001970 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001971 throw re.rethrowFromSystemServer();
Amith Yamasani258848d2012-08-10 17:06:33 -07001972 }
1973 }
1974
1975 /**
Amith Yamasani3b49f072012-09-17 10:21:43 -07001976 * Returns a file descriptor for the user's photo. PNG data can be read from this file.
1977 * @param userHandle the user whose photo we want to read.
Amith Yamasanie928d7d2012-09-17 21:46:51 -07001978 * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
Alexandra Gherghina64d4dca2014-08-28 18:26:56 +01001979 * @see com.android.internal.util.UserIcons#getDefaultUserIcon for a default.
Amith Yamasani3b49f072012-09-17 10:21:43 -07001980 * @hide
1981 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07001982 public Bitmap getUserIcon(@UserIdInt int userHandle) {
Amith Yamasani3b49f072012-09-17 10:21:43 -07001983 try {
Adrian Roos1bdff912015-02-17 15:51:35 +01001984 ParcelFileDescriptor fd = mService.getUserIcon(userHandle);
1985 if (fd != null) {
1986 try {
1987 return BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());
1988 } finally {
1989 try {
1990 fd.close();
1991 } catch (IOException e) {
1992 }
1993 }
1994 }
Amith Yamasani3b49f072012-09-17 10:21:43 -07001995 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001996 throw re.rethrowFromSystemServer();
Amith Yamasani3b49f072012-09-17 10:21:43 -07001997 }
Adrian Roos1bdff912015-02-17 15:51:35 +01001998 return null;
Amith Yamasani3b49f072012-09-17 10:21:43 -07001999 }
2000
2001 /**
Amith Yamasani258848d2012-08-10 17:06:33 -07002002 * Returns the maximum number of users that can be created on this device. A return value
2003 * of 1 means that it is a single user device.
2004 * @hide
Maggie Benthalla12fccf2013-03-14 18:02:12 -04002005 * @return a value greater than or equal to 1
Amith Yamasani258848d2012-08-10 17:06:33 -07002006 */
Jeff Sharkey27bd34d2012-09-16 12:49:00 -07002007 public static int getMaxSupportedUsers() {
Amith Yamasaniff549202012-10-12 12:44:49 -07002008 // Don't allow multiple users on certain builds
2009 if (android.os.Build.ID.startsWith("JVP")) return 1;
Dianne Hackborn409297d2014-07-10 17:39:20 -07002010 // Svelte devices don't get multi-user.
2011 if (ActivityManager.isLowRamDeviceStatic()) return 1;
Jeff Sharkey27bd34d2012-09-16 12:49:00 -07002012 return SystemProperties.getInt("fw.max_users",
2013 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
Amith Yamasani258848d2012-08-10 17:06:33 -07002014 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002015
2016 /**
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002017 * Returns true if the user switcher should be shown, this will be if device supports multi-user
2018 * and there are at least 2 users available that are not managed profiles.
Kenny Guy1a447532014-02-20 21:55:32 +00002019 * @hide
2020 * @return true if user switcher should be shown.
2021 */
2022 public boolean isUserSwitcherEnabled() {
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002023 if (!supportsMultipleUsers()) {
2024 return false;
2025 }
Amith Yamasanieb437d42016-04-29 09:31:25 -07002026 // If Demo Mode is on, don't show user switcher
2027 if (isDeviceInDemoMode(mContext)) {
2028 return false;
2029 }
Kenny Guy1a447532014-02-20 21:55:32 +00002030 List<UserInfo> users = getUsers(true);
2031 if (users == null) {
2032 return false;
2033 }
2034 int switchableUserCount = 0;
2035 for (UserInfo user : users) {
Xiaohui Chen7cb69df2015-07-13 16:01:01 -07002036 if (user.supportsSwitchToByUser()) {
Kenny Guy1a447532014-02-20 21:55:32 +00002037 ++switchableUserCount;
2038 }
2039 }
Fyodor Kupolovcd86ebf2015-09-29 17:06:50 -07002040 final boolean guestEnabled = !mContext.getSystemService(DevicePolicyManager.class)
2041 .getGuestUserDisabled(null);
Amith Yamasania596ff82014-06-12 18:12:38 -07002042 return switchableUserCount > 1 || guestEnabled;
Kenny Guy1a447532014-02-20 21:55:32 +00002043 }
2044
2045 /**
Amith Yamasanieb437d42016-04-29 09:31:25 -07002046 * @hide
2047 */
2048 public static boolean isDeviceInDemoMode(Context context) {
2049 return Settings.Global.getInt(context.getContentResolver(),
2050 Settings.Global.DEVICE_DEMO_MODE, 0) > 0;
2051 }
2052
2053 /**
Amith Yamasani2a003292012-08-14 18:25:45 -07002054 * Returns a serial number on this device for a given userHandle. User handles can be recycled
2055 * when deleting and creating users, but serial numbers are not reused until the device is wiped.
2056 * @param userHandle
2057 * @return a serial number associated with that user, or -1 if the userHandle is not valid.
2058 * @hide
2059 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002060 public int getUserSerialNumber(@UserIdInt int userHandle) {
Amith Yamasani2a003292012-08-14 18:25:45 -07002061 try {
2062 return mService.getUserSerialNumber(userHandle);
2063 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002064 throw re.rethrowFromSystemServer();
Amith Yamasani2a003292012-08-14 18:25:45 -07002065 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002066 }
2067
2068 /**
2069 * Returns a userHandle on this device for a given user serial number. User handles can be
2070 * recycled when deleting and creating users, but serial numbers are not reused until the device
2071 * is wiped.
2072 * @param userSerialNumber
2073 * @return the userHandle associated with that user serial number, or -1 if the serial number
2074 * is not valid.
2075 * @hide
2076 */
Jeff Sharkey8588bc12016-01-06 16:47:42 -07002077 public @UserIdInt int getUserHandle(int userSerialNumber) {
Amith Yamasani2a003292012-08-14 18:25:45 -07002078 try {
2079 return mService.getUserHandle(userSerialNumber);
2080 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002081 throw re.rethrowFromSystemServer();
Amith Yamasani2a003292012-08-14 18:25:45 -07002082 }
Amith Yamasani2a003292012-08-14 18:25:45 -07002083 }
Maggie Benthall67944582013-02-22 14:58:27 -05002084
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002085 /**
Esteban Talavera953fe482016-06-07 15:25:20 +01002086 * Returns a {@link Bundle} containing any saved application restrictions for this user, for the
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002087 * given package name. Only an application with this package name can call this method.
Esteban Talavera5b9f1672015-12-11 15:22:34 +00002088 *
2089 * <p>The returned {@link Bundle} consists of key-value pairs, as defined by the application,
2090 * where the types of values may be:
2091 * <ul>
2092 * <li>{@code boolean}
2093 * <li>{@code int}
2094 * <li>{@code String} or {@code String[]}
2095 * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]}
2096 * </ul>
2097 *
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002098 * @param packageName the package name of the calling application
Esteban Talavera953fe482016-06-07 15:25:20 +01002099 * @return a {@link Bundle} with the restrictions for that package, or an empty {@link Bundle}
2100 * if there are no saved restrictions.
Esteban Talavera5b9f1672015-12-11 15:22:34 +00002101 *
2102 * @see #KEY_RESTRICTIONS_PENDING
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002103 */
2104 public Bundle getApplicationRestrictions(String packageName) {
2105 try {
2106 return mService.getApplicationRestrictions(packageName);
2107 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002108 throw re.rethrowFromSystemServer();
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002109 }
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002110 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002111
2112 /**
2113 * @hide
2114 */
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002115 public Bundle getApplicationRestrictions(String packageName, UserHandle user) {
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002116 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002117 return mService.getApplicationRestrictionsForUser(packageName, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002118 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002119 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002120 }
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002121 }
2122
2123 /**
2124 * @hide
2125 */
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002126 public void setApplicationRestrictions(String packageName, Bundle restrictions,
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002127 UserHandle user) {
2128 try {
Amith Yamasani7e99bc02013-04-16 18:24:51 -07002129 mService.setApplicationRestrictions(packageName, restrictions, user.getIdentifier());
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002130 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002131 throw re.rethrowFromSystemServer();
Amith Yamasanidf2e92a2013-03-01 17:04:38 -08002132 }
2133 }
Amith Yamasani655d0e22013-06-12 14:19:10 -07002134
2135 /**
Amith Yamasanid304af62013-09-05 09:30:23 -07002136 * Sets a new challenge PIN for restrictions. This is only for use by pre-installed
2137 * apps and requires the MANAGE_USERS permission.
2138 * @param newPin the PIN to use for challenge dialogs.
2139 * @return Returns true if the challenge PIN was set successfully.
Fyodor Kupolovef249092015-05-06 13:18:46 -07002140 * @deprecated The restrictions PIN functionality is no longer provided by the system.
2141 * This method is preserved for backwards compatibility reasons and always returns false.
Amith Yamasani655d0e22013-06-12 14:19:10 -07002142 */
Amith Yamasanid304af62013-09-05 09:30:23 -07002143 public boolean setRestrictionsChallenge(String newPin) {
Amith Yamasani655d0e22013-06-12 14:19:10 -07002144 return false;
2145 }
Amith Yamasani1a7472e2013-07-02 11:17:30 -07002146
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302147 /**
2148 * @hide
2149 * Set restrictions that should apply to any future guest user that's created.
2150 */
2151 public void setDefaultGuestRestrictions(Bundle restrictions) {
2152 try {
2153 mService.setDefaultGuestRestrictions(restrictions);
2154 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002155 throw re.rethrowFromSystemServer();
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302156 }
2157 }
2158
2159 /**
2160 * @hide
2161 * Gets the default guest restrictions.
2162 */
2163 public Bundle getDefaultGuestRestrictions() {
2164 try {
2165 return mService.getDefaultGuestRestrictions();
2166 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002167 throw re.rethrowFromSystemServer();
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302168 }
Amith Yamasanie4afaa32014-06-30 14:55:07 +05302169 }
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002170
2171 /**
2172 * Returns creation time of the user or of a managed profile associated with the calling user.
2173 * @param userHandle user handle of the user or a managed profile associated with the
2174 * calling user.
2175 * @return creation time in milliseconds since Epoch time.
2176 */
Fyodor Kupolov385de622015-04-10 18:00:19 -07002177 public long getUserCreationTime(UserHandle userHandle) {
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002178 try {
Fyodor Kupolov385de622015-04-10 18:00:19 -07002179 return mService.getUserCreationTime(userHandle.getIdentifier());
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002180 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002181 throw re.rethrowFromSystemServer();
Fyodor Kupolovff7233e2015-04-08 11:28:52 -07002182 }
2183 }
Amith Yamasani12747872015-12-07 14:19:49 -08002184
2185 /**
2186 * @hide
2187 * Checks if any uninitialized user has the specific seed account name and type.
2188 *
2189 * @param mAccountName The account name to check for
2190 * @param mAccountType The account type of the account to check for
2191 * @return whether the seed account was found
2192 */
2193 public boolean someUserHasSeedAccount(String accountName, String accountType) {
2194 try {
2195 return mService.someUserHasSeedAccount(accountName, accountType);
2196 } catch (RemoteException re) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002197 throw re.rethrowFromSystemServer();
Amith Yamasani12747872015-12-07 14:19:49 -08002198 }
2199 }
Amith Yamasani258848d2012-08-10 17:06:33 -07002200}