1 /* 2 * Copyright (C) 2010 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 */ 16 17 package android.app.admin; 18 19 import android.annotation.ColorInt; 20 import android.annotation.IntDef; 21 import android.annotation.NonNull; 22 import android.annotation.Nullable; 23 import android.annotation.SdkConstant; 24 import android.annotation.SdkConstant.SdkConstantType; 25 import android.annotation.SystemApi; 26 import android.annotation.UserIdInt; 27 import android.app.Activity; 28 import android.app.admin.SecurityLog.SecurityEvent; 29 import android.content.ComponentName; 30 import android.content.Context; 31 import android.content.Intent; 32 import android.content.IntentFilter; 33 import android.content.pm.PackageManager; 34 import android.content.pm.PackageManager.NameNotFoundException; 35 import android.content.pm.ParceledListSlice; 36 import android.content.pm.UserInfo; 37 import android.graphics.Bitmap; 38 import android.net.ProxyInfo; 39 import android.net.Uri; 40 import android.os.Bundle; 41 import android.os.PersistableBundle; 42 import android.os.Process; 43 import android.os.RemoteCallback; 44 import android.os.RemoteException; 45 import android.os.ServiceManager; 46 import android.os.UserHandle; 47 import android.os.UserManager; 48 import android.provider.ContactsContract.Directory; 49 import android.provider.Settings; 50 import android.security.Credentials; 51 import android.service.restrictions.RestrictionsReceiver; 52 import android.telephony.TelephonyManager; 53 import android.util.Log; 54 55 import com.android.internal.annotations.VisibleForTesting; 56 import com.android.org.conscrypt.TrustedCertificateStore; 57 58 import java.io.ByteArrayInputStream; 59 import java.io.IOException; 60 import java.lang.annotation.Retention; 61 import java.lang.annotation.RetentionPolicy; 62 import java.net.InetSocketAddress; 63 import java.net.Proxy; 64 import java.security.KeyFactory; 65 import java.security.NoSuchAlgorithmException; 66 import java.security.PrivateKey; 67 import java.security.cert.Certificate; 68 import java.security.cert.CertificateException; 69 import java.security.cert.CertificateFactory; 70 import java.security.cert.X509Certificate; 71 import java.security.spec.InvalidKeySpecException; 72 import java.security.spec.PKCS8EncodedKeySpec; 73 import java.util.ArrayList; 74 import java.util.Arrays; 75 import java.util.Collections; 76 import java.util.List; 77 import java.util.Set; 78 79 /** 80 * Public interface for managing policies enforced on a device. Most clients of this class must be 81 * registered with the system as a <a href="{@docRoot}guide/topics/admin/device-admin.html">device 82 * administrator</a>. Additionally, a device administrator may be registered as either a profile or 83 * device owner. A given method is accessible to all device administrators unless the documentation 84 * for that method specifies that it is restricted to either device or profile owners. Any 85 * application calling an api may only pass as an argument a device administrator component it 86 * owns. Otherwise, a {@link SecurityException} will be thrown. 87 * <div class="special reference"> 88 * <h3>Developer Guides</h3> 89 * <p> 90 * For more information about managing policies for device administration, read the <a href= 91 * "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> developer 92 * guide. </div> 93 */ 94 public class DevicePolicyManager { 95 private static String TAG = "DevicePolicyManager"; 96 97 private final Context mContext; 98 private final IDevicePolicyManager mService; 99 private final boolean mParentInstance; 100 DevicePolicyManager(Context context, boolean parentInstance)101 private DevicePolicyManager(Context context, boolean parentInstance) { 102 this(context, 103 IDevicePolicyManager.Stub.asInterface( 104 ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)), 105 parentInstance); 106 } 107 108 /** @hide */ 109 @VisibleForTesting DevicePolicyManager( Context context, IDevicePolicyManager service, boolean parentInstance)110 protected DevicePolicyManager( 111 Context context, IDevicePolicyManager service, boolean parentInstance) { 112 mContext = context; 113 mService = service; 114 mParentInstance = parentInstance; 115 } 116 117 /** @hide */ create(Context context)118 public static DevicePolicyManager create(Context context) { 119 DevicePolicyManager me = new DevicePolicyManager(context, false); 120 return me.mService != null ? me : null; 121 } 122 123 /** @hide test will override it. */ 124 @VisibleForTesting myUserId()125 protected int myUserId() { 126 return UserHandle.myUserId(); 127 } 128 129 /** 130 * Activity action: Starts the provisioning flow which sets up a managed profile. 131 * 132 * <p>A managed profile allows data separation for example for the usage of a 133 * device as a personal and corporate device. The user which provisioning is started from and 134 * the managed profile share a launcher. 135 * 136 * <p>This intent will typically be sent by a mobile device management application (MDM). 137 * Provisioning adds a managed profile and sets the MDM as the profile owner who has full 138 * control over the profile. 139 * 140 * <p>It is possible to check if provisioning is allowed or not by querying the method 141 * {@link #isProvisioningAllowed(String)}. 142 * 143 * <p>In version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this intent must contain the 144 * extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}. 145 * As of {@link android.os.Build.VERSION_CODES#M}, it should contain the extra 146 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead, although specifying only 147 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported. 148 * 149 * <p>The intent may also contain the following extras: 150 * <ul> 151 * <li>{@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE}, optional </li> 152 * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional, supported from 153 * {@link android.os.Build.VERSION_CODES#N}</li> 154 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> 155 * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> 156 * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> 157 * </ul> 158 * 159 * <p>When managed provisioning has completed, broadcasts are sent to the application specified 160 * in the provisioning intent. The 161 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast is sent in the 162 * managed profile and the {@link #ACTION_MANAGED_PROFILE_PROVISIONED} broadcast is sent in 163 * the primary profile. 164 * 165 * <p>If provisioning fails, the managedProfile is removed so the device returns to its 166 * previous state. 167 * 168 * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a 169 * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of 170 * the provisioning flow was successful, although this doesn't guarantee the full flow will 171 * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies 172 * that the user backed-out of provisioning, or some precondition for provisioning wasn't met. 173 */ 174 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 175 public static final String ACTION_PROVISION_MANAGED_PROFILE 176 = "android.app.action.PROVISION_MANAGED_PROFILE"; 177 178 /** 179 * Activity action: Starts the provisioning flow which sets up a managed user. 180 * 181 * <p>This intent will typically be sent by a mobile device management application (MDM). 182 * Provisioning configures the user as managed user and sets the MDM as the profile 183 * owner who has full control over the user. Provisioning can only happen before user setup has 184 * been completed. Use {@link #isProvisioningAllowed(String)} to check if provisioning is 185 * allowed. 186 * 187 * <p>The intent contains the following extras: 188 * <ul> 189 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li> 190 * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li> 191 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> 192 * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> 193 * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> 194 * </ul> 195 * 196 * <p>If provisioning fails, the device returns to its previous state. 197 * 198 * <p>If launched with {@link android.app.Activity#startActivityForResult(Intent, int)} a 199 * result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part of 200 * the provisioning flow was successful, although this doesn't guarantee the full flow will 201 * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies 202 * that the user backed-out of provisioning, or some precondition for provisioning wasn't met. 203 * 204 * @hide 205 */ 206 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 207 public static final String ACTION_PROVISION_MANAGED_USER 208 = "android.app.action.PROVISION_MANAGED_USER"; 209 210 /** 211 * Activity action: Starts the provisioning flow which sets up a managed device. 212 * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}. 213 * 214 * <p> During device owner provisioning a device admin app is set as the owner of the device. 215 * A device owner has full control over the device. The device owner can not be modified by the 216 * user. 217 * 218 * <p> A typical use case would be a device that is owned by a company, but used by either an 219 * employee or client. 220 * 221 * <p> An intent with this action can be sent only on an unprovisioned device. 222 * It is possible to check if provisioning is allowed or not by querying the method 223 * {@link #isProvisioningAllowed(String)}. 224 * 225 * <p>The intent contains the following extras: 226 * <ul> 227 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li> 228 * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li> 229 * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li> 230 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> 231 * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> 232 * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> 233 * </ul> 234 * 235 * <p>When device owner provisioning has completed, an intent of the type 236 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the 237 * device owner. 238 * 239 * <p>If provisioning fails, the device is factory reset. 240 * 241 * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part 242 * of the provisioning flow was successful, although this doesn't guarantee the full flow will 243 * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies 244 * that the user backed-out of provisioning, or some precondition for provisioning wasn't met. 245 */ 246 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 247 public static final String ACTION_PROVISION_MANAGED_DEVICE 248 = "android.app.action.PROVISION_MANAGED_DEVICE"; 249 250 /** 251 * Activity action: Starts the provisioning flow which sets up a managed device. 252 * 253 * <p>During device owner provisioning, a device admin app is downloaded and set as the owner of 254 * the device. A device owner has full control over the device. The device owner can not be 255 * modified by the user and the only way of resetting the device is via factory reset. 256 * 257 * <p>A typical use case would be a device that is owned by a company, but used by either an 258 * employee or client. 259 * 260 * <p>The provisioning message should be sent to an unprovisioned device. 261 * 262 * <p>Unlike {@link #ACTION_PROVISION_MANAGED_DEVICE}, the provisioning message can only be sent 263 * by a privileged app with the permission 264 * {@link android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE}. 265 * 266 * <p>The provisioning intent contains the following properties: 267 * <ul> 268 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li> 269 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li> 270 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li> 271 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li> 272 * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li> 273 * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li> 274 * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li> 275 * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li> 276 * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li> 277 * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li> 278 * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li> 279 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li> 280 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li> 281 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li> 282 * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li> 283 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li></ul> 284 * 285 * @hide 286 */ 287 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 288 @SystemApi 289 public static final String ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE = 290 "android.app.action.PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE"; 291 292 /** 293 * Activity action: Starts the provisioning flow which sets up a managed device. 294 * Must be started with {@link android.app.Activity#startActivityForResult(Intent, int)}. 295 * 296 * <p>NOTE: This is only supported on split system user devices, and puts the device into a 297 * management state that is distinct from that reached by 298 * {@link #ACTION_PROVISION_MANAGED_DEVICE} - specifically the device owner runs on the system 299 * user, and only has control over device-wide policies, not individual users and their data. 300 * The primary benefit is that multiple non-system users are supported when provisioning using 301 * this form of device management. 302 * 303 * <p>During device owner provisioning a device admin app is set as the owner of the device. 304 * A device owner has full control over the device. The device owner can not be modified by the 305 * user. 306 * 307 * <p>A typical use case would be a device that is owned by a company, but used by either an 308 * employee or client. 309 * 310 * <p>An intent with this action can be sent only on an unprovisioned device. 311 * It is possible to check if provisioning is allowed or not by querying the method 312 * {@link #isProvisioningAllowed(String)}. 313 * 314 * <p>The intent contains the following extras: 315 * <ul> 316 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}</li> 317 * <li>{@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION}, optional</li> 318 * <li>{@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED}, optional</li> 319 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional</li> 320 * <li>{@link #EXTRA_PROVISIONING_LOGO_URI}, optional</li> 321 * <li>{@link #EXTRA_PROVISIONING_MAIN_COLOR}, optional</li> 322 * </ul> 323 * 324 * <p>When device owner provisioning has completed, an intent of the type 325 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcast to the 326 * device owner. 327 * 328 * <p>If provisioning fails, the device is factory reset. 329 * 330 * <p>A result code of {@link android.app.Activity#RESULT_OK} implies that the synchronous part 331 * of the provisioning flow was successful, although this doesn't guarantee the full flow will 332 * succeed. Conversely a result code of {@link android.app.Activity#RESULT_CANCELED} implies 333 * that the user backed-out of provisioning, or some precondition for provisioning wasn't met. 334 * 335 * @hide 336 */ 337 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 338 public static final String ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE 339 = "android.app.action.PROVISION_MANAGED_SHAREABLE_DEVICE"; 340 341 /** 342 * Activity action: Finalizes management provisioning, should be used after user-setup 343 * has been completed and {@link #getUserProvisioningState()} returns one of: 344 * <ul> 345 * <li>{@link #STATE_USER_SETUP_INCOMPLETE}</li> 346 * <li>{@link #STATE_USER_SETUP_COMPLETE}</li> 347 * <li>{@link #STATE_USER_PROFILE_COMPLETE}</li> 348 * </ul> 349 * 350 * @hide 351 */ 352 @SystemApi 353 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 354 public static final String ACTION_PROVISION_FINALIZATION 355 = "android.app.action.PROVISION_FINALIZATION"; 356 357 /** 358 * Action: Bugreport sharing with device owner has been accepted by the user. 359 * 360 * @hide 361 */ 362 public static final String ACTION_BUGREPORT_SHARING_ACCEPTED = 363 "com.android.server.action.BUGREPORT_SHARING_ACCEPTED"; 364 365 /** 366 * Action: Bugreport sharing with device owner has been declined by the user. 367 * 368 * @hide 369 */ 370 public static final String ACTION_BUGREPORT_SHARING_DECLINED = 371 "com.android.server.action.BUGREPORT_SHARING_DECLINED"; 372 373 /** 374 * Action: Bugreport has been collected and is dispatched to {@link DevicePolicyManagerService}. 375 * 376 * @hide 377 */ 378 public static final String ACTION_REMOTE_BUGREPORT_DISPATCH = 379 "android.intent.action.REMOTE_BUGREPORT_DISPATCH"; 380 381 /** 382 * Extra for shared bugreport's SHA-256 hash. 383 * 384 * @hide 385 */ 386 public static final String EXTRA_REMOTE_BUGREPORT_HASH = 387 "android.intent.extra.REMOTE_BUGREPORT_HASH"; 388 389 /** 390 * Extra for remote bugreport notification shown type. 391 * 392 * @hide 393 */ 394 public static final String EXTRA_BUGREPORT_NOTIFICATION_TYPE = 395 "android.app.extra.bugreport_notification_type"; 396 397 /** 398 * Notification type for a started remote bugreport flow. 399 * 400 * @hide 401 */ 402 public static final int NOTIFICATION_BUGREPORT_STARTED = 1; 403 404 /** 405 * Notification type for a bugreport that has already been accepted to be shared, but is still 406 * being taken. 407 * 408 * @hide 409 */ 410 public static final int NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED = 2; 411 412 /** 413 * Notification type for a bugreport that has been taken and can be shared or declined. 414 * 415 * @hide 416 */ 417 public static final int NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED = 3; 418 419 /** 420 * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that 421 * allows a mobile device management application or NFC programmer application which starts 422 * managed provisioning to pass data to the management application instance after provisioning. 423 * <p> 424 * If used with {@link #ACTION_PROVISION_MANAGED_PROFILE} it can be used by the application that 425 * sends the intent to pass data to itself on the newly created profile. 426 * If used with {@link #ACTION_PROVISION_MANAGED_DEVICE} it allows passing data to the same 427 * instance of the app on the primary user. 428 * Starting from {@link android.os.Build.VERSION_CODES#M}, if used with 429 * {@link #MIME_TYPE_PROVISIONING_NFC} as part of NFC managed device provisioning, the NFC 430 * message should contain a stringified {@link java.util.Properties} instance, whose string 431 * properties will be converted into a {@link android.os.PersistableBundle} and passed to the 432 * management application after provisioning. 433 * 434 * <p> 435 * In both cases the application receives the data in 436 * {@link DeviceAdminReceiver#onProfileProvisioningComplete} via an intent with the action 437 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}. The bundle is not changed 438 * during the managed provisioning. 439 */ 440 public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = 441 "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE"; 442 443 /** 444 * A String extra holding the package name of the mobile device management application that 445 * will be set as the profile owner or device owner. 446 * 447 * <p>If an application starts provisioning directly via an intent with action 448 * {@link #ACTION_PROVISION_MANAGED_PROFILE} this package has to match the package name of the 449 * application that started provisioning. The package will be set as profile owner in that case. 450 * 451 * <p>This package is set as device owner when device owner provisioning is started by an NFC 452 * message containing an NFC record with MIME type {@link #MIME_TYPE_PROVISIONING_NFC}. 453 * 454 * <p> When this extra is set, the application must have exactly one device admin receiver. 455 * This receiver will be set as the profile or device owner and active admin. 456 * 457 * @see DeviceAdminReceiver 458 * @deprecated Use {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME}. This extra is still 459 * supported, but only if there is only one device admin receiver in the package that requires 460 * the permission {@link android.Manifest.permission#BIND_DEVICE_ADMIN}. 461 */ 462 @Deprecated 463 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME 464 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME"; 465 466 /** 467 * A ComponentName extra indicating the device admin receiver of the mobile device management 468 * application that will be set as the profile owner or device owner and active admin. 469 * 470 * <p>If an application starts provisioning directly via an intent with action 471 * {@link #ACTION_PROVISION_MANAGED_PROFILE} or 472 * {@link #ACTION_PROVISION_MANAGED_DEVICE} the package name of this 473 * component has to match the package name of the application that started provisioning. 474 * 475 * <p>This component is set as device owner and active admin when device owner provisioning is 476 * started by an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or by an NFC 477 * message containing an NFC record with MIME type 478 * {@link #MIME_TYPE_PROVISIONING_NFC}. For the NFC record, the component name must be 479 * flattened to a string, via {@link ComponentName#flattenToShortString()}. 480 * 481 * @see DeviceAdminReceiver 482 */ 483 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME 484 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME"; 485 486 /** 487 * An {@link android.accounts.Account} extra holding the account to migrate during managed 488 * profile provisioning. If the account supplied is present in the primary user, it will be 489 * copied, along with its credentials to the managed profile and removed from the primary user. 490 * 491 * Use with {@link #ACTION_PROVISION_MANAGED_PROFILE}. 492 */ 493 494 public static final String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE 495 = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE"; 496 497 /** 498 * A String extra that, holds the email address of the account which a managed profile is 499 * created for. Used with {@link #ACTION_PROVISION_MANAGED_PROFILE} and 500 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}. 501 * 502 * <p> This extra is part of the {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}. 503 * 504 * <p> If the {@link #ACTION_PROVISION_MANAGED_PROFILE} intent that starts managed provisioning 505 * contains this extra, it is forwarded in the 506 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} intent to the mobile 507 * device management application that was set as the profile owner during provisioning. 508 * It is usually used to avoid that the user has to enter their email address twice. 509 */ 510 public static final String EXTRA_PROVISIONING_EMAIL_ADDRESS 511 = "android.app.extra.PROVISIONING_EMAIL_ADDRESS"; 512 513 /** 514 * A integer extra indicating the predominant color to show during the provisioning. 515 * Refer to {@link android.graphics.Color} for how the color is represented. 516 * 517 * <p>Use with {@link #ACTION_PROVISION_MANAGED_PROFILE} or 518 * {@link #ACTION_PROVISION_MANAGED_DEVICE}. 519 */ 520 public static final String EXTRA_PROVISIONING_MAIN_COLOR = 521 "android.app.extra.PROVISIONING_MAIN_COLOR"; 522 523 /** 524 * A Boolean extra that can be used by the mobile device management application to skip the 525 * disabling of system apps during provisioning when set to {@code true}. 526 * 527 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action 528 * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning. 529 */ 530 public static final String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED = 531 "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED"; 532 533 /** 534 * A String extra holding the time zone {@link android.app.AlarmManager} that the device 535 * will be set to. 536 * 537 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 538 * provisioning via an NFC bump. 539 */ 540 public static final String EXTRA_PROVISIONING_TIME_ZONE 541 = "android.app.extra.PROVISIONING_TIME_ZONE"; 542 543 /** 544 * A Long extra holding the wall clock time (in milliseconds) to be set on the device's 545 * {@link android.app.AlarmManager}. 546 * 547 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 548 * provisioning via an NFC bump. 549 */ 550 public static final String EXTRA_PROVISIONING_LOCAL_TIME 551 = "android.app.extra.PROVISIONING_LOCAL_TIME"; 552 553 /** 554 * A String extra holding the {@link java.util.Locale} that the device will be set to. 555 * Format: xx_yy, where xx is the language code, and yy the country code. 556 * 557 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 558 * provisioning via an NFC bump. 559 */ 560 public static final String EXTRA_PROVISIONING_LOCALE 561 = "android.app.extra.PROVISIONING_LOCALE"; 562 563 /** 564 * A String extra holding the ssid of the wifi network that should be used during nfc device 565 * owner provisioning for downloading the mobile device management application. 566 * 567 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 568 * provisioning via an NFC bump. 569 */ 570 public static final String EXTRA_PROVISIONING_WIFI_SSID 571 = "android.app.extra.PROVISIONING_WIFI_SSID"; 572 573 /** 574 * A boolean extra indicating whether the wifi network in {@link #EXTRA_PROVISIONING_WIFI_SSID} 575 * is hidden or not. 576 * 577 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 578 * provisioning via an NFC bump. 579 */ 580 public static final String EXTRA_PROVISIONING_WIFI_HIDDEN 581 = "android.app.extra.PROVISIONING_WIFI_HIDDEN"; 582 583 /** 584 * A String extra indicating the security type of the wifi network in 585 * {@link #EXTRA_PROVISIONING_WIFI_SSID} and could be one of {@code NONE}, {@code WPA} or 586 * {@code WEP}. 587 * 588 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 589 * provisioning via an NFC bump. 590 */ 591 public static final String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE 592 = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE"; 593 594 /** 595 * A String extra holding the password of the wifi network in 596 * {@link #EXTRA_PROVISIONING_WIFI_SSID}. 597 * 598 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 599 * provisioning via an NFC bump. 600 */ 601 public static final String EXTRA_PROVISIONING_WIFI_PASSWORD 602 = "android.app.extra.PROVISIONING_WIFI_PASSWORD"; 603 604 /** 605 * A String extra holding the proxy host for the wifi network in 606 * {@link #EXTRA_PROVISIONING_WIFI_SSID}. 607 * 608 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 609 * provisioning via an NFC bump. 610 */ 611 public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST 612 = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST"; 613 614 /** 615 * An int extra holding the proxy port for the wifi network in 616 * {@link #EXTRA_PROVISIONING_WIFI_SSID}. 617 * 618 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 619 * provisioning via an NFC bump. 620 */ 621 public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT 622 = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT"; 623 624 /** 625 * A String extra holding the proxy bypass for the wifi network in 626 * {@link #EXTRA_PROVISIONING_WIFI_SSID}. 627 * 628 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 629 * provisioning via an NFC bump. 630 */ 631 public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS 632 = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS"; 633 634 /** 635 * A String extra holding the proxy auto-config (PAC) URL for the wifi network in 636 * {@link #EXTRA_PROVISIONING_WIFI_SSID}. 637 * 638 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 639 * provisioning via an NFC bump. 640 */ 641 public static final String EXTRA_PROVISIONING_WIFI_PAC_URL 642 = "android.app.extra.PROVISIONING_WIFI_PAC_URL"; 643 644 /** 645 * A String extra holding a url that specifies the download location of the device admin 646 * package. When not provided it is assumed that the device admin package is already installed. 647 * 648 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 649 * provisioning via an NFC bump. 650 */ 651 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION 652 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; 653 654 /** 655 * An int extra holding a minimum required version code for the device admin package. If the 656 * device admin is already installed on the device, it will only be re-downloaded from 657 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION} if the version of the 658 * installed package is less than this version code. 659 * 660 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 661 * provisioning via an NFC bump. 662 */ 663 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE 664 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE"; 665 666 /** 667 * A String extra holding a http cookie header which should be used in the http request to the 668 * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. 669 * 670 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 671 * provisioning via an NFC bump. 672 */ 673 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER 674 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER"; 675 676 /** 677 * A String extra holding the URL-safe base64 encoded SHA-256 or SHA-1 hash (see notes below) of 678 * the file at download location specified in 679 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. 680 * 681 * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM} must be 682 * present. The provided checksum must match the checksum of the file at the download 683 * location. If the checksum doesn't match an error will be shown to the user and the user will 684 * be asked to factory reset the device. 685 * 686 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 687 * provisioning via an NFC bump. 688 * 689 * <p><strong>Note:</strong> for devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} 690 * and {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} only SHA-1 hash is supported. 691 * Starting from {@link android.os.Build.VERSION_CODES#M}, this parameter accepts SHA-256 in 692 * addition to SHA-1. Support for SHA-1 is likely to be removed in future OS releases. 693 */ 694 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM 695 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM"; 696 697 /** 698 * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the 699 * android package archive at the download location specified in {@link 700 * #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. 701 * 702 * <p>The signatures of an android package archive can be obtained using 703 * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag 704 * {@link android.content.pm.PackageManager#GET_SIGNATURES}. 705 * 706 * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} must be 707 * present. The provided checksum must match the checksum of any signature of the file at 708 * the download location. If the checksum does not match an error will be shown to the user and 709 * the user will be asked to factory reset the device. 710 * 711 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner 712 * provisioning via an NFC bump. 713 */ 714 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM 715 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM"; 716 717 /** 718 * Broadcast Action: This broadcast is sent to indicate that provisioning of a managed profile 719 * has completed successfully. 720 * 721 * <p>The broadcast is limited to the primary profile, to the app specified in the provisioning 722 * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}. 723 * 724 * <p>This intent will contain the extra {@link #EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE} which 725 * corresponds to the account requested to be migrated at provisioning time, if any. 726 */ 727 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 728 public static final String ACTION_MANAGED_PROFILE_PROVISIONED 729 = "android.app.action.MANAGED_PROFILE_PROVISIONED"; 730 731 /** 732 * A boolean extra indicating whether device encryption can be skipped as part of device owner 733 * or managed profile provisioning. 734 * 735 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} or an intent with action 736 * {@link #ACTION_PROVISION_MANAGED_DEVICE} that starts device owner provisioning. 737 * 738 * <p>From {@link android.os.Build.VERSION_CODES#N} onwards, this is also supported for an 739 * intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE}. 740 */ 741 public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION = 742 "android.app.extra.PROVISIONING_SKIP_ENCRYPTION"; 743 744 /** 745 * A {@link Uri} extra pointing to a logo image. This image will be shown during the 746 * provisioning. If this extra is not passed, a default image will be shown. 747 * <h5>The following URI schemes are accepted:</h5> 748 * <ul> 749 * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li> 750 * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})</li> 751 * </ul> 752 * 753 * <p> It is the responsability of the caller to provide an image with a reasonable 754 * pixed density for the device. 755 * 756 * <p> If a content: URI is passed, the intent should have the flag 757 * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and the uri should be added to the 758 * {@link android.content.ClipData} of the intent too. 759 * 760 * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_PROFILE} or 761 * {@link #ACTION_PROVISION_MANAGED_DEVICE} 762 */ 763 public static final String EXTRA_PROVISIONING_LOGO_URI = 764 "android.app.extra.PROVISIONING_LOGO_URI"; 765 766 /** 767 * A boolean extra indicating if user setup should be skipped, for when provisioning is started 768 * during setup-wizard. 769 * 770 * <p>If unspecified, defaults to {@code true} to match the behavior in 771 * {@link android.os.Build.VERSION_CODES#M} and earlier. 772 * 773 * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE} or 774 * {@link #ACTION_PROVISION_MANAGED_USER}. 775 * 776 * @hide 777 */ 778 public static final String EXTRA_PROVISIONING_SKIP_USER_SETUP = 779 "android.app.extra.PROVISIONING_SKIP_USER_SETUP"; 780 781 /** 782 * This MIME type is used for starting the device owner provisioning. 783 * 784 * <p>During device owner provisioning a device admin app is set as the owner of the device. 785 * A device owner has full control over the device. The device owner can not be modified by the 786 * user and the only way of resetting the device is if the device owner app calls a factory 787 * reset. 788 * 789 * <p> A typical use case would be a device that is owned by a company, but used by either an 790 * employee or client. 791 * 792 * <p> The NFC message must be sent to an unprovisioned device. 793 * 794 * <p>The NFC record must contain a serialized {@link java.util.Properties} object which 795 * contains the following properties: 796 * <ul> 797 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}</li> 798 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, optional</li> 799 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li> 800 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}, optional</li> 801 * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li> 802 * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li> 803 * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li> 804 * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li> 805 * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li> 806 * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li> 807 * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li> 808 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li> 809 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li> 810 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li> 811 * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li> 812 * <li>{@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}, optional, supported from 813 * {@link android.os.Build.VERSION_CODES#M} </li></ul> 814 * 815 * <p> 816 * As of {@link android.os.Build.VERSION_CODES#M}, the properties should contain 817 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead of 818 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}, (although specifying only 819 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported). 820 */ 821 public static final String MIME_TYPE_PROVISIONING_NFC 822 = "application/com.android.managedprovisioning"; 823 824 /** 825 * Activity action: ask the user to add a new device administrator to the system. 826 * The desired policy is the ComponentName of the policy in the 827 * {@link #EXTRA_DEVICE_ADMIN} extra field. This will invoke a UI to 828 * bring the user through adding the device administrator to the system (or 829 * allowing them to reject it). 830 * 831 * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION} 832 * field to provide the user with additional explanation (in addition 833 * to your component's description) about what is being added. 834 * 835 * <p>If your administrator is already active, this will ordinarily return immediately (without 836 * user intervention). However, if your administrator has been updated and is requesting 837 * additional uses-policy flags, the user will be presented with the new list. New policies 838 * will not be available to the updated administrator until the user has accepted the new list. 839 */ 840 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 841 public static final String ACTION_ADD_DEVICE_ADMIN 842 = "android.app.action.ADD_DEVICE_ADMIN"; 843 844 /** 845 * @hide 846 * Activity action: ask the user to add a new device administrator as the profile owner 847 * for this user. Only system apps can launch this intent. 848 * 849 * <p>The ComponentName of the profile owner admin is passed in the {@link #EXTRA_DEVICE_ADMIN} 850 * extra field. This will invoke a UI to bring the user through adding the profile owner admin 851 * to remotely control restrictions on the user. 852 * 853 * <p>The intent must be invoked via {@link Activity#startActivityForResult} to receive the 854 * result of whether or not the user approved the action. If approved, the result will 855 * be {@link Activity#RESULT_OK} and the component will be set as an active admin as well 856 * as a profile owner. 857 * 858 * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION} 859 * field to provide the user with additional explanation (in addition 860 * to your component's description) about what is being added. 861 * 862 * <p>If there is already a profile owner active or the caller is not a system app, the 863 * operation will return a failure result. 864 */ 865 @SystemApi 866 public static final String ACTION_SET_PROFILE_OWNER 867 = "android.app.action.SET_PROFILE_OWNER"; 868 869 /** 870 * @hide 871 * Name of the profile owner admin that controls the user. 872 */ 873 @SystemApi 874 public static final String EXTRA_PROFILE_OWNER_NAME 875 = "android.app.extra.PROFILE_OWNER_NAME"; 876 877 /** 878 * Broadcast action: send when any policy admin changes a policy. 879 * This is generally used to find out when a new policy is in effect. 880 * 881 * @hide 882 */ 883 public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED 884 = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED"; 885 886 /** 887 * Broadcast action: sent when the device owner is set or changed. 888 * 889 * This broadcast is sent only to the primary user. 890 * @see #ACTION_PROVISION_MANAGED_DEVICE 891 */ 892 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 893 public static final String ACTION_DEVICE_OWNER_CHANGED 894 = "android.app.action.DEVICE_OWNER_CHANGED"; 895 896 /** 897 * The ComponentName of the administrator component. 898 * 899 * @see #ACTION_ADD_DEVICE_ADMIN 900 */ 901 public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN"; 902 903 /** 904 * An optional CharSequence providing additional explanation for why the 905 * admin is being added. 906 * 907 * @see #ACTION_ADD_DEVICE_ADMIN 908 */ 909 public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION"; 910 911 /** 912 * Activity action: have the user enter a new password. This activity should 913 * be launched after using {@link #setPasswordQuality(ComponentName, int)}, 914 * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user 915 * enter a new password that meets the current requirements. You can use 916 * {@link #isActivePasswordSufficient()} to determine whether you need to 917 * have the user select a new password in order to meet the current 918 * constraints. Upon being resumed from this activity, you can check the new 919 * password characteristics to see if they are sufficient. 920 * 921 * If the intent is launched from within a managed profile with a profile 922 * owner built against {@link android.os.Build.VERSION_CODES#M} or before, 923 * this will trigger entering a new password for the parent of the profile. 924 * For all other cases it will trigger entering a new password for the user 925 * or profile it is launched from. 926 * 927 * @see #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 928 */ 929 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 930 public static final String ACTION_SET_NEW_PASSWORD 931 = "android.app.action.SET_NEW_PASSWORD"; 932 933 /** 934 * Activity action: have the user enter a new password for the parent profile. 935 * If the intent is launched from within a managed profile, this will trigger 936 * entering a new password for the parent of the profile. In all other cases 937 * the behaviour is identical to {@link #ACTION_SET_NEW_PASSWORD}. 938 */ 939 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 940 public static final String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 941 = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD"; 942 943 /** 944 * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in 945 * the parent profile to access intents sent from the managed profile. 946 * That is, when an app in the managed profile calls 947 * {@link Activity#startActivity(Intent)}, the intent can be resolved by a 948 * matching activity in the parent profile. 949 */ 950 public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 0x0001; 951 952 /** 953 * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in 954 * the managed profile to access intents sent from the parent profile. 955 * That is, when an app in the parent profile calls 956 * {@link Activity#startActivity(Intent)}, the intent can be resolved by a 957 * matching activity in the managed profile. 958 */ 959 public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 0x0002; 960 961 /** 962 * Broadcast action: notify that a new local system update policy has been set by the device 963 * owner. The new policy can be retrieved by {@link #getSystemUpdatePolicy()}. 964 */ 965 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 966 public static final String ACTION_SYSTEM_UPDATE_POLICY_CHANGED 967 = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED"; 968 969 /** 970 * Permission policy to prompt user for new permission requests for runtime permissions. 971 * Already granted or denied permissions are not affected by this. 972 */ 973 public static final int PERMISSION_POLICY_PROMPT = 0; 974 975 /** 976 * Permission policy to always grant new permission requests for runtime permissions. 977 * Already granted or denied permissions are not affected by this. 978 */ 979 public static final int PERMISSION_POLICY_AUTO_GRANT = 1; 980 981 /** 982 * Permission policy to always deny new permission requests for runtime permissions. 983 * Already granted or denied permissions are not affected by this. 984 */ 985 public static final int PERMISSION_POLICY_AUTO_DENY = 2; 986 987 /** 988 * Runtime permission state: The user can manage the permission 989 * through the UI. 990 */ 991 public static final int PERMISSION_GRANT_STATE_DEFAULT = 0; 992 993 /** 994 * Runtime permission state: The permission is granted to the app 995 * and the user cannot manage the permission through the UI. 996 */ 997 public static final int PERMISSION_GRANT_STATE_GRANTED = 1; 998 999 /** 1000 * Runtime permission state: The permission is denied to the app 1001 * and the user cannot manage the permission through the UI. 1002 */ 1003 public static final int PERMISSION_GRANT_STATE_DENIED = 2; 1004 1005 /** 1006 * No management for current user in-effect. This is the default. 1007 * @hide 1008 */ 1009 @SystemApi 1010 public static final int STATE_USER_UNMANAGED = 0; 1011 1012 /** 1013 * Management partially setup, user setup needs to be completed. 1014 * @hide 1015 */ 1016 @SystemApi 1017 public static final int STATE_USER_SETUP_INCOMPLETE = 1; 1018 1019 /** 1020 * Management partially setup, user setup completed. 1021 * @hide 1022 */ 1023 @SystemApi 1024 public static final int STATE_USER_SETUP_COMPLETE = 2; 1025 1026 /** 1027 * Management setup and active on current user. 1028 * @hide 1029 */ 1030 @SystemApi 1031 public static final int STATE_USER_SETUP_FINALIZED = 3; 1032 1033 /** 1034 * Management partially setup on a managed profile. 1035 * @hide 1036 */ 1037 @SystemApi 1038 public static final int STATE_USER_PROFILE_COMPLETE = 4; 1039 1040 /** 1041 * @hide 1042 */ 1043 @IntDef({STATE_USER_UNMANAGED, STATE_USER_SETUP_INCOMPLETE, STATE_USER_SETUP_COMPLETE, 1044 STATE_USER_SETUP_FINALIZED, STATE_USER_PROFILE_COMPLETE}) 1045 @Retention(RetentionPolicy.SOURCE) 1046 public @interface UserProvisioningState {} 1047 1048 /** 1049 * Return true if the given administrator component is currently active (enabled) in the system. 1050 * 1051 * @param admin The administrator component to check for. 1052 * @return {@code true} if {@code admin} is currently enabled in the system, {@code false} 1053 * otherwise 1054 */ isAdminActive(@onNull ComponentName admin)1055 public boolean isAdminActive(@NonNull ComponentName admin) { 1056 return isAdminActiveAsUser(admin, myUserId()); 1057 } 1058 1059 /** 1060 * @see #isAdminActive(ComponentName) 1061 * @hide 1062 */ isAdminActiveAsUser(@onNull ComponentName admin, int userId)1063 public boolean isAdminActiveAsUser(@NonNull ComponentName admin, int userId) { 1064 if (mService != null) { 1065 try { 1066 return mService.isAdminActive(admin, userId); 1067 } catch (RemoteException e) { 1068 throw e.rethrowFromSystemServer(); 1069 } 1070 } 1071 return false; 1072 } 1073 /** 1074 * Return true if the given administrator component is currently being removed 1075 * for the user. 1076 * @hide 1077 */ isRemovingAdmin(@onNull ComponentName admin, int userId)1078 public boolean isRemovingAdmin(@NonNull ComponentName admin, int userId) { 1079 if (mService != null) { 1080 try { 1081 return mService.isRemovingAdmin(admin, userId); 1082 } catch (RemoteException e) { 1083 throw e.rethrowFromSystemServer(); 1084 } 1085 } 1086 return false; 1087 } 1088 1089 1090 /** 1091 * Return a list of all currently active device administrators' component 1092 * names. If there are no administrators {@code null} may be 1093 * returned. 1094 */ getActiveAdmins()1095 public List<ComponentName> getActiveAdmins() { 1096 throwIfParentInstance("getActiveAdmins"); 1097 return getActiveAdminsAsUser(myUserId()); 1098 } 1099 1100 /** 1101 * @see #getActiveAdmins() 1102 * @hide 1103 */ getActiveAdminsAsUser(int userId)1104 public List<ComponentName> getActiveAdminsAsUser(int userId) { 1105 if (mService != null) { 1106 try { 1107 return mService.getActiveAdmins(userId); 1108 } catch (RemoteException e) { 1109 throw e.rethrowFromSystemServer(); 1110 } 1111 } 1112 return null; 1113 } 1114 1115 /** 1116 * Used by package administration code to determine if a package can be stopped 1117 * or uninstalled. 1118 * @hide 1119 */ packageHasActiveAdmins(String packageName)1120 public boolean packageHasActiveAdmins(String packageName) { 1121 return packageHasActiveAdmins(packageName, myUserId()); 1122 } 1123 1124 /** 1125 * Used by package administration code to determine if a package can be stopped 1126 * or uninstalled. 1127 * @hide 1128 */ packageHasActiveAdmins(String packageName, int userId)1129 public boolean packageHasActiveAdmins(String packageName, int userId) { 1130 if (mService != null) { 1131 try { 1132 return mService.packageHasActiveAdmins(packageName, userId); 1133 } catch (RemoteException e) { 1134 throw e.rethrowFromSystemServer(); 1135 } 1136 } 1137 return false; 1138 } 1139 1140 /** 1141 * Remove a current administration component. This can only be called 1142 * by the application that owns the administration component; if you 1143 * try to remove someone else's component, a security exception will be 1144 * thrown. 1145 * 1146 * <p>Note that the operation is not synchronous and the admin might still be active (as 1147 * indicated by {@link #getActiveAdmins()}) by the time this method returns. 1148 * 1149 * @param admin The administration compononent to remove. 1150 * @throws SecurityException if the caller is not in the owner application of {@code admin}. 1151 */ removeActiveAdmin(@onNull ComponentName admin)1152 public void removeActiveAdmin(@NonNull ComponentName admin) { 1153 throwIfParentInstance("removeActiveAdmin"); 1154 if (mService != null) { 1155 try { 1156 mService.removeActiveAdmin(admin, myUserId()); 1157 } catch (RemoteException e) { 1158 throw e.rethrowFromSystemServer(); 1159 } 1160 } 1161 } 1162 1163 /** 1164 * Returns true if an administrator has been granted a particular device policy. This can be 1165 * used to check whether the administrator was activated under an earlier set of policies, but 1166 * requires additional policies after an upgrade. 1167 * 1168 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be an 1169 * active administrator, or an exception will be thrown. 1170 * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}. 1171 * @throws SecurityException if {@code admin} is not an active administrator. 1172 */ hasGrantedPolicy(@onNull ComponentName admin, int usesPolicy)1173 public boolean hasGrantedPolicy(@NonNull ComponentName admin, int usesPolicy) { 1174 throwIfParentInstance("hasGrantedPolicy"); 1175 if (mService != null) { 1176 try { 1177 return mService.hasGrantedPolicy(admin, usesPolicy, myUserId()); 1178 } catch (RemoteException e) { 1179 throw e.rethrowFromSystemServer(); 1180 } 1181 } 1182 return false; 1183 } 1184 1185 /** 1186 * Returns true if the Profile Challenge is available to use for the given profile user. 1187 * 1188 * @hide 1189 */ isSeparateProfileChallengeAllowed(int userHandle)1190 public boolean isSeparateProfileChallengeAllowed(int userHandle) { 1191 if (mService != null) { 1192 try { 1193 return mService.isSeparateProfileChallengeAllowed(userHandle); 1194 } catch (RemoteException e) { 1195 throw e.rethrowFromSystemServer(); 1196 } 1197 } 1198 return false; 1199 } 1200 1201 /** 1202 * Constant for {@link #setPasswordQuality}: the policy has no requirements 1203 * for the password. Note that quality constants are ordered so that higher 1204 * values are more restrictive. 1205 */ 1206 public static final int PASSWORD_QUALITY_UNSPECIFIED = 0; 1207 1208 /** 1209 * Constant for {@link #setPasswordQuality}: the policy allows for low-security biometric 1210 * recognition technology. This implies technologies that can recognize the identity of 1211 * an individual to about a 3 digit PIN (false detection is less than 1 in 1,000). 1212 * Note that quality constants are ordered so that higher values are more restrictive. 1213 */ 1214 public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 0x8000; 1215 1216 /** 1217 * Constant for {@link #setPasswordQuality}: the policy requires some kind 1218 * of password or pattern, but doesn't care what it is. Note that quality constants 1219 * are ordered so that higher values are more restrictive. 1220 */ 1221 public static final int PASSWORD_QUALITY_SOMETHING = 0x10000; 1222 1223 /** 1224 * Constant for {@link #setPasswordQuality}: the user must have entered a 1225 * password containing at least numeric characters. Note that quality 1226 * constants are ordered so that higher values are more restrictive. 1227 */ 1228 public static final int PASSWORD_QUALITY_NUMERIC = 0x20000; 1229 1230 /** 1231 * Constant for {@link #setPasswordQuality}: the user must have entered a 1232 * password containing at least numeric characters with no repeating (4444) 1233 * or ordered (1234, 4321, 2468) sequences. Note that quality 1234 * constants are ordered so that higher values are more restrictive. 1235 */ 1236 public static final int PASSWORD_QUALITY_NUMERIC_COMPLEX = 0x30000; 1237 1238 /** 1239 * Constant for {@link #setPasswordQuality}: the user must have entered a 1240 * password containing at least alphabetic (or other symbol) characters. 1241 * Note that quality constants are ordered so that higher values are more 1242 * restrictive. 1243 */ 1244 public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000; 1245 1246 /** 1247 * Constant for {@link #setPasswordQuality}: the user must have entered a 1248 * password containing at least <em>both></em> numeric <em>and</em> 1249 * alphabetic (or other symbol) characters. Note that quality constants are 1250 * ordered so that higher values are more restrictive. 1251 */ 1252 public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000; 1253 1254 /** 1255 * Constant for {@link #setPasswordQuality}: the user must have entered a 1256 * password containing at least a letter, a numerical digit and a special 1257 * symbol, by default. With this password quality, passwords can be 1258 * restricted to contain various sets of characters, like at least an 1259 * uppercase letter, etc. These are specified using various methods, 1260 * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note 1261 * that quality constants are ordered so that higher values are more 1262 * restrictive. 1263 */ 1264 public static final int PASSWORD_QUALITY_COMPLEX = 0x60000; 1265 1266 /** 1267 * Constant for {@link #setPasswordQuality}: the user is not allowed to 1268 * modify password. In case this password quality is set, the password is 1269 * managed by a profile owner. The profile owner can set any password, 1270 * as if {@link #PASSWORD_QUALITY_UNSPECIFIED} is used. Note 1271 * that quality constants are ordered so that higher values are more 1272 * restrictive. The value of {@link #PASSWORD_QUALITY_MANAGED} is 1273 * the highest. 1274 * @hide 1275 */ 1276 public static final int PASSWORD_QUALITY_MANAGED = 0x80000; 1277 1278 /** 1279 * Called by an application that is administering the device to set the password restrictions it 1280 * is imposing. After setting this, the user will not be able to enter a new password that is 1281 * not at least as restrictive as what has been set. Note that the current password will remain 1282 * until the user has set a new one, so the change does not take place immediately. To prompt 1283 * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or 1284 * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after calling this method. 1285 * <p> 1286 * Quality constants are ordered so that higher values are more restrictive; thus the highest 1287 * requested quality constant (between the policy set here, the user's preference, and any other 1288 * considerations) is the one that is in effect. 1289 * <p> 1290 * The calling device admin must have requested 1291 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1292 * not, a security exception will be thrown. 1293 * <p> 1294 * This method can be called on the {@link DevicePolicyManager} instance returned by 1295 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1296 * profile. 1297 * 1298 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1299 * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED}, 1300 * {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC}, 1301 * {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, 1302 * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. 1303 * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin} 1304 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1305 */ setPasswordQuality(@onNull ComponentName admin, int quality)1306 public void setPasswordQuality(@NonNull ComponentName admin, int quality) { 1307 if (mService != null) { 1308 try { 1309 mService.setPasswordQuality(admin, quality, mParentInstance); 1310 } catch (RemoteException e) { 1311 throw e.rethrowFromSystemServer(); 1312 } 1313 } 1314 } 1315 1316 /** 1317 * Retrieve the current minimum password quality for a particular admin or all admins that set 1318 * restrictions on this user and its participating profiles. Restrictions on profiles that have 1319 * a separate challenge are not taken into account. 1320 * 1321 * <p>This method can be called on the {@link DevicePolicyManager} instance 1322 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1323 * restrictions on the parent profile. 1324 * 1325 * @param admin The name of the admin component to check, or {@code null} to aggregate 1326 * all admins. 1327 */ getPasswordQuality(@ullable ComponentName admin)1328 public int getPasswordQuality(@Nullable ComponentName admin) { 1329 return getPasswordQuality(admin, myUserId()); 1330 } 1331 1332 /** @hide per-user version */ getPasswordQuality(@ullable ComponentName admin, int userHandle)1333 public int getPasswordQuality(@Nullable ComponentName admin, int userHandle) { 1334 if (mService != null) { 1335 try { 1336 return mService.getPasswordQuality(admin, userHandle, mParentInstance); 1337 } catch (RemoteException e) { 1338 throw e.rethrowFromSystemServer(); 1339 } 1340 } 1341 return PASSWORD_QUALITY_UNSPECIFIED; 1342 } 1343 1344 /** 1345 * Called by an application that is administering the device to set the minimum allowed password 1346 * length. After setting this, the user will not be able to enter a new password that is not at 1347 * least as restrictive as what has been set. Note that the current password will remain until 1348 * the user has set a new one, so the change does not take place immediately. To prompt the user 1349 * for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or 1350 * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is 1351 * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC} 1352 * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, 1353 * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} with 1354 * {@link #setPasswordQuality}. 1355 * <p> 1356 * The calling device admin must have requested 1357 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1358 * not, a security exception will be thrown. 1359 * <p> 1360 * This method can be called on the {@link DevicePolicyManager} instance returned by 1361 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1362 * profile. 1363 * 1364 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1365 * @param length The new desired minimum password length. A value of 0 means there is no 1366 * restriction. 1367 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1368 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1369 */ setPasswordMinimumLength(@onNull ComponentName admin, int length)1370 public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) { 1371 if (mService != null) { 1372 try { 1373 mService.setPasswordMinimumLength(admin, length, mParentInstance); 1374 } catch (RemoteException e) { 1375 throw e.rethrowFromSystemServer(); 1376 } 1377 } 1378 } 1379 1380 /** 1381 * Retrieve the current minimum password length for a particular admin or all admins that set 1382 * restrictions on this user and its participating profiles. Restrictions on profiles that have 1383 * a separate challenge are not taken into account. 1384 * 1385 * <p>This method can be called on the {@link DevicePolicyManager} instance 1386 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1387 * restrictions on the parent profile. 1388 * 1389 * user and its profiles or a particular one. 1390 * @param admin The name of the admin component to check, or {@code null} to aggregate 1391 * all admins. 1392 */ getPasswordMinimumLength(@ullable ComponentName admin)1393 public int getPasswordMinimumLength(@Nullable ComponentName admin) { 1394 return getPasswordMinimumLength(admin, myUserId()); 1395 } 1396 1397 /** @hide per-user version */ getPasswordMinimumLength(@ullable ComponentName admin, int userHandle)1398 public int getPasswordMinimumLength(@Nullable ComponentName admin, int userHandle) { 1399 if (mService != null) { 1400 try { 1401 return mService.getPasswordMinimumLength(admin, userHandle, mParentInstance); 1402 } catch (RemoteException e) { 1403 throw e.rethrowFromSystemServer(); 1404 } 1405 } 1406 return 0; 1407 } 1408 1409 /** 1410 * Called by an application that is administering the device to set the minimum number of upper 1411 * case letters required in the password. After setting this, the user will not be able to enter 1412 * a new password that is not at least as restrictive as what has been set. Note that the 1413 * current password will remain until the user has set a new one, so the change does not take 1414 * place immediately. To prompt the user for a new password, use 1415 * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after 1416 * setting this value. This constraint is only imposed if the administrator has also requested 1417 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. 1418 * <p> 1419 * The calling device admin must have requested 1420 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1421 * not, a security exception will be thrown. 1422 * <p> 1423 * This method can be called on the {@link DevicePolicyManager} instance returned by 1424 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1425 * profile. 1426 * 1427 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1428 * @param length The new desired minimum number of upper case letters required in the password. 1429 * A value of 0 means there is no restriction. 1430 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1431 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1432 */ setPasswordMinimumUpperCase(@onNull ComponentName admin, int length)1433 public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) { 1434 if (mService != null) { 1435 try { 1436 mService.setPasswordMinimumUpperCase(admin, length, mParentInstance); 1437 } catch (RemoteException e) { 1438 throw e.rethrowFromSystemServer(); 1439 } 1440 } 1441 } 1442 1443 /** 1444 * Retrieve the current number of upper case letters required in the password 1445 * for a particular admin or all admins that set restrictions on this user and 1446 * its participating profiles. Restrictions on profiles that have a separate challenge 1447 * are not taken into account. 1448 * This is the same value as set by 1449 * {@link #setPasswordMinimumUpperCase(ComponentName, int)} 1450 * and only applies when the password quality is 1451 * {@link #PASSWORD_QUALITY_COMPLEX}. 1452 * 1453 * <p>This method can be called on the {@link DevicePolicyManager} instance 1454 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1455 * restrictions on the parent profile. 1456 * 1457 * @param admin The name of the admin component to check, or {@code null} to 1458 * aggregate all admins. 1459 * @return The minimum number of upper case letters required in the 1460 * password. 1461 */ getPasswordMinimumUpperCase(@ullable ComponentName admin)1462 public int getPasswordMinimumUpperCase(@Nullable ComponentName admin) { 1463 return getPasswordMinimumUpperCase(admin, myUserId()); 1464 } 1465 1466 /** @hide per-user version */ getPasswordMinimumUpperCase(@ullable ComponentName admin, int userHandle)1467 public int getPasswordMinimumUpperCase(@Nullable ComponentName admin, int userHandle) { 1468 if (mService != null) { 1469 try { 1470 return mService.getPasswordMinimumUpperCase(admin, userHandle, mParentInstance); 1471 } catch (RemoteException e) { 1472 throw e.rethrowFromSystemServer(); 1473 } 1474 } 1475 return 0; 1476 } 1477 1478 /** 1479 * Called by an application that is administering the device to set the minimum number of lower 1480 * case letters required in the password. After setting this, the user will not be able to enter 1481 * a new password that is not at least as restrictive as what has been set. Note that the 1482 * current password will remain until the user has set a new one, so the change does not take 1483 * place immediately. To prompt the user for a new password, use 1484 * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after 1485 * setting this value. This constraint is only imposed if the administrator has also requested 1486 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. 1487 * <p> 1488 * The calling device admin must have requested 1489 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1490 * not, a security exception will be thrown. 1491 * <p> 1492 * This method can be called on the {@link DevicePolicyManager} instance returned by 1493 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1494 * profile. 1495 * 1496 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1497 * @param length The new desired minimum number of lower case letters required in the password. 1498 * A value of 0 means there is no restriction. 1499 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1500 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1501 */ setPasswordMinimumLowerCase(@onNull ComponentName admin, int length)1502 public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) { 1503 if (mService != null) { 1504 try { 1505 mService.setPasswordMinimumLowerCase(admin, length, mParentInstance); 1506 } catch (RemoteException e) { 1507 throw e.rethrowFromSystemServer(); 1508 } 1509 } 1510 } 1511 1512 /** 1513 * Retrieve the current number of lower case letters required in the password 1514 * for a particular admin or all admins that set restrictions on this user 1515 * and its participating profiles. Restrictions on profiles that have 1516 * a separate challenge are not taken into account. 1517 * This is the same value as set by 1518 * {@link #setPasswordMinimumLowerCase(ComponentName, int)} 1519 * and only applies when the password quality is 1520 * {@link #PASSWORD_QUALITY_COMPLEX}. 1521 * 1522 * <p>This method can be called on the {@link DevicePolicyManager} instance 1523 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1524 * restrictions on the parent profile. 1525 * 1526 * @param admin The name of the admin component to check, or {@code null} to 1527 * aggregate all admins. 1528 * @return The minimum number of lower case letters required in the 1529 * password. 1530 */ getPasswordMinimumLowerCase(@ullable ComponentName admin)1531 public int getPasswordMinimumLowerCase(@Nullable ComponentName admin) { 1532 return getPasswordMinimumLowerCase(admin, myUserId()); 1533 } 1534 1535 /** @hide per-user version */ getPasswordMinimumLowerCase(@ullable ComponentName admin, int userHandle)1536 public int getPasswordMinimumLowerCase(@Nullable ComponentName admin, int userHandle) { 1537 if (mService != null) { 1538 try { 1539 return mService.getPasswordMinimumLowerCase(admin, userHandle, mParentInstance); 1540 } catch (RemoteException e) { 1541 throw e.rethrowFromSystemServer(); 1542 } 1543 } 1544 return 0; 1545 } 1546 1547 /** 1548 * Called by an application that is administering the device to set the minimum number of 1549 * letters required in the password. After setting this, the user will not be able to enter a 1550 * new password that is not at least as restrictive as what has been set. Note that the current 1551 * password will remain until the user has set a new one, so the change does not take place 1552 * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or 1553 * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is 1554 * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with 1555 * {@link #setPasswordQuality}. The default value is 1. 1556 * <p> 1557 * The calling device admin must have requested 1558 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1559 * not, a security exception will be thrown. 1560 * <p> 1561 * This method can be called on the {@link DevicePolicyManager} instance returned by 1562 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1563 * profile. 1564 * 1565 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1566 * @param length The new desired minimum number of letters required in the password. A value of 1567 * 0 means there is no restriction. 1568 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1569 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1570 */ setPasswordMinimumLetters(@onNull ComponentName admin, int length)1571 public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) { 1572 if (mService != null) { 1573 try { 1574 mService.setPasswordMinimumLetters(admin, length, mParentInstance); 1575 } catch (RemoteException e) { 1576 throw e.rethrowFromSystemServer(); 1577 } 1578 } 1579 } 1580 1581 /** 1582 * Retrieve the current number of letters required in the password 1583 * for a particular admin or all admins that set restrictions on this user 1584 * and its participating profiles. Restrictions on profiles that have 1585 * a separate challenge are not taken into account. 1586 * This is the same value as set by 1587 * {@link #setPasswordMinimumLetters(ComponentName, int)} 1588 * and only applies when the password quality is 1589 * {@link #PASSWORD_QUALITY_COMPLEX}. 1590 * 1591 * <p>This method can be called on the {@link DevicePolicyManager} instance 1592 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1593 * restrictions on the parent profile. 1594 * 1595 * @param admin The name of the admin component to check, or {@code null} to 1596 * aggregate all admins. 1597 * @return The minimum number of letters required in the password. 1598 */ getPasswordMinimumLetters(@ullable ComponentName admin)1599 public int getPasswordMinimumLetters(@Nullable ComponentName admin) { 1600 return getPasswordMinimumLetters(admin, myUserId()); 1601 } 1602 1603 /** @hide per-user version */ getPasswordMinimumLetters(@ullable ComponentName admin, int userHandle)1604 public int getPasswordMinimumLetters(@Nullable ComponentName admin, int userHandle) { 1605 if (mService != null) { 1606 try { 1607 return mService.getPasswordMinimumLetters(admin, userHandle, mParentInstance); 1608 } catch (RemoteException e) { 1609 throw e.rethrowFromSystemServer(); 1610 } 1611 } 1612 return 0; 1613 } 1614 1615 /** 1616 * Called by an application that is administering the device to set the minimum number of 1617 * numerical digits required in the password. After setting this, the user will not be able to 1618 * enter a new password that is not at least as restrictive as what has been set. Note that the 1619 * current password will remain until the user has set a new one, so the change does not take 1620 * place immediately. To prompt the user for a new password, use 1621 * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after 1622 * setting this value. This constraint is only imposed if the administrator has also requested 1623 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 1. 1624 * <p> 1625 * The calling device admin must have requested 1626 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1627 * not, a security exception will be thrown. 1628 * <p> 1629 * This method can be called on the {@link DevicePolicyManager} instance returned by 1630 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1631 * profile. 1632 * 1633 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1634 * @param length The new desired minimum number of numerical digits required in the password. A 1635 * value of 0 means there is no restriction. 1636 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1637 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1638 */ setPasswordMinimumNumeric(@onNull ComponentName admin, int length)1639 public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) { 1640 if (mService != null) { 1641 try { 1642 mService.setPasswordMinimumNumeric(admin, length, mParentInstance); 1643 } catch (RemoteException e) { 1644 throw e.rethrowFromSystemServer(); 1645 } 1646 } 1647 } 1648 1649 /** 1650 * Retrieve the current number of numerical digits required in the password 1651 * for a particular admin or all admins that set restrictions on this user 1652 * and its participating profiles. Restrictions on profiles that have 1653 * a separate challenge are not taken into account. 1654 * This is the same value as set by 1655 * {@link #setPasswordMinimumNumeric(ComponentName, int)} 1656 * and only applies when the password quality is 1657 * {@link #PASSWORD_QUALITY_COMPLEX}. 1658 * 1659 * <p>This method can be called on the {@link DevicePolicyManager} instance 1660 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1661 * restrictions on the parent profile. 1662 * 1663 * @param admin The name of the admin component to check, or {@code null} to 1664 * aggregate all admins. 1665 * @return The minimum number of numerical digits required in the password. 1666 */ getPasswordMinimumNumeric(@ullable ComponentName admin)1667 public int getPasswordMinimumNumeric(@Nullable ComponentName admin) { 1668 return getPasswordMinimumNumeric(admin, myUserId()); 1669 } 1670 1671 /** @hide per-user version */ getPasswordMinimumNumeric(@ullable ComponentName admin, int userHandle)1672 public int getPasswordMinimumNumeric(@Nullable ComponentName admin, int userHandle) { 1673 if (mService != null) { 1674 try { 1675 return mService.getPasswordMinimumNumeric(admin, userHandle, mParentInstance); 1676 } catch (RemoteException e) { 1677 throw e.rethrowFromSystemServer(); 1678 } 1679 } 1680 return 0; 1681 } 1682 1683 /** 1684 * Called by an application that is administering the device to set the minimum number of 1685 * symbols required in the password. After setting this, the user will not be able to enter a 1686 * new password that is not at least as restrictive as what has been set. Note that the current 1687 * password will remain until the user has set a new one, so the change does not take place 1688 * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or 1689 * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is 1690 * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with 1691 * {@link #setPasswordQuality}. The default value is 1. 1692 * <p> 1693 * The calling device admin must have requested 1694 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1695 * not, a security exception will be thrown. 1696 * <p> 1697 * This method can be called on the {@link DevicePolicyManager} instance returned by 1698 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1699 * profile. 1700 * 1701 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1702 * @param length The new desired minimum number of symbols required in the password. A value of 1703 * 0 means there is no restriction. 1704 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1705 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1706 */ setPasswordMinimumSymbols(@onNull ComponentName admin, int length)1707 public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) { 1708 if (mService != null) { 1709 try { 1710 mService.setPasswordMinimumSymbols(admin, length, mParentInstance); 1711 } catch (RemoteException e) { 1712 throw e.rethrowFromSystemServer(); 1713 } 1714 } 1715 } 1716 1717 /** 1718 * Retrieve the current number of symbols required in the password 1719 * for a particular admin or all admins that set restrictions on this user 1720 * and its participating profiles. Restrictions on profiles that have 1721 * a separate challenge are not taken into account. This is the same value as 1722 * set by {@link #setPasswordMinimumSymbols(ComponentName, int)} 1723 * and only applies when the password quality is 1724 * {@link #PASSWORD_QUALITY_COMPLEX}. 1725 * 1726 * <p>This method can be called on the {@link DevicePolicyManager} instance 1727 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1728 * restrictions on the parent profile. 1729 * 1730 * @param admin The name of the admin component to check, or {@code null} to 1731 * aggregate all admins. 1732 * @return The minimum number of symbols required in the password. 1733 */ getPasswordMinimumSymbols(@ullable ComponentName admin)1734 public int getPasswordMinimumSymbols(@Nullable ComponentName admin) { 1735 return getPasswordMinimumSymbols(admin, myUserId()); 1736 } 1737 1738 /** @hide per-user version */ getPasswordMinimumSymbols(@ullable ComponentName admin, int userHandle)1739 public int getPasswordMinimumSymbols(@Nullable ComponentName admin, int userHandle) { 1740 if (mService != null) { 1741 try { 1742 return mService.getPasswordMinimumSymbols(admin, userHandle, mParentInstance); 1743 } catch (RemoteException e) { 1744 throw e.rethrowFromSystemServer(); 1745 } 1746 } 1747 return 0; 1748 } 1749 1750 /** 1751 * Called by an application that is administering the device to set the minimum number of 1752 * non-letter characters (numerical digits or symbols) required in the password. After setting 1753 * this, the user will not be able to enter a new password that is not at least as restrictive 1754 * as what has been set. Note that the current password will remain until the user has set a new 1755 * one, so the change does not take place immediately. To prompt the user for a new password, 1756 * use {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after 1757 * setting this value. This constraint is only imposed if the administrator has also requested 1758 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. 1759 * <p> 1760 * The calling device admin must have requested 1761 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1762 * not, a security exception will be thrown. 1763 * <p> 1764 * This method can be called on the {@link DevicePolicyManager} instance returned by 1765 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1766 * profile. 1767 * 1768 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1769 * @param length The new desired minimum number of letters required in the password. A value of 1770 * 0 means there is no restriction. 1771 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1772 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1773 */ setPasswordMinimumNonLetter(@onNull ComponentName admin, int length)1774 public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) { 1775 if (mService != null) { 1776 try { 1777 mService.setPasswordMinimumNonLetter(admin, length, mParentInstance); 1778 } catch (RemoteException e) { 1779 throw e.rethrowFromSystemServer(); 1780 } 1781 } 1782 } 1783 1784 /** 1785 * Retrieve the current number of non-letter characters required in the password 1786 * for a particular admin or all admins that set restrictions on this user 1787 * and its participating profiles. Restrictions on profiles that have 1788 * a separate challenge are not taken into account. 1789 * This is the same value as set by 1790 * {@link #setPasswordMinimumNonLetter(ComponentName, int)} 1791 * and only applies when the password quality is 1792 * {@link #PASSWORD_QUALITY_COMPLEX}. 1793 * 1794 * <p>This method can be called on the {@link DevicePolicyManager} instance 1795 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1796 * restrictions on the parent profile. 1797 * 1798 * @param admin The name of the admin component to check, or {@code null} to 1799 * aggregate all admins. 1800 * @return The minimum number of letters required in the password. 1801 */ getPasswordMinimumNonLetter(@ullable ComponentName admin)1802 public int getPasswordMinimumNonLetter(@Nullable ComponentName admin) { 1803 return getPasswordMinimumNonLetter(admin, myUserId()); 1804 } 1805 1806 /** @hide per-user version */ getPasswordMinimumNonLetter(@ullable ComponentName admin, int userHandle)1807 public int getPasswordMinimumNonLetter(@Nullable ComponentName admin, int userHandle) { 1808 if (mService != null) { 1809 try { 1810 return mService.getPasswordMinimumNonLetter(admin, userHandle, mParentInstance); 1811 } catch (RemoteException e) { 1812 throw e.rethrowFromSystemServer(); 1813 } 1814 } 1815 return 0; 1816 } 1817 1818 /** 1819 * Called by an application that is administering the device to set the length of the password 1820 * history. After setting this, the user will not be able to enter a new password that is the 1821 * same as any password in the history. Note that the current password will remain until the 1822 * user has set a new one, so the change does not take place immediately. To prompt the user for 1823 * a new password, use {@link #ACTION_SET_NEW_PASSWORD} or 1824 * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is 1825 * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC} 1826 * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX} {@link #PASSWORD_QUALITY_ALPHABETIC}, or 1827 * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}. 1828 * <p> 1829 * The calling device admin must have requested 1830 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1831 * not, a security exception will be thrown. 1832 * <p> 1833 * This method can be called on the {@link DevicePolicyManager} instance returned by 1834 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1835 * profile. 1836 * 1837 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1838 * @param length The new desired length of password history. A value of 0 means there is no 1839 * restriction. 1840 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1841 * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1842 */ setPasswordHistoryLength(@onNull ComponentName admin, int length)1843 public void setPasswordHistoryLength(@NonNull ComponentName admin, int length) { 1844 if (mService != null) { 1845 try { 1846 mService.setPasswordHistoryLength(admin, length, mParentInstance); 1847 } catch (RemoteException e) { 1848 throw e.rethrowFromSystemServer(); 1849 } 1850 } 1851 } 1852 1853 /** 1854 * Called by a device admin to set the password expiration timeout. Calling this method will 1855 * restart the countdown for password expiration for the given admin, as will changing the 1856 * device password (for all admins). 1857 * <p> 1858 * The provided timeout is the time delta in ms and will be added to the current time. For 1859 * example, to have the password expire 5 days from now, timeout would be 5 * 86400 * 1000 = 1860 * 432000000 ms for timeout. 1861 * <p> 1862 * To disable password expiration, a value of 0 may be used for timeout. 1863 * <p> 1864 * The calling device admin must have requested 1865 * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this method; if it has 1866 * not, a security exception will be thrown. 1867 * <p> 1868 * Note that setting the password will automatically reset the expiration time for all active 1869 * admins. Active admins do not need to explicitly call this method in that case. 1870 * <p> 1871 * This method can be called on the {@link DevicePolicyManager} instance returned by 1872 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 1873 * profile. 1874 * 1875 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1876 * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 means 1877 * there is no restriction (unlimited). 1878 * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} 1879 * does not use {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} 1880 */ setPasswordExpirationTimeout(@onNull ComponentName admin, long timeout)1881 public void setPasswordExpirationTimeout(@NonNull ComponentName admin, long timeout) { 1882 if (mService != null) { 1883 try { 1884 mService.setPasswordExpirationTimeout(admin, timeout, mParentInstance); 1885 } catch (RemoteException e) { 1886 throw e.rethrowFromSystemServer(); 1887 } 1888 } 1889 } 1890 1891 /** 1892 * Get the password expiration timeout for the given admin. The expiration timeout is the 1893 * recurring expiration timeout provided in the call to 1894 * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the 1895 * aggregate of all participating policy administrators if {@code admin} is null. Admins that 1896 * have set restrictions on profiles that have a separate challenge are not taken into account. 1897 * 1898 * <p>This method can be called on the {@link DevicePolicyManager} instance 1899 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1900 * restrictions on the parent profile. 1901 * 1902 * @param admin The name of the admin component to check, or {@code null} to aggregate all admins. 1903 * @return The timeout for the given admin or the minimum of all timeouts 1904 */ getPasswordExpirationTimeout(@ullable ComponentName admin)1905 public long getPasswordExpirationTimeout(@Nullable ComponentName admin) { 1906 if (mService != null) { 1907 try { 1908 return mService.getPasswordExpirationTimeout(admin, myUserId(), mParentInstance); 1909 } catch (RemoteException e) { 1910 throw e.rethrowFromSystemServer(); 1911 } 1912 } 1913 return 0; 1914 } 1915 1916 /** 1917 * Get the current password expiration time for a particular admin or all admins that set 1918 * restrictions on this user and its participating profiles. Restrictions on profiles that have 1919 * a separate challenge are not taken into account. If admin is {@code null}, then a composite 1920 * of all expiration times is returned - which will be the minimum of all of them. 1921 * 1922 * <p>This method can be called on the {@link DevicePolicyManager} instance 1923 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1924 * the password expiration for the parent profile. 1925 * 1926 * @param admin The name of the admin component to check, or {@code null} to aggregate all admins. 1927 * @return The password expiration time, in milliseconds since epoch. 1928 */ getPasswordExpiration(@ullable ComponentName admin)1929 public long getPasswordExpiration(@Nullable ComponentName admin) { 1930 if (mService != null) { 1931 try { 1932 return mService.getPasswordExpiration(admin, myUserId(), mParentInstance); 1933 } catch (RemoteException e) { 1934 throw e.rethrowFromSystemServer(); 1935 } 1936 } 1937 return 0; 1938 } 1939 1940 /** 1941 * Retrieve the current password history length for a particular admin or all admins that 1942 * set restrictions on this user and its participating profiles. Restrictions on profiles that 1943 * have a separate challenge are not taken into account. 1944 * 1945 * <p>This method can be called on the {@link DevicePolicyManager} instance 1946 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 1947 * restrictions on the parent profile. 1948 * 1949 * @param admin The name of the admin component to check, or {@code null} to aggregate 1950 * all admins. 1951 * @return The length of the password history 1952 */ getPasswordHistoryLength(@ullable ComponentName admin)1953 public int getPasswordHistoryLength(@Nullable ComponentName admin) { 1954 return getPasswordHistoryLength(admin, myUserId()); 1955 } 1956 1957 /** @hide per-user version */ getPasswordHistoryLength(@ullable ComponentName admin, int userHandle)1958 public int getPasswordHistoryLength(@Nullable ComponentName admin, int userHandle) { 1959 if (mService != null) { 1960 try { 1961 return mService.getPasswordHistoryLength(admin, userHandle, mParentInstance); 1962 } catch (RemoteException e) { 1963 throw e.rethrowFromSystemServer(); 1964 } 1965 } 1966 return 0; 1967 } 1968 1969 /** 1970 * Return the maximum password length that the device supports for a 1971 * particular password quality. 1972 * @param quality The quality being interrogated. 1973 * @return Returns the maximum length that the user can enter. 1974 */ getPasswordMaximumLength(int quality)1975 public int getPasswordMaximumLength(int quality) { 1976 // Kind-of arbitrary. 1977 return 16; 1978 } 1979 1980 /** 1981 * Determine whether the current password the user has set is sufficient to meet the policy 1982 * requirements (e.g. quality, minimum length) that have been requested by the admins of this 1983 * user and its participating profiles. Restrictions on profiles that have a separate challenge 1984 * are not taken into account. 1985 * <p> 1986 * The calling device admin must have requested 1987 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has 1988 * not, a security exception will be thrown. 1989 * <p> 1990 * This method can be called on the {@link DevicePolicyManager} instance returned by 1991 * {@link #getParentProfileInstance(ComponentName)} in order to determine if the password set on 1992 * the parent profile is sufficient. 1993 * 1994 * @return Returns true if the password meets the current requirements, else false. 1995 * @throws SecurityException if the calling application does not own an active administrator 1996 * that uses {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} 1997 */ isActivePasswordSufficient()1998 public boolean isActivePasswordSufficient() { 1999 if (mService != null) { 2000 try { 2001 return mService.isActivePasswordSufficient(myUserId(), mParentInstance); 2002 } catch (RemoteException e) { 2003 throw e.rethrowFromSystemServer(); 2004 } 2005 } 2006 return false; 2007 } 2008 2009 /** 2010 * Determine whether the current profile password the user has set is sufficient 2011 * to meet the policy requirements (e.g. quality, minimum length) that have been 2012 * requested by the admins of the parent user and its profiles. 2013 * 2014 * @param userHandle the userId of the profile to check the password for. 2015 * @return Returns true if the password would meet the current requirements, else false. 2016 * @throws SecurityException if {@code userHandle} is not a managed profile. 2017 * @hide 2018 */ isProfileActivePasswordSufficientForParent(int userHandle)2019 public boolean isProfileActivePasswordSufficientForParent(int userHandle) { 2020 if (mService != null) { 2021 try { 2022 return mService.isProfileActivePasswordSufficientForParent(userHandle); 2023 } catch (RemoteException e) { 2024 throw e.rethrowFromSystemServer(); 2025 } 2026 } 2027 return false; 2028 } 2029 2030 /** 2031 * Retrieve the number of times the user has failed at entering a password since that last 2032 * successful password entry. 2033 * <p> 2034 * This method can be called on the {@link DevicePolicyManager} instance returned by 2035 * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the number of failed 2036 * password attemts for the parent user. 2037 * <p> 2038 * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} 2039 * to be able to call this method; if it has not, a security exception will be thrown. 2040 * 2041 * @return The number of times user has entered an incorrect password since the last correct 2042 * password entry. 2043 * @throws SecurityException if the calling application does not own an active administrator 2044 * that uses {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} 2045 */ getCurrentFailedPasswordAttempts()2046 public int getCurrentFailedPasswordAttempts() { 2047 return getCurrentFailedPasswordAttempts(myUserId()); 2048 } 2049 2050 /** 2051 * Retrieve the number of times the given user has failed at entering a 2052 * password since that last successful password entry. 2053 * 2054 * <p>The calling device admin must have requested 2055 * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call this method; if it has 2056 * not and it is not the system uid, a security exception will be thrown. 2057 * 2058 * @hide 2059 */ getCurrentFailedPasswordAttempts(int userHandle)2060 public int getCurrentFailedPasswordAttempts(int userHandle) { 2061 if (mService != null) { 2062 try { 2063 return mService.getCurrentFailedPasswordAttempts(userHandle, mParentInstance); 2064 } catch (RemoteException e) { 2065 throw e.rethrowFromSystemServer(); 2066 } 2067 } 2068 return -1; 2069 } 2070 2071 /** 2072 * Queries whether {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT} flag is set. 2073 * 2074 * @return true if RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set. 2075 * @hide 2076 */ getDoNotAskCredentialsOnBoot()2077 public boolean getDoNotAskCredentialsOnBoot() { 2078 if (mService != null) { 2079 try { 2080 return mService.getDoNotAskCredentialsOnBoot(); 2081 } catch (RemoteException e) { 2082 throw e.rethrowFromSystemServer(); 2083 } 2084 } 2085 return false; 2086 } 2087 2088 /** 2089 * Setting this to a value greater than zero enables a built-in policy that will perform a 2090 * device or profile wipe after too many incorrect device-unlock passwords have been entered. 2091 * This built-in policy combines watching for failed passwords and wiping the device, and 2092 * requires that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and 2093 * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}. 2094 * <p> 2095 * To implement any other policy (e.g. wiping data for a particular application only, erasing or 2096 * revoking credentials, or reporting the failure to a server), you should implement 2097 * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} instead. Do not 2098 * use this API, because if the maximum count is reached, the device or profile will be wiped 2099 * immediately, and your callback will not be invoked. 2100 * <p> 2101 * This method can be called on the {@link DevicePolicyManager} instance returned by 2102 * {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent 2103 * profile. 2104 * 2105 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2106 * @param num The number of failed password attempts at which point the device or profile will 2107 * be wiped. 2108 * @throws SecurityException if {@code admin} is not an active administrator or does not use 2109 * both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and 2110 * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}. 2111 */ setMaximumFailedPasswordsForWipe(@onNull ComponentName admin, int num)2112 public void setMaximumFailedPasswordsForWipe(@NonNull ComponentName admin, int num) { 2113 if (mService != null) { 2114 try { 2115 mService.setMaximumFailedPasswordsForWipe(admin, num, mParentInstance); 2116 } catch (RemoteException e) { 2117 throw e.rethrowFromSystemServer(); 2118 } 2119 } 2120 } 2121 2122 /** 2123 * Retrieve the current maximum number of login attempts that are allowed before the device 2124 * or profile is wiped, for a particular admin or all admins that set restrictions on this user 2125 * and its participating profiles. Restrictions on profiles that have a separate challenge are 2126 * not taken into account. 2127 * 2128 * <p>This method can be called on the {@link DevicePolicyManager} instance 2129 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 2130 * the value for the parent profile. 2131 * 2132 * @param admin The name of the admin component to check, or {@code null} to aggregate 2133 * all admins. 2134 */ getMaximumFailedPasswordsForWipe(@ullable ComponentName admin)2135 public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin) { 2136 return getMaximumFailedPasswordsForWipe(admin, myUserId()); 2137 } 2138 2139 /** @hide per-user version */ getMaximumFailedPasswordsForWipe(@ullable ComponentName admin, int userHandle)2140 public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) { 2141 if (mService != null) { 2142 try { 2143 return mService.getMaximumFailedPasswordsForWipe( 2144 admin, userHandle, mParentInstance); 2145 } catch (RemoteException e) { 2146 throw e.rethrowFromSystemServer(); 2147 } 2148 } 2149 return 0; 2150 } 2151 2152 /** 2153 * Returns the profile with the smallest maximum failed passwords for wipe, 2154 * for the given user. So for primary user, it might return the primary or 2155 * a managed profile. For a secondary user, it would be the same as the 2156 * user passed in. 2157 * @hide Used only by Keyguard 2158 */ getProfileWithMinimumFailedPasswordsForWipe(int userHandle)2159 public int getProfileWithMinimumFailedPasswordsForWipe(int userHandle) { 2160 if (mService != null) { 2161 try { 2162 return mService.getProfileWithMinimumFailedPasswordsForWipe( 2163 userHandle, mParentInstance); 2164 } catch (RemoteException e) { 2165 throw e.rethrowFromSystemServer(); 2166 } 2167 } 2168 return UserHandle.USER_NULL; 2169 } 2170 2171 /** 2172 * Flag for {@link #resetPassword}: don't allow other admins to change 2173 * the password again until the user has entered it. 2174 */ 2175 public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001; 2176 2177 /** 2178 * Flag for {@link #resetPassword}: don't ask for user credentials on device boot. 2179 * If the flag is set, the device can be booted without asking for user password. 2180 * The absence of this flag does not change the current boot requirements. This flag 2181 * can be set by the device owner only. If the app is not the device owner, the flag 2182 * is ignored. Once the flag is set, it cannot be reverted back without resetting the 2183 * device to factory defaults. 2184 */ 2185 public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002; 2186 2187 /** 2188 * Force a new device unlock password (the password needed to access the entire device, not for 2189 * individual accounts) on the user. This takes effect immediately. 2190 * <p> 2191 * <em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for 2192 * device admins that are not device owner and not profile owner. 2193 * The password can now only be changed if there is currently no password set. Device owner 2194 * and profile owner can still do this when user is unlocked and does not have a managed 2195 * profile.</em> 2196 * <p> 2197 * The given password must be sufficient for the current password quality and length constraints 2198 * as returned by {@link #getPasswordQuality(ComponentName)} and 2199 * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then 2200 * it will be rejected and false returned. Note that the password may be a stronger quality 2201 * (containing alphanumeric characters when the requested quality is only numeric), in which 2202 * case the currently active quality will be increased to match. 2203 * <p> 2204 * Calling with a null or empty password will clear any existing PIN, pattern or password if the 2205 * current password constraints allow it. <em>Note: This will not work in 2206 * {@link android.os.Build.VERSION_CODES#N} and later for managed profiles, or for device admins 2207 * that are not device owner or profile owner. Once set, the password cannot be changed to null 2208 * or empty except by these admins.</em> 2209 * <p> 2210 * The calling device admin must have requested 2211 * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call this method; if it has 2212 * not, a security exception will be thrown. 2213 * 2214 * @param password The new password for the user. Null or empty clears the password. 2215 * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and 2216 * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. 2217 * @return Returns true if the password was applied, or false if it is not acceptable for the 2218 * current constraints or if the user has not been decrypted yet. 2219 * @throws SecurityException if the calling application does not own an active administrator 2220 * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} 2221 * @throws IllegalStateException if the calling user is locked or has a managed profile. 2222 */ resetPassword(String password, int flags)2223 public boolean resetPassword(String password, int flags) { 2224 throwIfParentInstance("resetPassword"); 2225 if (mService != null) { 2226 try { 2227 return mService.resetPassword(password, flags); 2228 } catch (RemoteException e) { 2229 throw e.rethrowFromSystemServer(); 2230 } 2231 } 2232 return false; 2233 } 2234 2235 /** 2236 * Called by an application that is administering the device to set the maximum time for user 2237 * activity until the device will lock. This limits the length that the user can set. It takes 2238 * effect immediately. 2239 * <p> 2240 * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} 2241 * to be able to call this method; if it has not, a security exception will be thrown. 2242 * <p> 2243 * This method can be called on the {@link DevicePolicyManager} instance returned by 2244 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 2245 * profile. 2246 * 2247 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2248 * @param timeMs The new desired maximum time to lock in milliseconds. A value of 0 means there 2249 * is no restriction. 2250 * @throws SecurityException if {@code admin} is not an active administrator or it does not use 2251 * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} 2252 */ setMaximumTimeToLock(@onNull ComponentName admin, long timeMs)2253 public void setMaximumTimeToLock(@NonNull ComponentName admin, long timeMs) { 2254 if (mService != null) { 2255 try { 2256 mService.setMaximumTimeToLock(admin, timeMs, mParentInstance); 2257 } catch (RemoteException e) { 2258 throw e.rethrowFromSystemServer(); 2259 } 2260 } 2261 } 2262 2263 /** 2264 * Retrieve the current maximum time to unlock for a particular admin or all admins that set 2265 * restrictions on this user and its participating profiles. Restrictions on profiles that have 2266 * a separate challenge are not taken into account. 2267 * 2268 * <p>This method can be called on the {@link DevicePolicyManager} instance 2269 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 2270 * restrictions on the parent profile. 2271 * 2272 * @param admin The name of the admin component to check, or {@code null} to aggregate 2273 * all admins. 2274 * @return time in milliseconds for the given admin or the minimum value (strictest) of 2275 * all admins if admin is null. Returns 0 if there are no restrictions. 2276 */ getMaximumTimeToLock(@ullable ComponentName admin)2277 public long getMaximumTimeToLock(@Nullable ComponentName admin) { 2278 return getMaximumTimeToLock(admin, myUserId()); 2279 } 2280 2281 /** @hide per-user version */ getMaximumTimeToLock(@ullable ComponentName admin, int userHandle)2282 public long getMaximumTimeToLock(@Nullable ComponentName admin, int userHandle) { 2283 if (mService != null) { 2284 try { 2285 return mService.getMaximumTimeToLock(admin, userHandle, mParentInstance); 2286 } catch (RemoteException e) { 2287 throw e.rethrowFromSystemServer(); 2288 } 2289 } 2290 return 0; 2291 } 2292 2293 /** 2294 * Returns maximum time to lock that applied by all profiles in this user. We do this because we 2295 * do not have a separate timeout to lock for work challenge only. 2296 * 2297 * @hide 2298 */ getMaximumTimeToLockForUserAndProfiles(int userHandle)2299 public long getMaximumTimeToLockForUserAndProfiles(int userHandle) { 2300 if (mService != null) { 2301 try { 2302 return mService.getMaximumTimeToLockForUserAndProfiles(userHandle); 2303 } catch (RemoteException e) { 2304 throw e.rethrowFromSystemServer(); 2305 } 2306 } 2307 return 0; 2308 } 2309 2310 /** 2311 * Make the device lock immediately, as if the lock screen timeout has expired at the point of 2312 * this call. 2313 * <p> 2314 * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} 2315 * to be able to call this method; if it has not, a security exception will be thrown. 2316 * <p> 2317 * This method can be called on the {@link DevicePolicyManager} instance returned by 2318 * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile. 2319 * 2320 * @throws SecurityException if the calling application does not own an active administrator 2321 * that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} 2322 */ lockNow()2323 public void lockNow() { 2324 if (mService != null) { 2325 try { 2326 mService.lockNow(mParentInstance); 2327 } catch (RemoteException e) { 2328 throw e.rethrowFromSystemServer(); 2329 } 2330 } 2331 } 2332 2333 /** 2334 * Flag for {@link #wipeData(int)}: also erase the device's external 2335 * storage (such as SD cards). 2336 */ 2337 public static final int WIPE_EXTERNAL_STORAGE = 0x0001; 2338 2339 /** 2340 * Flag for {@link #wipeData(int)}: also erase the factory reset protection 2341 * data. 2342 * 2343 * <p>This flag may only be set by device owner admins; if it is set by 2344 * other admins a {@link SecurityException} will be thrown. 2345 */ 2346 public static final int WIPE_RESET_PROTECTION_DATA = 0x0002; 2347 2348 /** 2349 * Ask the user data be wiped. Wiping the primary user will cause the device to reboot, erasing 2350 * all user data while next booting up. 2351 * <p> 2352 * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to 2353 * be able to call this method; if it has not, a security exception will be thrown. 2354 * 2355 * @param flags Bit mask of additional options: currently supported flags are 2356 * {@link #WIPE_EXTERNAL_STORAGE} and {@link #WIPE_RESET_PROTECTION_DATA}. 2357 * @throws SecurityException if the calling application does not own an active administrator 2358 * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} 2359 */ wipeData(int flags)2360 public void wipeData(int flags) { 2361 throwIfParentInstance("wipeData"); 2362 if (mService != null) { 2363 try { 2364 mService.wipeData(flags); 2365 } catch (RemoteException e) { 2366 throw e.rethrowFromSystemServer(); 2367 } 2368 } 2369 } 2370 2371 /** 2372 * Called by an application that is administering the device to set the 2373 * global proxy and exclusion list. 2374 * <p> 2375 * The calling device admin must have requested 2376 * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call 2377 * this method; if it has not, a security exception will be thrown. 2378 * Only the first device admin can set the proxy. If a second admin attempts 2379 * to set the proxy, the {@link ComponentName} of the admin originally setting the 2380 * proxy will be returned. If successful in setting the proxy, {@code null} will 2381 * be returned. 2382 * The method can be called repeatedly by the device admin alrady setting the 2383 * proxy to update the proxy and exclusion list. 2384 * 2385 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2386 * @param proxySpec the global proxy desired. Must be an HTTP Proxy. 2387 * Pass Proxy.NO_PROXY to reset the proxy. 2388 * @param exclusionList a list of domains to be excluded from the global proxy. 2389 * @return {@code null} if the proxy was successfully set, or otherwise a {@link ComponentName} 2390 * of the device admin that sets the proxy. 2391 * @hide 2392 */ setGlobalProxy(@onNull ComponentName admin, Proxy proxySpec, List<String> exclusionList )2393 public ComponentName setGlobalProxy(@NonNull ComponentName admin, Proxy proxySpec, 2394 List<String> exclusionList ) { 2395 throwIfParentInstance("setGlobalProxy"); 2396 if (proxySpec == null) { 2397 throw new NullPointerException(); 2398 } 2399 if (mService != null) { 2400 try { 2401 String hostSpec; 2402 String exclSpec; 2403 if (proxySpec.equals(Proxy.NO_PROXY)) { 2404 hostSpec = null; 2405 exclSpec = null; 2406 } else { 2407 if (!proxySpec.type().equals(Proxy.Type.HTTP)) { 2408 throw new IllegalArgumentException(); 2409 } 2410 InetSocketAddress sa = (InetSocketAddress)proxySpec.address(); 2411 String hostName = sa.getHostName(); 2412 int port = sa.getPort(); 2413 StringBuilder hostBuilder = new StringBuilder(); 2414 hostSpec = hostBuilder.append(hostName) 2415 .append(":").append(Integer.toString(port)).toString(); 2416 if (exclusionList == null) { 2417 exclSpec = ""; 2418 } else { 2419 StringBuilder listBuilder = new StringBuilder(); 2420 boolean firstDomain = true; 2421 for (String exclDomain : exclusionList) { 2422 if (!firstDomain) { 2423 listBuilder = listBuilder.append(","); 2424 } else { 2425 firstDomain = false; 2426 } 2427 listBuilder = listBuilder.append(exclDomain.trim()); 2428 } 2429 exclSpec = listBuilder.toString(); 2430 } 2431 if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec) 2432 != android.net.Proxy.PROXY_VALID) 2433 throw new IllegalArgumentException(); 2434 } 2435 return mService.setGlobalProxy(admin, hostSpec, exclSpec); 2436 } catch (RemoteException e) { 2437 throw e.rethrowFromSystemServer(); 2438 } 2439 } 2440 return null; 2441 } 2442 2443 /** 2444 * Set a network-independent global HTTP proxy. This is not normally what you want for typical 2445 * HTTP proxies - they are generally network dependent. However if you're doing something 2446 * unusual like general internal filtering this may be useful. On a private network where the 2447 * proxy is not accessible, you may break HTTP using this. 2448 * <p> 2449 * This method requires the caller to be the device owner. 2450 * <p> 2451 * This proxy is only a recommendation and it is possible that some apps will ignore it. 2452 * 2453 * @see ProxyInfo 2454 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2455 * @param proxyInfo The a {@link ProxyInfo} object defining the new global HTTP proxy. A 2456 * {@code null} value will clear the global HTTP proxy. 2457 * @throws SecurityException if {@code admin} is not the device owner. 2458 */ setRecommendedGlobalProxy(@onNull ComponentName admin, @Nullable ProxyInfo proxyInfo)2459 public void setRecommendedGlobalProxy(@NonNull ComponentName admin, @Nullable ProxyInfo 2460 proxyInfo) { 2461 throwIfParentInstance("setRecommendedGlobalProxy"); 2462 if (mService != null) { 2463 try { 2464 mService.setRecommendedGlobalProxy(admin, proxyInfo); 2465 } catch (RemoteException e) { 2466 throw e.rethrowFromSystemServer(); 2467 } 2468 } 2469 } 2470 2471 /** 2472 * Returns the component name setting the global proxy. 2473 * @return ComponentName object of the device admin that set the global proxy, or {@code null} 2474 * if no admin has set the proxy. 2475 * @hide 2476 */ getGlobalProxyAdmin()2477 public ComponentName getGlobalProxyAdmin() { 2478 if (mService != null) { 2479 try { 2480 return mService.getGlobalProxyAdmin(myUserId()); 2481 } catch (RemoteException e) { 2482 throw e.rethrowFromSystemServer(); 2483 } 2484 } 2485 return null; 2486 } 2487 2488 /** 2489 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 2490 * indicating that encryption is not supported. 2491 */ 2492 public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0; 2493 2494 /** 2495 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 2496 * indicating that encryption is supported, but is not currently active. 2497 */ 2498 public static final int ENCRYPTION_STATUS_INACTIVE = 1; 2499 2500 /** 2501 * Result code for {@link #getStorageEncryptionStatus}: 2502 * indicating that encryption is not currently active, but is currently 2503 * being activated. This is only reported by devices that support 2504 * encryption of data and only when the storage is currently 2505 * undergoing a process of becoming encrypted. A device that must reboot and/or wipe data 2506 * to become encrypted will never return this value. 2507 */ 2508 public static final int ENCRYPTION_STATUS_ACTIVATING = 2; 2509 2510 /** 2511 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 2512 * indicating that encryption is active. 2513 * <p> 2514 * Also see {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}. 2515 */ 2516 public static final int ENCRYPTION_STATUS_ACTIVE = 3; 2517 2518 /** 2519 * Result code for {@link #getStorageEncryptionStatus}: 2520 * indicating that encryption is active, but an encryption key has not 2521 * been set by the user. 2522 */ 2523 public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4; 2524 2525 /** 2526 * Result code for {@link #getStorageEncryptionStatus}: 2527 * indicating that encryption is active and the encryption key is tied to the user or profile. 2528 * <p> 2529 * This value is only returned to apps targeting API level 24 and above. For apps targeting 2530 * earlier API levels, {@link #ENCRYPTION_STATUS_ACTIVE} is returned, even if the 2531 * encryption key is specific to the user or profile. 2532 */ 2533 public static final int ENCRYPTION_STATUS_ACTIVE_PER_USER = 5; 2534 2535 /** 2536 * Activity action: begin the process of encrypting data on the device. This activity should 2537 * be launched after using {@link #setStorageEncryption} to request encryption be activated. 2538 * After resuming from this activity, use {@link #getStorageEncryption} 2539 * to check encryption status. However, on some devices this activity may never return, as 2540 * it may trigger a reboot and in some cases a complete data wipe of the device. 2541 */ 2542 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 2543 public static final String ACTION_START_ENCRYPTION 2544 = "android.app.action.START_ENCRYPTION"; 2545 /** 2546 * Widgets are enabled in keyguard 2547 */ 2548 public static final int KEYGUARD_DISABLE_FEATURES_NONE = 0; 2549 2550 /** 2551 * Disable all keyguard widgets. Has no effect. 2552 */ 2553 public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1 << 0; 2554 2555 /** 2556 * Disable the camera on secure keyguard screens (e.g. PIN/Pattern/Password) 2557 */ 2558 public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 1 << 1; 2559 2560 /** 2561 * Disable showing all notifications on secure keyguard screens (e.g. PIN/Pattern/Password) 2562 */ 2563 public static final int KEYGUARD_DISABLE_SECURE_NOTIFICATIONS = 1 << 2; 2564 2565 /** 2566 * Only allow redacted notifications on secure keyguard screens (e.g. PIN/Pattern/Password) 2567 */ 2568 public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 1 << 3; 2569 2570 /** 2571 * Ignore trust agent state on secure keyguard screens 2572 * (e.g. PIN/Pattern/Password). 2573 */ 2574 public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4; 2575 2576 /** 2577 * Disable fingerprint sensor on keyguard secure screens (e.g. PIN/Pattern/Password). 2578 */ 2579 public static final int KEYGUARD_DISABLE_FINGERPRINT = 1 << 5; 2580 2581 /** 2582 * Disable text entry into notifications on secure keyguard screens (e.g. PIN/Pattern/Password). 2583 */ 2584 public static final int KEYGUARD_DISABLE_REMOTE_INPUT = 1 << 6; 2585 2586 /** 2587 * Disable all current and future keyguard customizations. 2588 */ 2589 public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff; 2590 2591 /** 2592 * Called by an application that is administering the device to request that the storage system 2593 * be encrypted. 2594 * <p> 2595 * When multiple device administrators attempt to control device encryption, the most secure, 2596 * supported setting will always be used. If any device administrator requests device 2597 * encryption, it will be enabled; Conversely, if a device administrator attempts to disable 2598 * device encryption while another device administrator has enabled it, the call to disable will 2599 * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}). 2600 * <p> 2601 * This policy controls encryption of the secure (application data) storage area. Data written 2602 * to other storage areas may or may not be encrypted, and this policy does not require or 2603 * control the encryption of any other storage areas. There is one exception: If 2604 * {@link android.os.Environment#isExternalStorageEmulated()} is {@code true}, then the 2605 * directory returned by {@link android.os.Environment#getExternalStorageDirectory()} must be 2606 * written to disk within the encrypted storage area. 2607 * <p> 2608 * Important Note: On some devices, it is possible to encrypt storage without requiring the user 2609 * to create a device PIN or Password. In this case, the storage is encrypted, but the 2610 * encryption key may not be fully secured. For maximum security, the administrator should also 2611 * require (and check for) a pattern, PIN, or password. 2612 * 2613 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2614 * @param encrypt true to request encryption, false to release any previous request 2615 * @return the new request status (for all active admins) - will be one of 2616 * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or 2617 * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use 2618 * {@link #getStorageEncryptionStatus()} to query the actual device state. 2619 * @throws SecurityException if {@code admin} is not an active administrator or does not use 2620 * {@link DeviceAdminInfo#USES_ENCRYPTED_STORAGE} 2621 */ setStorageEncryption(@onNull ComponentName admin, boolean encrypt)2622 public int setStorageEncryption(@NonNull ComponentName admin, boolean encrypt) { 2623 throwIfParentInstance("setStorageEncryption"); 2624 if (mService != null) { 2625 try { 2626 return mService.setStorageEncryption(admin, encrypt); 2627 } catch (RemoteException e) { 2628 throw e.rethrowFromSystemServer(); 2629 } 2630 } 2631 return ENCRYPTION_STATUS_UNSUPPORTED; 2632 } 2633 2634 /** 2635 * Called by an application that is administering the device to 2636 * determine the requested setting for secure storage. 2637 * 2638 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null, 2639 * this will return the requested encryption setting as an aggregate of all active 2640 * administrators. 2641 * @return true if the admin(s) are requesting encryption, false if not. 2642 */ getStorageEncryption(@ullable ComponentName admin)2643 public boolean getStorageEncryption(@Nullable ComponentName admin) { 2644 throwIfParentInstance("getStorageEncryption"); 2645 if (mService != null) { 2646 try { 2647 return mService.getStorageEncryption(admin, myUserId()); 2648 } catch (RemoteException e) { 2649 throw e.rethrowFromSystemServer(); 2650 } 2651 } 2652 return false; 2653 } 2654 2655 /** 2656 * Called by an application that is administering the device to 2657 * determine the current encryption status of the device. 2658 * <p> 2659 * Depending on the returned status code, the caller may proceed in different 2660 * ways. If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the 2661 * storage system does not support encryption. If the 2662 * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link 2663 * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the 2664 * storage. If the result is {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY}, the 2665 * storage system has enabled encryption but no password is set so further action 2666 * may be required. If the result is {@link #ENCRYPTION_STATUS_ACTIVATING}, 2667 * {@link #ENCRYPTION_STATUS_ACTIVE} or {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}, 2668 * no further action is required. 2669 * 2670 * @return current status of encryption. The value will be one of 2671 * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, 2672 * {@link #ENCRYPTION_STATUS_ACTIVATING}, {@link #ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY}, 2673 * {@link #ENCRYPTION_STATUS_ACTIVE}, or {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}. 2674 */ getStorageEncryptionStatus()2675 public int getStorageEncryptionStatus() { 2676 throwIfParentInstance("getStorageEncryptionStatus"); 2677 return getStorageEncryptionStatus(myUserId()); 2678 } 2679 2680 /** @hide per-user version */ getStorageEncryptionStatus(int userHandle)2681 public int getStorageEncryptionStatus(int userHandle) { 2682 if (mService != null) { 2683 try { 2684 return mService.getStorageEncryptionStatus(mContext.getPackageName(), userHandle); 2685 } catch (RemoteException e) { 2686 throw e.rethrowFromSystemServer(); 2687 } 2688 } 2689 return ENCRYPTION_STATUS_UNSUPPORTED; 2690 } 2691 2692 /** 2693 * Mark a CA certificate as approved by the device user. This means that they have been notified 2694 * of the installation, were made aware of the risks, viewed the certificate and still wanted to 2695 * keep the certificate on the device. 2696 * 2697 * Calling with {@param approval} as {@code true} will cancel any ongoing warnings related to 2698 * this certificate. 2699 * 2700 * @hide 2701 */ approveCaCert(String alias, int userHandle, boolean approval)2702 public boolean approveCaCert(String alias, int userHandle, boolean approval) { 2703 if (mService != null) { 2704 try { 2705 return mService.approveCaCert(alias, userHandle, approval); 2706 } catch (RemoteException e) { 2707 throw e.rethrowFromSystemServer(); 2708 } 2709 } 2710 return false; 2711 } 2712 2713 /** 2714 * Check whether a CA certificate has been approved by the device user. 2715 * 2716 * @hide 2717 */ isCaCertApproved(String alias, int userHandle)2718 public boolean isCaCertApproved(String alias, int userHandle) { 2719 if (mService != null) { 2720 try { 2721 return mService.isCaCertApproved(alias, userHandle); 2722 } catch (RemoteException e) { 2723 throw e.rethrowFromSystemServer(); 2724 } 2725 } 2726 return false; 2727 } 2728 2729 /** 2730 * Installs the given certificate as a user CA. 2731 * 2732 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2733 * {@code null} if calling from a delegated certificate installer. 2734 * @param certBuffer encoded form of the certificate to install. 2735 * 2736 * @return false if the certBuffer cannot be parsed or installation is 2737 * interrupted, true otherwise. 2738 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2739 * owner. 2740 */ installCaCert(@ullable ComponentName admin, byte[] certBuffer)2741 public boolean installCaCert(@Nullable ComponentName admin, byte[] certBuffer) { 2742 throwIfParentInstance("installCaCert"); 2743 if (mService != null) { 2744 try { 2745 return mService.installCaCert(admin, certBuffer); 2746 } catch (RemoteException e) { 2747 throw e.rethrowFromSystemServer(); 2748 } 2749 } 2750 return false; 2751 } 2752 2753 /** 2754 * Uninstalls the given certificate from trusted user CAs, if present. 2755 * 2756 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2757 * {@code null} if calling from a delegated certificate installer. 2758 * @param certBuffer encoded form of the certificate to remove. 2759 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2760 * owner. 2761 */ uninstallCaCert(@ullable ComponentName admin, byte[] certBuffer)2762 public void uninstallCaCert(@Nullable ComponentName admin, byte[] certBuffer) { 2763 throwIfParentInstance("uninstallCaCert"); 2764 if (mService != null) { 2765 try { 2766 final String alias = getCaCertAlias(certBuffer); 2767 mService.uninstallCaCerts(admin, new String[] {alias}); 2768 } catch (CertificateException e) { 2769 Log.w(TAG, "Unable to parse certificate", e); 2770 } catch (RemoteException e) { 2771 throw e.rethrowFromSystemServer(); 2772 } 2773 } 2774 } 2775 2776 /** 2777 * Returns all CA certificates that are currently trusted, excluding system CA certificates. 2778 * If a user has installed any certificates by other means than device policy these will be 2779 * included too. 2780 * 2781 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2782 * {@code null} if calling from a delegated certificate installer. 2783 * @return a List of byte[] arrays, each encoding one user CA certificate. 2784 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2785 * owner. 2786 */ getInstalledCaCerts(@ullable ComponentName admin)2787 public List<byte[]> getInstalledCaCerts(@Nullable ComponentName admin) { 2788 List<byte[]> certs = new ArrayList<byte[]>(); 2789 throwIfParentInstance("getInstalledCaCerts"); 2790 if (mService != null) { 2791 try { 2792 mService.enforceCanManageCaCerts(admin); 2793 final TrustedCertificateStore certStore = new TrustedCertificateStore(); 2794 for (String alias : certStore.userAliases()) { 2795 try { 2796 certs.add(certStore.getCertificate(alias).getEncoded()); 2797 } catch (CertificateException ce) { 2798 Log.w(TAG, "Could not encode certificate: " + alias, ce); 2799 } 2800 } 2801 } catch (RemoteException re) { 2802 throw re.rethrowFromSystemServer(); 2803 } 2804 } 2805 return certs; 2806 } 2807 2808 /** 2809 * Uninstalls all custom trusted CA certificates from the profile. Certificates installed by 2810 * means other than device policy will also be removed, except for system CA certificates. 2811 * 2812 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2813 * {@code null} if calling from a delegated certificate installer. 2814 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2815 * owner. 2816 */ uninstallAllUserCaCerts(@ullable ComponentName admin)2817 public void uninstallAllUserCaCerts(@Nullable ComponentName admin) { 2818 throwIfParentInstance("uninstallAllUserCaCerts"); 2819 if (mService != null) { 2820 try { 2821 mService.uninstallCaCerts(admin, new TrustedCertificateStore().userAliases() 2822 .toArray(new String[0])); 2823 } catch (RemoteException re) { 2824 throw re.rethrowFromSystemServer(); 2825 } 2826 } 2827 } 2828 2829 /** 2830 * Returns whether this certificate is installed as a trusted CA. 2831 * 2832 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2833 * {@code null} if calling from a delegated certificate installer. 2834 * @param certBuffer encoded form of the certificate to look up. 2835 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2836 * owner. 2837 */ hasCaCertInstalled(@ullable ComponentName admin, byte[] certBuffer)2838 public boolean hasCaCertInstalled(@Nullable ComponentName admin, byte[] certBuffer) { 2839 throwIfParentInstance("hasCaCertInstalled"); 2840 if (mService != null) { 2841 try { 2842 mService.enforceCanManageCaCerts(admin); 2843 return getCaCertAlias(certBuffer) != null; 2844 } catch (RemoteException re) { 2845 throw re.rethrowFromSystemServer(); 2846 } catch (CertificateException ce) { 2847 Log.w(TAG, "Could not parse certificate", ce); 2848 } 2849 } 2850 return false; 2851 } 2852 2853 /** 2854 * Called by a device or profile owner, or delegated certificate installer, to install a 2855 * certificate and corresponding private key. All apps within the profile will be able to access 2856 * the certificate and use the private key, given direct user approval. 2857 * 2858 * <p>Access to the installed credentials will not be granted to the caller of this API without 2859 * direct user approval. This is for security - should a certificate installer become 2860 * compromised, certificates it had already installed will be protected. 2861 * 2862 * <p>If the installer must have access to the credentials, call 2863 * {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, boolean)} instead. 2864 * 2865 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2866 * {@code null} if calling from a delegated certificate installer. 2867 * @param privKey The private key to install. 2868 * @param cert The certificate to install. 2869 * @param alias The private key alias under which to install the certificate. If a certificate 2870 * with that alias already exists, it will be overwritten. 2871 * @return {@code true} if the keys were installed, {@code false} otherwise. 2872 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2873 * owner. 2874 */ installKeyPair(@ullable ComponentName admin, @NonNull PrivateKey privKey, @NonNull Certificate cert, @NonNull String alias)2875 public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey, 2876 @NonNull Certificate cert, @NonNull String alias) { 2877 return installKeyPair(admin, privKey, new Certificate[] {cert}, alias, false); 2878 } 2879 2880 /** 2881 * Called by a device or profile owner, or delegated certificate installer, to install a 2882 * certificate chain and corresponding private key for the leaf certificate. All apps within the 2883 * profile will be able to access the certificate chain and use the private key, given direct 2884 * user approval. 2885 * 2886 * <p>The caller of this API may grant itself access to the certificate and private key 2887 * immediately, without user approval. It is a best practice not to request this unless strictly 2888 * necessary since it opens up additional security vulnerabilities. 2889 * 2890 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2891 * {@code null} if calling from a delegated certificate installer. 2892 * @param privKey The private key to install. 2893 * @param certs The certificate chain to install. The chain should start with the leaf 2894 * certificate and include the chain of trust in order. This will be returned by 2895 * {@link android.security.KeyChain#getCertificateChain}. 2896 * @param alias The private key alias under which to install the certificate. If a certificate 2897 * with that alias already exists, it will be overwritten. 2898 * @param requestAccess {@code true} to request that the calling app be granted access to the 2899 * credentials immediately. Otherwise, access to the credentials will be gated by user 2900 * approval. 2901 * @return {@code true} if the keys were installed, {@code false} otherwise. 2902 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2903 * owner. 2904 * @see android.security.KeyChain#getCertificateChain 2905 */ installKeyPair(@ullable ComponentName admin, @NonNull PrivateKey privKey, @NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess)2906 public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey, 2907 @NonNull Certificate[] certs, @NonNull String alias, boolean requestAccess) { 2908 throwIfParentInstance("installKeyPair"); 2909 try { 2910 final byte[] pemCert = Credentials.convertToPem(certs[0]); 2911 byte[] pemChain = null; 2912 if (certs.length > 1) { 2913 pemChain = Credentials.convertToPem(Arrays.copyOfRange(certs, 1, certs.length)); 2914 } 2915 final byte[] pkcs8Key = KeyFactory.getInstance(privKey.getAlgorithm()) 2916 .getKeySpec(privKey, PKCS8EncodedKeySpec.class).getEncoded(); 2917 return mService.installKeyPair(admin, pkcs8Key, pemCert, pemChain, alias, 2918 requestAccess); 2919 } catch (RemoteException e) { 2920 throw e.rethrowFromSystemServer(); 2921 } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { 2922 Log.w(TAG, "Failed to obtain private key material", e); 2923 } catch (CertificateException | IOException e) { 2924 Log.w(TAG, "Could not pem-encode certificate", e); 2925 } 2926 return false; 2927 } 2928 2929 /** 2930 * Called by a device or profile owner, or delegated certificate installer, to remove a 2931 * certificate and private key pair installed under a given alias. 2932 * 2933 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 2934 * {@code null} if calling from a delegated certificate installer. 2935 * @param alias The private key alias under which the certificate is installed. 2936 * @return {@code true} if the private key alias no longer exists, {@code false} otherwise. 2937 * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile 2938 * owner. 2939 */ removeKeyPair(@ullable ComponentName admin, @NonNull String alias)2940 public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) { 2941 throwIfParentInstance("removeKeyPair"); 2942 try { 2943 return mService.removeKeyPair(admin, alias); 2944 } catch (RemoteException e) { 2945 throw e.rethrowFromSystemServer(); 2946 } 2947 } 2948 2949 /** 2950 * @return the alias of a given CA certificate in the certificate store, or {@code null} if it 2951 * doesn't exist. 2952 */ getCaCertAlias(byte[] certBuffer)2953 private static String getCaCertAlias(byte[] certBuffer) throws CertificateException { 2954 final CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 2955 final X509Certificate cert = (X509Certificate) certFactory.generateCertificate( 2956 new ByteArrayInputStream(certBuffer)); 2957 return new TrustedCertificateStore().getCertificateAlias(cert); 2958 } 2959 2960 /** 2961 * Called by a profile owner or device owner to grant access to privileged certificate 2962 * manipulation APIs to a third-party certificate installer app. Granted APIs include 2963 * {@link #getInstalledCaCerts}, {@link #hasCaCertInstalled}, {@link #installCaCert}, 2964 * {@link #uninstallCaCert}, {@link #uninstallAllUserCaCerts} and {@link #installKeyPair}. 2965 * <p> 2966 * Delegated certificate installer is a per-user state. The delegated access is persistent until 2967 * it is later cleared by calling this method with a null value or uninstallling the certificate 2968 * installer. 2969 * <p> 2970 * <b>Note:</b>Starting from {@link android.os.Build.VERSION_CODES#N}, if the caller 2971 * application's target SDK version is {@link android.os.Build.VERSION_CODES#N} or newer, the 2972 * supplied certificate installer package must be installed when calling this API, otherwise an 2973 * {@link IllegalArgumentException} will be thrown. 2974 * 2975 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2976 * @param installerPackage The package name of the certificate installer which will be given 2977 * access. If {@code null} is given the current package will be cleared. 2978 * @throws SecurityException if {@code admin} is not a device or a profile owner. 2979 */ setCertInstallerPackage(@onNull ComponentName admin, @Nullable String installerPackage)2980 public void setCertInstallerPackage(@NonNull ComponentName admin, @Nullable String 2981 installerPackage) throws SecurityException { 2982 throwIfParentInstance("setCertInstallerPackage"); 2983 if (mService != null) { 2984 try { 2985 mService.setCertInstallerPackage(admin, installerPackage); 2986 } catch (RemoteException e) { 2987 throw e.rethrowFromSystemServer(); 2988 } 2989 } 2990 } 2991 2992 /** 2993 * Called by a profile owner or device owner to retrieve the certificate installer for the user. 2994 * null if none is set. 2995 * 2996 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2997 * @return The package name of the current delegated certificate installer, or {@code null} if 2998 * none is set. 2999 * @throws SecurityException if {@code admin} is not a device or a profile owner. 3000 */ getCertInstallerPackage(@onNull ComponentName admin)3001 public String getCertInstallerPackage(@NonNull ComponentName admin) throws SecurityException { 3002 throwIfParentInstance("getCertInstallerPackage"); 3003 if (mService != null) { 3004 try { 3005 return mService.getCertInstallerPackage(admin); 3006 } catch (RemoteException e) { 3007 throw e.rethrowFromSystemServer(); 3008 } 3009 } 3010 return null; 3011 } 3012 3013 /** 3014 * Called by a device or profile owner to configure an always-on VPN connection through a 3015 * specific application for the current user. 3016 * 3017 * @deprecated this version only exists for compability with previous developer preview builds. 3018 * TODO: delete once there are no longer any live references. 3019 * @hide 3020 */ setAlwaysOnVpnPackage(@onNull ComponentName admin, @Nullable String vpnPackage)3021 public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage) 3022 throws NameNotFoundException, UnsupportedOperationException { 3023 setAlwaysOnVpnPackage(admin, vpnPackage, /* lockdownEnabled */ true); 3024 } 3025 3026 /** 3027 * Called by a device or profile owner to configure an always-on VPN connection through a 3028 * specific application for the current user. This connection is automatically granted and 3029 * persisted after a reboot. 3030 * <p> 3031 * The designated package should declare a {@link android.net.VpnService} in its manifest 3032 * guarded by {@link android.Manifest.permission#BIND_VPN_SERVICE}, otherwise the call will 3033 * fail. 3034 * 3035 * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to 3036 * remove an existing always-on VPN configuration. 3037 * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or 3038 * {@code false} otherwise. This carries the risk that any failure of the VPN provider 3039 * could break networking for all apps. This has no effect when clearing. 3040 * @throws SecurityException if {@code admin} is not a device or a profile owner. 3041 * @throws NameNotFoundException if {@code vpnPackage} is not installed. 3042 * @throws UnsupportedOperationException if {@code vpnPackage} exists but does not support being 3043 * set as always-on, or if always-on VPN is not available. 3044 */ setAlwaysOnVpnPackage(@onNull ComponentName admin, @Nullable String vpnPackage, boolean lockdownEnabled)3045 public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage, 3046 boolean lockdownEnabled) 3047 throws NameNotFoundException, UnsupportedOperationException { 3048 throwIfParentInstance("setAlwaysOnVpnPackage"); 3049 if (mService != null) { 3050 try { 3051 if (!mService.setAlwaysOnVpnPackage(admin, vpnPackage, lockdownEnabled)) { 3052 throw new NameNotFoundException(vpnPackage); 3053 } 3054 } catch (RemoteException e) { 3055 throw e.rethrowFromSystemServer(); 3056 } 3057 } 3058 } 3059 3060 /** 3061 * Called by a device or profile owner to read the name of the package administering an 3062 * always-on VPN connection for the current user. If there is no such package, or the always-on 3063 * VPN is provided by the system instead of by an application, {@code null} will be returned. 3064 * 3065 * @return Package name of VPN controller responsible for always-on VPN, or {@code null} if none 3066 * is set. 3067 * @throws SecurityException if {@code admin} is not a device or a profile owner. 3068 */ getAlwaysOnVpnPackage(@onNull ComponentName admin)3069 public String getAlwaysOnVpnPackage(@NonNull ComponentName admin) { 3070 throwIfParentInstance("getAlwaysOnVpnPackage"); 3071 if (mService != null) { 3072 try { 3073 return mService.getAlwaysOnVpnPackage(admin); 3074 } catch (RemoteException e) { 3075 throw e.rethrowFromSystemServer(); 3076 } 3077 } 3078 return null; 3079 } 3080 3081 /** 3082 * Called by an application that is administering the device to disable all cameras on the 3083 * device, for this user. After setting this, no applications running as this user will be able 3084 * to access any cameras on the device. 3085 * <p> 3086 * If the caller is device owner, then the restriction will be applied to all users. 3087 * <p> 3088 * The calling device admin must have requested 3089 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call this method; if it has 3090 * not, a security exception will be thrown. 3091 * 3092 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3093 * @param disabled Whether or not the camera should be disabled. 3094 * @throws SecurityException if {@code admin} is not an active administrator or does not use 3095 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA}. 3096 */ setCameraDisabled(@onNull ComponentName admin, boolean disabled)3097 public void setCameraDisabled(@NonNull ComponentName admin, boolean disabled) { 3098 throwIfParentInstance("setCameraDisabled"); 3099 if (mService != null) { 3100 try { 3101 mService.setCameraDisabled(admin, disabled); 3102 } catch (RemoteException e) { 3103 throw e.rethrowFromSystemServer(); 3104 } 3105 } 3106 } 3107 3108 /** 3109 * Determine whether or not the device's cameras have been disabled for this user, 3110 * either by the calling admin, if specified, or all admins. 3111 * @param admin The name of the admin component to check, or {@code null} to check whether any admins 3112 * have disabled the camera 3113 */ getCameraDisabled(@ullable ComponentName admin)3114 public boolean getCameraDisabled(@Nullable ComponentName admin) { 3115 throwIfParentInstance("getCameraDisabled"); 3116 return getCameraDisabled(admin, myUserId()); 3117 } 3118 3119 /** @hide per-user version */ getCameraDisabled(@ullable ComponentName admin, int userHandle)3120 public boolean getCameraDisabled(@Nullable ComponentName admin, int userHandle) { 3121 if (mService != null) { 3122 try { 3123 return mService.getCameraDisabled(admin, userHandle); 3124 } catch (RemoteException e) { 3125 throw e.rethrowFromSystemServer(); 3126 } 3127 } 3128 return false; 3129 } 3130 3131 /** 3132 * Called by a device owner to request a bugreport. 3133 * <p> 3134 * There must be only one user on the device, managed by the device owner. Otherwise a 3135 * {@link SecurityException} will be thrown. 3136 * 3137 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3138 * @return {@code true} if the bugreport collection started successfully, or {@code false} if it 3139 * wasn't triggered because a previous bugreport operation is still active (either the 3140 * bugreport is still running or waiting for the user to share or decline) 3141 * @throws SecurityException if {@code admin} is not a device owner, or if there are users other 3142 * than the one managed by the device owner. 3143 */ requestBugreport(@onNull ComponentName admin)3144 public boolean requestBugreport(@NonNull ComponentName admin) { 3145 throwIfParentInstance("requestBugreport"); 3146 if (mService != null) { 3147 try { 3148 return mService.requestBugreport(admin); 3149 } catch (RemoteException e) { 3150 throw e.rethrowFromSystemServer(); 3151 } 3152 } 3153 return false; 3154 } 3155 3156 /** 3157 * Determine whether or not creating a guest user has been disabled for the device 3158 * 3159 * @hide 3160 */ getGuestUserDisabled(@ullable ComponentName admin)3161 public boolean getGuestUserDisabled(@Nullable ComponentName admin) { 3162 // Currently guest users can always be created if multi-user is enabled 3163 // TODO introduce a policy for guest user creation 3164 return false; 3165 } 3166 3167 /** 3168 * Called by a device/profile owner to set whether the screen capture is disabled. Disabling 3169 * screen capture also prevents the content from being shown on display devices that do not have 3170 * a secure video output. See {@link android.view.Display#FLAG_SECURE} for more details about 3171 * secure surfaces and secure displays. 3172 * <p> 3173 * The calling device admin must be a device or profile owner. If it is not, a security 3174 * exception will be thrown. 3175 * <p> 3176 * From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also blocks 3177 * assist requests for all activities of the relevant user. 3178 * 3179 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3180 * @param disabled Whether screen capture is disabled or not. 3181 * @throws SecurityException if {@code admin} is not a device or profile owner. 3182 */ setScreenCaptureDisabled(@onNull ComponentName admin, boolean disabled)3183 public void setScreenCaptureDisabled(@NonNull ComponentName admin, boolean disabled) { 3184 throwIfParentInstance("setScreenCaptureDisabled"); 3185 if (mService != null) { 3186 try { 3187 mService.setScreenCaptureDisabled(admin, disabled); 3188 } catch (RemoteException e) { 3189 throw e.rethrowFromSystemServer(); 3190 } 3191 } 3192 } 3193 3194 /** 3195 * Determine whether or not screen capture has been disabled by the calling 3196 * admin, if specified, or all admins. 3197 * @param admin The name of the admin component to check, or {@code null} to check whether any admins 3198 * have disabled screen capture. 3199 */ getScreenCaptureDisabled(@ullable ComponentName admin)3200 public boolean getScreenCaptureDisabled(@Nullable ComponentName admin) { 3201 throwIfParentInstance("getScreenCaptureDisabled"); 3202 return getScreenCaptureDisabled(admin, myUserId()); 3203 } 3204 3205 /** @hide per-user version */ getScreenCaptureDisabled(@ullable ComponentName admin, int userHandle)3206 public boolean getScreenCaptureDisabled(@Nullable ComponentName admin, int userHandle) { 3207 if (mService != null) { 3208 try { 3209 return mService.getScreenCaptureDisabled(admin, userHandle); 3210 } catch (RemoteException e) { 3211 throw e.rethrowFromSystemServer(); 3212 } 3213 } 3214 return false; 3215 } 3216 3217 /** 3218 * Called by a device owner to set whether auto time is required. If auto time is required the 3219 * user cannot set the date and time, but has to use network date and time. 3220 * <p> 3221 * Note: if auto time is required the user can still manually set the time zone. 3222 * <p> 3223 * The calling device admin must be a device owner. If it is not, a security exception will be 3224 * thrown. 3225 * 3226 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3227 * @param required Whether auto time is set required or not. 3228 * @throws SecurityException if {@code admin} is not a device owner. 3229 */ setAutoTimeRequired(@onNull ComponentName admin, boolean required)3230 public void setAutoTimeRequired(@NonNull ComponentName admin, boolean required) { 3231 throwIfParentInstance("setAutoTimeRequired"); 3232 if (mService != null) { 3233 try { 3234 mService.setAutoTimeRequired(admin, required); 3235 } catch (RemoteException e) { 3236 throw e.rethrowFromSystemServer(); 3237 } 3238 } 3239 } 3240 3241 /** 3242 * @return true if auto time is required. 3243 */ getAutoTimeRequired()3244 public boolean getAutoTimeRequired() { 3245 throwIfParentInstance("getAutoTimeRequired"); 3246 if (mService != null) { 3247 try { 3248 return mService.getAutoTimeRequired(); 3249 } catch (RemoteException e) { 3250 throw e.rethrowFromSystemServer(); 3251 } 3252 } 3253 return false; 3254 } 3255 3256 /** 3257 * Called by a device owner to set whether all users created on the device should be ephemeral. 3258 * <p> 3259 * The system user is exempt from this policy - it is never ephemeral. 3260 * <p> 3261 * The calling device admin must be the device owner. If it is not, a security exception will be 3262 * thrown. 3263 * 3264 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3265 * @param forceEphemeralUsers If true, all the existing users will be deleted and all 3266 * subsequently created users will be ephemeral. 3267 * @throws SecurityException if {@code admin} is not a device owner. 3268 * @hide 3269 */ setForceEphemeralUsers( @onNull ComponentName admin, boolean forceEphemeralUsers)3270 public void setForceEphemeralUsers( 3271 @NonNull ComponentName admin, boolean forceEphemeralUsers) { 3272 throwIfParentInstance("setForceEphemeralUsers"); 3273 if (mService != null) { 3274 try { 3275 mService.setForceEphemeralUsers(admin, forceEphemeralUsers); 3276 } catch (RemoteException e) { 3277 throw e.rethrowFromSystemServer(); 3278 } 3279 } 3280 } 3281 3282 /** 3283 * @return true if all users are created ephemeral. 3284 * @throws SecurityException if {@code admin} is not a device owner. 3285 * @hide 3286 */ getForceEphemeralUsers(@onNull ComponentName admin)3287 public boolean getForceEphemeralUsers(@NonNull ComponentName admin) { 3288 throwIfParentInstance("getForceEphemeralUsers"); 3289 if (mService != null) { 3290 try { 3291 return mService.getForceEphemeralUsers(admin); 3292 } catch (RemoteException e) { 3293 throw e.rethrowFromSystemServer(); 3294 } 3295 } 3296 return false; 3297 } 3298 3299 /** 3300 * Called by an application that is administering the device to disable keyguard customizations, 3301 * such as widgets. After setting this, keyguard features will be disabled according to the 3302 * provided feature list. 3303 * <p> 3304 * The calling device admin must have requested 3305 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method; 3306 * if it has not, a security exception will be thrown. 3307 * <p> 3308 * Calling this from a managed profile before version {@link android.os.Build.VERSION_CODES#M} 3309 * will throw a security exception. From version {@link android.os.Build.VERSION_CODES#M} the 3310 * profile owner of a managed profile can set: 3311 * <ul> 3312 * <li>{@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which affects the parent user, but only if there 3313 * is no separate challenge set on the managed profile. 3314 * <li>{@link #KEYGUARD_DISABLE_FINGERPRINT} which affects the managed profile challenge if 3315 * there is one, or the parent user otherwise. 3316 * <li>{@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS} which affects notifications generated 3317 * by applications in the managed profile. 3318 * </ul> 3319 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} and {@link #KEYGUARD_DISABLE_FINGERPRINT} can also be 3320 * set on the {@link DevicePolicyManager} instance returned by 3321 * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent 3322 * profile. 3323 * <p> 3324 * Requests to disable other features on a managed profile will be ignored. 3325 * <p> 3326 * The admin can check which features have been disabled by calling 3327 * {@link #getKeyguardDisabledFeatures(ComponentName)} 3328 * 3329 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3330 * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default), 3331 * {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA}, 3332 * {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS}, 3333 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, 3334 * {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, 3335 * {@link #KEYGUARD_DISABLE_FINGERPRINT}, {@link #KEYGUARD_DISABLE_FEATURES_ALL} 3336 * @throws SecurityException if {@code admin} is not an active administrator or does not user 3337 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} 3338 */ setKeyguardDisabledFeatures(@onNull ComponentName admin, int which)3339 public void setKeyguardDisabledFeatures(@NonNull ComponentName admin, int which) { 3340 if (mService != null) { 3341 try { 3342 mService.setKeyguardDisabledFeatures(admin, which, mParentInstance); 3343 } catch (RemoteException e) { 3344 throw e.rethrowFromSystemServer(); 3345 } 3346 } 3347 } 3348 3349 /** 3350 * Determine whether or not features have been disabled in keyguard either by the calling 3351 * admin, if specified, or all admins that set restrictions on this user and its participating 3352 * profiles. Restrictions on profiles that have a separate challenge are not taken into account. 3353 * 3354 * <p>This method can be called on the {@link DevicePolicyManager} instance 3355 * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve 3356 * restrictions on the parent profile. 3357 * 3358 * @param admin The name of the admin component to check, or {@code null} to check whether any 3359 * admins have disabled features in keyguard. 3360 * @return bitfield of flags. See {@link #setKeyguardDisabledFeatures(ComponentName, int)} 3361 * for a list. 3362 */ getKeyguardDisabledFeatures(@ullable ComponentName admin)3363 public int getKeyguardDisabledFeatures(@Nullable ComponentName admin) { 3364 return getKeyguardDisabledFeatures(admin, myUserId()); 3365 } 3366 3367 /** @hide per-user version */ getKeyguardDisabledFeatures(@ullable ComponentName admin, int userHandle)3368 public int getKeyguardDisabledFeatures(@Nullable ComponentName admin, int userHandle) { 3369 if (mService != null) { 3370 try { 3371 return mService.getKeyguardDisabledFeatures(admin, userHandle, mParentInstance); 3372 } catch (RemoteException e) { 3373 throw e.rethrowFromSystemServer(); 3374 } 3375 } 3376 return KEYGUARD_DISABLE_FEATURES_NONE; 3377 } 3378 3379 /** 3380 * @hide 3381 */ setActiveAdmin(@onNull ComponentName policyReceiver, boolean refreshing, int userHandle)3382 public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing, 3383 int userHandle) { 3384 if (mService != null) { 3385 try { 3386 mService.setActiveAdmin(policyReceiver, refreshing, userHandle); 3387 } catch (RemoteException e) { 3388 throw e.rethrowFromSystemServer(); 3389 } 3390 } 3391 } 3392 3393 /** 3394 * @hide 3395 */ setActiveAdmin(@onNull ComponentName policyReceiver, boolean refreshing)3396 public void setActiveAdmin(@NonNull ComponentName policyReceiver, boolean refreshing) { 3397 setActiveAdmin(policyReceiver, refreshing, myUserId()); 3398 } 3399 3400 /** 3401 * @hide 3402 */ getRemoveWarning(@ullable ComponentName admin, RemoteCallback result)3403 public void getRemoveWarning(@Nullable ComponentName admin, RemoteCallback result) { 3404 if (mService != null) { 3405 try { 3406 mService.getRemoveWarning(admin, result, myUserId()); 3407 } catch (RemoteException e) { 3408 throw e.rethrowFromSystemServer(); 3409 } 3410 } 3411 } 3412 3413 /** 3414 * @hide 3415 */ setActivePasswordState(int quality, int length, int letters, int uppercase, int lowercase, int numbers, int symbols, int nonletter, int userHandle)3416 public void setActivePasswordState(int quality, int length, int letters, int uppercase, 3417 int lowercase, int numbers, int symbols, int nonletter, int userHandle) { 3418 if (mService != null) { 3419 try { 3420 mService.setActivePasswordState(quality, length, letters, uppercase, lowercase, 3421 numbers, symbols, nonletter, userHandle); 3422 } catch (RemoteException e) { 3423 throw e.rethrowFromSystemServer(); 3424 } 3425 } 3426 } 3427 3428 /** 3429 * @hide 3430 */ reportFailedPasswordAttempt(int userHandle)3431 public void reportFailedPasswordAttempt(int userHandle) { 3432 if (mService != null) { 3433 try { 3434 mService.reportFailedPasswordAttempt(userHandle); 3435 } catch (RemoteException e) { 3436 throw e.rethrowFromSystemServer(); 3437 } 3438 } 3439 } 3440 3441 /** 3442 * @hide 3443 */ reportSuccessfulPasswordAttempt(int userHandle)3444 public void reportSuccessfulPasswordAttempt(int userHandle) { 3445 if (mService != null) { 3446 try { 3447 mService.reportSuccessfulPasswordAttempt(userHandle); 3448 } catch (RemoteException e) { 3449 throw e.rethrowFromSystemServer(); 3450 } 3451 } 3452 } 3453 3454 /** 3455 * @hide 3456 */ reportFailedFingerprintAttempt(int userHandle)3457 public void reportFailedFingerprintAttempt(int userHandle) { 3458 if (mService != null) { 3459 try { 3460 mService.reportFailedFingerprintAttempt(userHandle); 3461 } catch (RemoteException e) { 3462 throw e.rethrowFromSystemServer(); 3463 } 3464 } 3465 } 3466 3467 /** 3468 * @hide 3469 */ reportSuccessfulFingerprintAttempt(int userHandle)3470 public void reportSuccessfulFingerprintAttempt(int userHandle) { 3471 if (mService != null) { 3472 try { 3473 mService.reportSuccessfulFingerprintAttempt(userHandle); 3474 } catch (RemoteException e) { 3475 throw e.rethrowFromSystemServer(); 3476 } 3477 } 3478 } 3479 3480 /** 3481 * Should be called when keyguard has been dismissed. 3482 * @hide 3483 */ reportKeyguardDismissed(int userHandle)3484 public void reportKeyguardDismissed(int userHandle) { 3485 if (mService != null) { 3486 try { 3487 mService.reportKeyguardDismissed(userHandle); 3488 } catch (RemoteException e) { 3489 throw e.rethrowFromSystemServer(); 3490 } 3491 } 3492 } 3493 3494 /** 3495 * Should be called when keyguard view has been shown to the user. 3496 * @hide 3497 */ reportKeyguardSecured(int userHandle)3498 public void reportKeyguardSecured(int userHandle) { 3499 if (mService != null) { 3500 try { 3501 mService.reportKeyguardSecured(userHandle); 3502 } catch (RemoteException e) { 3503 throw e.rethrowFromSystemServer(); 3504 } 3505 } 3506 } 3507 3508 /** 3509 * @hide 3510 * Sets the given package as the device owner. 3511 * Same as {@link #setDeviceOwner(ComponentName, String)} but without setting a device owner name. 3512 * @param who the component name to be registered as device owner. 3513 * @return whether the package was successfully registered as the device owner. 3514 * @throws IllegalArgumentException if the package name is null or invalid 3515 * @throws IllegalStateException If the preconditions mentioned are not met. 3516 */ setDeviceOwner(ComponentName who)3517 public boolean setDeviceOwner(ComponentName who) { 3518 return setDeviceOwner(who, null); 3519 } 3520 3521 /** 3522 * @hide 3523 */ setDeviceOwner(ComponentName who, int userId)3524 public boolean setDeviceOwner(ComponentName who, int userId) { 3525 return setDeviceOwner(who, null, userId); 3526 } 3527 3528 /** 3529 * @hide 3530 */ setDeviceOwner(ComponentName who, String ownerName)3531 public boolean setDeviceOwner(ComponentName who, String ownerName) { 3532 return setDeviceOwner(who, ownerName, UserHandle.USER_SYSTEM); 3533 } 3534 3535 /** 3536 * @hide 3537 * Sets the given package as the device owner. The package must already be installed. There 3538 * must not already be a device owner. 3539 * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call 3540 * this method. 3541 * Calling this after the setup phase of the primary user has completed is allowed only if 3542 * the caller is the shell uid, and there are no additional users and no accounts. 3543 * @param who the component name to be registered as device owner. 3544 * @param ownerName the human readable name of the institution that owns this device. 3545 * @param userId ID of the user on which the device owner runs. 3546 * @return whether the package was successfully registered as the device owner. 3547 * @throws IllegalArgumentException if the package name is null or invalid 3548 * @throws IllegalStateException If the preconditions mentioned are not met. 3549 */ setDeviceOwner(ComponentName who, String ownerName, int userId)3550 public boolean setDeviceOwner(ComponentName who, String ownerName, int userId) 3551 throws IllegalArgumentException, IllegalStateException { 3552 if (mService != null) { 3553 try { 3554 return mService.setDeviceOwner(who, ownerName, userId); 3555 } catch (RemoteException re) { 3556 throw re.rethrowFromSystemServer(); 3557 } 3558 } 3559 return false; 3560 } 3561 3562 /** 3563 * Used to determine if a particular package has been registered as a Device Owner app. 3564 * A device owner app is a special device admin that cannot be deactivated by the user, once 3565 * activated as a device admin. It also cannot be uninstalled. To check whether a particular 3566 * package is currently registered as the device owner app, pass in the package name from 3567 * {@link Context#getPackageName()} to this method.<p/>This is useful for device 3568 * admin apps that want to check whether they are also registered as the device owner app. The 3569 * exact mechanism by which a device admin app is registered as a device owner app is defined by 3570 * the setup process. 3571 * @param packageName the package name of the app, to compare with the registered device owner 3572 * app, if any. 3573 * @return whether or not the package is registered as the device owner app. 3574 */ isDeviceOwnerApp(String packageName)3575 public boolean isDeviceOwnerApp(String packageName) { 3576 throwIfParentInstance("isDeviceOwnerApp"); 3577 return isDeviceOwnerAppOnCallingUser(packageName); 3578 } 3579 3580 /** 3581 * @return true if a package is registered as device owner, only when it's running on the 3582 * calling user. 3583 * 3584 * <p>Same as {@link #isDeviceOwnerApp}, but bundled code should use it for clarity. 3585 * @hide 3586 */ isDeviceOwnerAppOnCallingUser(String packageName)3587 public boolean isDeviceOwnerAppOnCallingUser(String packageName) { 3588 return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ true); 3589 } 3590 3591 /** 3592 * @return true if a package is registered as device owner, even if it's running on a different 3593 * user. 3594 * 3595 * <p>Requires the MANAGE_USERS permission. 3596 * 3597 * @hide 3598 */ isDeviceOwnerAppOnAnyUser(String packageName)3599 public boolean isDeviceOwnerAppOnAnyUser(String packageName) { 3600 return isDeviceOwnerAppOnAnyUserInner(packageName, /* callingUserOnly =*/ false); 3601 } 3602 3603 /** 3604 * @return device owner component name, only when it's running on the calling user. 3605 * 3606 * @hide 3607 */ getDeviceOwnerComponentOnCallingUser()3608 public ComponentName getDeviceOwnerComponentOnCallingUser() { 3609 return getDeviceOwnerComponentInner(/* callingUserOnly =*/ true); 3610 } 3611 3612 /** 3613 * @return device owner component name, even if it's running on a different user. 3614 * 3615 * <p>Requires the MANAGE_USERS permission. 3616 * 3617 * @hide 3618 */ getDeviceOwnerComponentOnAnyUser()3619 public ComponentName getDeviceOwnerComponentOnAnyUser() { 3620 return getDeviceOwnerComponentInner(/* callingUserOnly =*/ false); 3621 } 3622 isDeviceOwnerAppOnAnyUserInner(String packageName, boolean callingUserOnly)3623 private boolean isDeviceOwnerAppOnAnyUserInner(String packageName, boolean callingUserOnly) { 3624 if (packageName == null) { 3625 return false; 3626 } 3627 final ComponentName deviceOwner = getDeviceOwnerComponentInner(callingUserOnly); 3628 if (deviceOwner == null) { 3629 return false; 3630 } 3631 return packageName.equals(deviceOwner.getPackageName()); 3632 } 3633 getDeviceOwnerComponentInner(boolean callingUserOnly)3634 private ComponentName getDeviceOwnerComponentInner(boolean callingUserOnly) { 3635 if (mService != null) { 3636 try { 3637 return mService.getDeviceOwnerComponent(callingUserOnly); 3638 } catch (RemoteException re) { 3639 throw re.rethrowFromSystemServer(); 3640 } 3641 } 3642 return null; 3643 } 3644 3645 /** 3646 * @return ID of the user who runs device owner, or {@link UserHandle#USER_NULL} if there's 3647 * no device owner. 3648 * 3649 * <p>Requires the MANAGE_USERS permission. 3650 * 3651 * @hide 3652 */ getDeviceOwnerUserId()3653 public int getDeviceOwnerUserId() { 3654 if (mService != null) { 3655 try { 3656 return mService.getDeviceOwnerUserId(); 3657 } catch (RemoteException re) { 3658 throw re.rethrowFromSystemServer(); 3659 } 3660 } 3661 return UserHandle.USER_NULL; 3662 } 3663 3664 /** 3665 * Clears the current device owner. The caller must be the device owner. This function should be 3666 * used cautiously as once it is called it cannot be undone. The device owner can only be set as 3667 * a part of device setup before setup completes. 3668 * 3669 * @param packageName The package name of the device owner. 3670 * @throws SecurityException if the caller is not in {@code packageName} or {@code packageName} 3671 * does not own the current device owner component. 3672 */ clearDeviceOwnerApp(String packageName)3673 public void clearDeviceOwnerApp(String packageName) { 3674 throwIfParentInstance("clearDeviceOwnerApp"); 3675 if (mService != null) { 3676 try { 3677 mService.clearDeviceOwner(packageName); 3678 } catch (RemoteException re) { 3679 throw re.rethrowFromSystemServer(); 3680 } 3681 } 3682 } 3683 3684 /** 3685 * Returns the device owner package name, only if it's running on the calling user. 3686 * 3687 * <p>Bundled components should use {@code getDeviceOwnerComponentOnCallingUser()} for clarity. 3688 * 3689 * @hide 3690 */ 3691 @SystemApi getDeviceOwner()3692 public String getDeviceOwner() { 3693 throwIfParentInstance("getDeviceOwner"); 3694 final ComponentName name = getDeviceOwnerComponentOnCallingUser(); 3695 return name != null ? name.getPackageName() : null; 3696 } 3697 3698 /** 3699 * @return true if the device is managed by any device owner. 3700 * 3701 * <p>Requires the MANAGE_USERS permission. 3702 * 3703 * @hide 3704 */ isDeviceManaged()3705 public boolean isDeviceManaged() { 3706 return getDeviceOwnerComponentOnAnyUser() != null; 3707 } 3708 3709 /** 3710 * Returns the device owner name. Note this method *will* return the device owner 3711 * name when it's running on a different user. 3712 * 3713 * <p>Requires the MANAGE_USERS permission. 3714 * 3715 * @hide 3716 */ 3717 @SystemApi getDeviceOwnerNameOnAnyUser()3718 public String getDeviceOwnerNameOnAnyUser() { 3719 throwIfParentInstance("getDeviceOwnerNameOnAnyUser"); 3720 if (mService != null) { 3721 try { 3722 return mService.getDeviceOwnerName(); 3723 } catch (RemoteException re) { 3724 throw re.rethrowFromSystemServer(); 3725 } 3726 } 3727 return null; 3728 } 3729 3730 /** 3731 * @hide 3732 * @deprecated Do not use 3733 * @removed 3734 */ 3735 @Deprecated 3736 @SystemApi getDeviceInitializerApp()3737 public String getDeviceInitializerApp() { 3738 return null; 3739 } 3740 3741 /** 3742 * @hide 3743 * @deprecated Do not use 3744 * @removed 3745 */ 3746 @Deprecated 3747 @SystemApi getDeviceInitializerComponent()3748 public ComponentName getDeviceInitializerComponent() { 3749 return null; 3750 } 3751 3752 /** 3753 * @hide 3754 * @deprecated Use #ACTION_SET_PROFILE_OWNER 3755 * Sets the given component as an active admin and registers the package as the profile 3756 * owner for this user. The package must already be installed and there shouldn't be 3757 * an existing profile owner registered for this user. Also, this method must be called 3758 * before the user setup has been completed. 3759 * <p> 3760 * This method can only be called by system apps that hold MANAGE_USERS permission and 3761 * MANAGE_DEVICE_ADMINS permission. 3762 * @param admin The component to register as an active admin and profile owner. 3763 * @param ownerName The user-visible name of the entity that is managing this user. 3764 * @return whether the admin was successfully registered as the profile owner. 3765 * @throws IllegalArgumentException if packageName is null, the package isn't installed, or 3766 * the user has already been set up. 3767 */ 3768 @SystemApi setActiveProfileOwner(@onNull ComponentName admin, @Deprecated String ownerName)3769 public boolean setActiveProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName) 3770 throws IllegalArgumentException { 3771 throwIfParentInstance("setActiveProfileOwner"); 3772 if (mService != null) { 3773 try { 3774 final int myUserId = myUserId(); 3775 mService.setActiveAdmin(admin, false, myUserId); 3776 return mService.setProfileOwner(admin, ownerName, myUserId); 3777 } catch (RemoteException re) { 3778 throw re.rethrowFromSystemServer(); 3779 } 3780 } 3781 return false; 3782 } 3783 3784 /** 3785 * Clears the active profile owner and removes all user restrictions. The caller must be from 3786 * the same package as the active profile owner for this user, otherwise a SecurityException 3787 * will be thrown. 3788 * <p> 3789 * This doesn't work for managed profile owners. 3790 * 3791 * @param admin The component to remove as the profile owner. 3792 * @throws SecurityException if {@code admin} is not an active profile owner. 3793 */ clearProfileOwner(@onNull ComponentName admin)3794 public void clearProfileOwner(@NonNull ComponentName admin) { 3795 throwIfParentInstance("clearProfileOwner"); 3796 if (mService != null) { 3797 try { 3798 mService.clearProfileOwner(admin); 3799 } catch (RemoteException re) { 3800 throw re.rethrowFromSystemServer(); 3801 } 3802 } 3803 } 3804 3805 /** 3806 * @hide 3807 * Checks whether the user was already setup. 3808 */ hasUserSetupCompleted()3809 public boolean hasUserSetupCompleted() { 3810 if (mService != null) { 3811 try { 3812 return mService.hasUserSetupCompleted(); 3813 } catch (RemoteException re) { 3814 throw re.rethrowFromSystemServer(); 3815 } 3816 } 3817 return true; 3818 } 3819 3820 /** 3821 * @hide 3822 * Sets the given component as the profile owner of the given user profile. The package must 3823 * already be installed. There must not already be a profile owner for this user. 3824 * Only apps with the MANAGE_PROFILE_AND_DEVICE_OWNERS permission and the shell uid can call 3825 * this method. 3826 * Calling this after the setup phase of the specified user has completed is allowed only if: 3827 * - the caller is SYSTEM_UID. 3828 * - or the caller is the shell uid, and there are no accounts on the specified user. 3829 * @param admin the component name to be registered as profile owner. 3830 * @param ownerName the human readable name of the organisation associated with this DPM. 3831 * @param userHandle the userId to set the profile owner for. 3832 * @return whether the component was successfully registered as the profile owner. 3833 * @throws IllegalArgumentException if admin is null, the package isn't installed, or the 3834 * preconditions mentioned are not met. 3835 */ setProfileOwner(@onNull ComponentName admin, @Deprecated String ownerName, int userHandle)3836 public boolean setProfileOwner(@NonNull ComponentName admin, @Deprecated String ownerName, 3837 int userHandle) throws IllegalArgumentException { 3838 if (mService != null) { 3839 try { 3840 if (ownerName == null) { 3841 ownerName = ""; 3842 } 3843 return mService.setProfileOwner(admin, ownerName, userHandle); 3844 } catch (RemoteException re) { 3845 throw re.rethrowFromSystemServer(); 3846 } 3847 } 3848 return false; 3849 } 3850 3851 /** 3852 * Sets the device owner information to be shown on the lock screen. 3853 * <p> 3854 * If the device owner information is {@code null} or empty then the device owner info is 3855 * cleared and the user owner info is shown on the lock screen if it is set. 3856 * <p> 3857 * If the device owner information contains only whitespaces then the message on the lock screen 3858 * will be blank and the user will not be allowed to change it. 3859 * <p> 3860 * If the device owner information needs to be localized, it is the responsibility of the 3861 * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast 3862 * and set a new version of this string accordingly. 3863 * 3864 * @param admin The name of the admin component to check. 3865 * @param info Device owner information which will be displayed instead of the user owner info. 3866 * @throws SecurityException if {@code admin} is not a device owner. 3867 */ setDeviceOwnerLockScreenInfo(@onNull ComponentName admin, CharSequence info)3868 public void setDeviceOwnerLockScreenInfo(@NonNull ComponentName admin, CharSequence info) { 3869 throwIfParentInstance("setDeviceOwnerLockScreenInfo"); 3870 if (mService != null) { 3871 try { 3872 mService.setDeviceOwnerLockScreenInfo(admin, info); 3873 } catch (RemoteException re) { 3874 throw re.rethrowFromSystemServer(); 3875 } 3876 } 3877 } 3878 3879 /** 3880 * @return The device owner information. If it is not set returns {@code null}. 3881 */ getDeviceOwnerLockScreenInfo()3882 public CharSequence getDeviceOwnerLockScreenInfo() { 3883 throwIfParentInstance("getDeviceOwnerLockScreenInfo"); 3884 if (mService != null) { 3885 try { 3886 return mService.getDeviceOwnerLockScreenInfo(); 3887 } catch (RemoteException re) { 3888 throw re.rethrowFromSystemServer(); 3889 } 3890 } 3891 return null; 3892 } 3893 3894 /** 3895 * Called by device or profile owners to suspend packages for this user. 3896 * <p> 3897 * A suspended package will not be able to start activities. Its notifications will be hidden, 3898 * it will not show up in recents, will not be able to show toasts or dialogs or ring the 3899 * device. 3900 * <p> 3901 * The package must already be installed. If the package is uninstalled while suspended the 3902 * package will no longer be suspended. The admin can block this by using 3903 * {@link #setUninstallBlocked}. 3904 * 3905 * @param admin The name of the admin component to check. 3906 * @param packageNames The package names to suspend or unsuspend. 3907 * @param suspended If set to {@code true} than the packages will be suspended, if set to 3908 * {@code false} the packages will be unsuspended. 3909 * @return an array of package names for which the suspended status is not set as requested in 3910 * this method. 3911 * @throws SecurityException if {@code admin} is not a device or profile owner. 3912 */ setPackagesSuspended(@onNull ComponentName admin, String[] packageNames, boolean suspended)3913 public String[] setPackagesSuspended(@NonNull ComponentName admin, String[] packageNames, 3914 boolean suspended) { 3915 throwIfParentInstance("setPackagesSuspended"); 3916 if (mService != null) { 3917 try { 3918 return mService.setPackagesSuspended(admin, packageNames, suspended); 3919 } catch (RemoteException re) { 3920 throw re.rethrowFromSystemServer(); 3921 } 3922 } 3923 return packageNames; 3924 } 3925 3926 /** 3927 * Called by device or profile owners to determine if a package is suspended. 3928 * 3929 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3930 * @param packageName The name of the package to retrieve the suspended status of. 3931 * @return {@code true} if the package is suspended or {@code false} if the package is not 3932 * suspended, could not be found or an error occurred. 3933 * @throws SecurityException if {@code admin} is not a device or profile owner. 3934 * @throws NameNotFoundException if the package could not be found. 3935 */ isPackageSuspended(@onNull ComponentName admin, String packageName)3936 public boolean isPackageSuspended(@NonNull ComponentName admin, String packageName) 3937 throws NameNotFoundException { 3938 throwIfParentInstance("isPackageSuspended"); 3939 if (mService != null) { 3940 try { 3941 return mService.isPackageSuspended(admin, packageName); 3942 } catch (RemoteException e) { 3943 throw e.rethrowFromSystemServer(); 3944 } catch (IllegalArgumentException ex) { 3945 throw new NameNotFoundException(packageName); 3946 } 3947 } 3948 return false; 3949 } 3950 3951 /** 3952 * Sets the enabled state of the profile. A profile should be enabled only once it is ready to 3953 * be used. Only the profile owner can call this. 3954 * 3955 * @see #isProfileOwnerApp 3956 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 3957 * @throws SecurityException if {@code admin} is not a profile owner. 3958 */ setProfileEnabled(@onNull ComponentName admin)3959 public void setProfileEnabled(@NonNull ComponentName admin) { 3960 throwIfParentInstance("setProfileEnabled"); 3961 if (mService != null) { 3962 try { 3963 mService.setProfileEnabled(admin); 3964 } catch (RemoteException e) { 3965 throw e.rethrowFromSystemServer(); 3966 } 3967 } 3968 } 3969 3970 /** 3971 * Sets the name of the profile. In the device owner case it sets the name of the user which it 3972 * is called from. Only a profile owner or device owner can call this. If this is never called 3973 * by the profile or device owner, the name will be set to default values. 3974 * 3975 * @see #isProfileOwnerApp 3976 * @see #isDeviceOwnerApp 3977 * @param admin Which {@link DeviceAdminReceiver} this request is associate with. 3978 * @param profileName The name of the profile. 3979 * @throws SecurityException if {@code admin} is not a device or profile owner. 3980 */ setProfileName(@onNull ComponentName admin, String profileName)3981 public void setProfileName(@NonNull ComponentName admin, String profileName) { 3982 throwIfParentInstance("setProfileName"); 3983 if (mService != null) { 3984 try { 3985 mService.setProfileName(admin, profileName); 3986 } catch (RemoteException e) { 3987 throw e.rethrowFromSystemServer(); 3988 } 3989 } 3990 } 3991 3992 /** 3993 * Used to determine if a particular package is registered as the profile owner for the 3994 * user. A profile owner is a special device admin that has additional privileges 3995 * within the profile. 3996 * 3997 * @param packageName The package name of the app to compare with the registered profile owner. 3998 * @return Whether or not the package is registered as the profile owner. 3999 */ isProfileOwnerApp(String packageName)4000 public boolean isProfileOwnerApp(String packageName) { 4001 throwIfParentInstance("isProfileOwnerApp"); 4002 if (mService != null) { 4003 try { 4004 ComponentName profileOwner = mService.getProfileOwner(myUserId()); 4005 return profileOwner != null 4006 && profileOwner.getPackageName().equals(packageName); 4007 } catch (RemoteException re) { 4008 throw re.rethrowFromSystemServer(); 4009 } 4010 } 4011 return false; 4012 } 4013 4014 /** 4015 * @hide 4016 * @return the packageName of the owner of the given user profile or {@code null} if no profile 4017 * owner has been set for that user. 4018 * @throws IllegalArgumentException if the userId is invalid. 4019 */ 4020 @SystemApi getProfileOwner()4021 public ComponentName getProfileOwner() throws IllegalArgumentException { 4022 throwIfParentInstance("getProfileOwner"); 4023 return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier()); 4024 } 4025 4026 /** 4027 * @see #getProfileOwner() 4028 * @hide 4029 */ getProfileOwnerAsUser(final int userId)4030 public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException { 4031 if (mService != null) { 4032 try { 4033 return mService.getProfileOwner(userId); 4034 } catch (RemoteException re) { 4035 throw re.rethrowFromSystemServer(); 4036 } 4037 } 4038 return null; 4039 } 4040 4041 /** 4042 * @hide 4043 * @return the human readable name of the organisation associated with this DPM or {@code null} 4044 * if one is not set. 4045 * @throws IllegalArgumentException if the userId is invalid. 4046 */ getProfileOwnerName()4047 public String getProfileOwnerName() throws IllegalArgumentException { 4048 if (mService != null) { 4049 try { 4050 return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier()); 4051 } catch (RemoteException re) { 4052 throw re.rethrowFromSystemServer(); 4053 } 4054 } 4055 return null; 4056 } 4057 4058 /** 4059 * @hide 4060 * @param userId The user for whom to fetch the profile owner name, if any. 4061 * @return the human readable name of the organisation associated with this profile owner or 4062 * null if one is not set. 4063 * @throws IllegalArgumentException if the userId is invalid. 4064 */ 4065 @SystemApi getProfileOwnerNameAsUser(int userId)4066 public String getProfileOwnerNameAsUser(int userId) throws IllegalArgumentException { 4067 throwIfParentInstance("getProfileOwnerNameAsUser"); 4068 if (mService != null) { 4069 try { 4070 return mService.getProfileOwnerName(userId); 4071 } catch (RemoteException re) { 4072 throw re.rethrowFromSystemServer(); 4073 } 4074 } 4075 return null; 4076 } 4077 4078 /** 4079 * Called by a profile owner or device owner to add a default intent handler activity for 4080 * intents that match a certain intent filter. This activity will remain the default intent 4081 * handler even if the set of potential event handlers for the intent filter changes and if the 4082 * intent preferences are reset. 4083 * <p> 4084 * The default disambiguation mechanism takes over if the activity is not installed (anymore). 4085 * When the activity is (re)installed, it is automatically reset as default intent handler for 4086 * the filter. 4087 * <p> 4088 * The calling device admin must be a profile owner or device owner. If it is not, a security 4089 * exception will be thrown. 4090 * 4091 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4092 * @param filter The IntentFilter for which a default handler is added. 4093 * @param activity The Activity that is added as default intent handler. 4094 * @throws SecurityException if {@code admin} is not a device or profile owner. 4095 */ addPersistentPreferredActivity(@onNull ComponentName admin, IntentFilter filter, @NonNull ComponentName activity)4096 public void addPersistentPreferredActivity(@NonNull ComponentName admin, IntentFilter filter, 4097 @NonNull ComponentName activity) { 4098 throwIfParentInstance("addPersistentPreferredActivity"); 4099 if (mService != null) { 4100 try { 4101 mService.addPersistentPreferredActivity(admin, filter, activity); 4102 } catch (RemoteException e) { 4103 throw e.rethrowFromSystemServer(); 4104 } 4105 } 4106 } 4107 4108 /** 4109 * Called by a profile owner or device owner to remove all persistent intent handler preferences 4110 * associated with the given package that were set by {@link #addPersistentPreferredActivity}. 4111 * <p> 4112 * The calling device admin must be a profile owner. If it is not, a security exception will be 4113 * thrown. 4114 * 4115 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4116 * @param packageName The name of the package for which preferences are removed. 4117 * @throws SecurityException if {@code admin} is not a device or profile owner. 4118 */ clearPackagePersistentPreferredActivities(@onNull ComponentName admin, String packageName)4119 public void clearPackagePersistentPreferredActivities(@NonNull ComponentName admin, 4120 String packageName) { 4121 throwIfParentInstance("clearPackagePersistentPreferredActivities"); 4122 if (mService != null) { 4123 try { 4124 mService.clearPackagePersistentPreferredActivities(admin, packageName); 4125 } catch (RemoteException e) { 4126 throw e.rethrowFromSystemServer(); 4127 } 4128 } 4129 } 4130 4131 /** 4132 * Called by a profile owner or device owner to grant permission to a package to manage 4133 * application restrictions for the calling user via {@link #setApplicationRestrictions} and 4134 * {@link #getApplicationRestrictions}. 4135 * <p> 4136 * This permission is persistent until it is later cleared by calling this method with a 4137 * {@code null} value or uninstalling the managing package. 4138 * <p> 4139 * The supplied application restriction managing package must be installed when calling this 4140 * API, otherwise an {@link NameNotFoundException} will be thrown. 4141 * 4142 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4143 * @param packageName The package name which will be given access to application restrictions 4144 * APIs. If {@code null} is given the current package will be cleared. 4145 * @throws SecurityException if {@code admin} is not a device or profile owner. 4146 * @throws NameNotFoundException if {@code packageName} is not found 4147 */ setApplicationRestrictionsManagingPackage(@onNull ComponentName admin, @Nullable String packageName)4148 public void setApplicationRestrictionsManagingPackage(@NonNull ComponentName admin, 4149 @Nullable String packageName) throws NameNotFoundException { 4150 throwIfParentInstance("setApplicationRestrictionsManagingPackage"); 4151 if (mService != null) { 4152 try { 4153 if (!mService.setApplicationRestrictionsManagingPackage(admin, packageName)) { 4154 throw new NameNotFoundException(packageName); 4155 } 4156 } catch (RemoteException e) { 4157 throw e.rethrowFromSystemServer(); 4158 } 4159 } 4160 } 4161 4162 /** 4163 * Called by a profile owner or device owner to retrieve the application restrictions managing 4164 * package for the current user, or {@code null} if none is set. 4165 * 4166 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4167 * @return The package name allowed to manage application restrictions on the current user, or 4168 * {@code null} if none is set. 4169 * @throws SecurityException if {@code admin} is not a device or profile owner. 4170 */ getApplicationRestrictionsManagingPackage(@onNull ComponentName admin)4171 public String getApplicationRestrictionsManagingPackage(@NonNull ComponentName admin) { 4172 throwIfParentInstance("getApplicationRestrictionsManagingPackage"); 4173 if (mService != null) { 4174 try { 4175 return mService.getApplicationRestrictionsManagingPackage(admin); 4176 } catch (RemoteException e) { 4177 throw e.rethrowFromSystemServer(); 4178 } 4179 } 4180 return null; 4181 } 4182 4183 /** 4184 * Called by any application to find out whether it has been granted permission via 4185 * {@link #setApplicationRestrictionsManagingPackage} to manage application restrictions 4186 * for the calling user. 4187 * 4188 * <p>This is done by comparing the calling Linux uid with the uid of the package specified by 4189 * that method. 4190 */ isCallerApplicationRestrictionsManagingPackage()4191 public boolean isCallerApplicationRestrictionsManagingPackage() { 4192 throwIfParentInstance("isCallerApplicationRestrictionsManagingPackage"); 4193 if (mService != null) { 4194 try { 4195 return mService.isCallerApplicationRestrictionsManagingPackage(); 4196 } catch (RemoteException e) { 4197 throw e.rethrowFromSystemServer(); 4198 } 4199 } 4200 return false; 4201 } 4202 4203 /** 4204 * Sets the application restrictions for a given target application running in the calling user. 4205 * <p> 4206 * The caller must be a profile or device owner on that user, or the package allowed to manage 4207 * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a 4208 * security exception will be thrown. 4209 * <p> 4210 * The provided {@link Bundle} consists of key-value pairs, where the types of values may be: 4211 * <ul> 4212 * <li>{@code boolean} 4213 * <li>{@code int} 4214 * <li>{@code String} or {@code String[]} 4215 * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]} 4216 * </ul> 4217 * <p> 4218 * If the restrictions are not available yet, but may be applied in the near future, the caller 4219 * can notify the target application of that by adding 4220 * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter. 4221 * <p> 4222 * The application restrictions are only made visible to the target application via 4223 * {@link UserManager#getApplicationRestrictions(String)}, in addition to the profile or device 4224 * owner, and the application restrictions managing package via 4225 * {@link #getApplicationRestrictions}. 4226 * 4227 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 4228 * {@code null} if called by the application restrictions managing package. 4229 * @param packageName The name of the package to update restricted settings for. 4230 * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new 4231 * set of active restrictions. 4232 * @throws SecurityException if {@code admin} is not a device or profile owner. 4233 * @see #setApplicationRestrictionsManagingPackage 4234 * @see UserManager#KEY_RESTRICTIONS_PENDING 4235 */ setApplicationRestrictions(@ullable ComponentName admin, String packageName, Bundle settings)4236 public void setApplicationRestrictions(@Nullable ComponentName admin, String packageName, 4237 Bundle settings) { 4238 throwIfParentInstance("setApplicationRestrictions"); 4239 if (mService != null) { 4240 try { 4241 mService.setApplicationRestrictions(admin, packageName, settings); 4242 } catch (RemoteException e) { 4243 throw e.rethrowFromSystemServer(); 4244 } 4245 } 4246 } 4247 4248 /** 4249 * Sets a list of configuration features to enable for a TrustAgent component. This is meant to 4250 * be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all trust 4251 * agents but those enabled by this function call. If flag 4252 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is not set, then this call has no effect. 4253 * <p> 4254 * The calling device admin must have requested 4255 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method; 4256 * if not, a security exception will be thrown. 4257 * <p> 4258 * This method can be called on the {@link DevicePolicyManager} instance returned by 4259 * {@link #getParentProfileInstance(ComponentName)} in order to set the configuration for 4260 * the parent profile. 4261 * 4262 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4263 * @param target Component name of the agent to be enabled. 4264 * @param configuration TrustAgent-specific feature bundle. If null for any admin, agent will be 4265 * strictly disabled according to the state of the 4266 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag. 4267 * <p> 4268 * If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all 4269 * admins, then it's up to the TrustAgent itself to aggregate the values from all 4270 * device admins. 4271 * <p> 4272 * Consult documentation for the specific TrustAgent to determine legal options 4273 * parameters. 4274 * @throws SecurityException if {@code admin} is not an active administrator or does not use 4275 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} 4276 */ setTrustAgentConfiguration(@onNull ComponentName admin, @NonNull ComponentName target, PersistableBundle configuration)4277 public void setTrustAgentConfiguration(@NonNull ComponentName admin, 4278 @NonNull ComponentName target, PersistableBundle configuration) { 4279 if (mService != null) { 4280 try { 4281 mService.setTrustAgentConfiguration(admin, target, configuration, mParentInstance); 4282 } catch (RemoteException e) { 4283 throw e.rethrowFromSystemServer(); 4284 } 4285 } 4286 } 4287 4288 /** 4289 * Gets configuration for the given trust agent based on aggregating all calls to 4290 * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)} for 4291 * all device admins. 4292 * <p> 4293 * This method can be called on the {@link DevicePolicyManager} instance returned by 4294 * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the configuration set 4295 * on the parent profile. 4296 * 4297 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null, 4298 * this function returns a list of configurations for all admins that declare 4299 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. If any admin declares 4300 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} but doesn't call 4301 * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)} 4302 * for this {@param agent} or calls it with a null configuration, null is returned. 4303 * @param agent Which component to get enabled features for. 4304 * @return configuration for the given trust agent. 4305 */ getTrustAgentConfiguration(@ullable ComponentName admin, @NonNull ComponentName agent)4306 public List<PersistableBundle> getTrustAgentConfiguration(@Nullable ComponentName admin, 4307 @NonNull ComponentName agent) { 4308 return getTrustAgentConfiguration(admin, agent, myUserId()); 4309 } 4310 4311 /** @hide per-user version */ getTrustAgentConfiguration(@ullable ComponentName admin, @NonNull ComponentName agent, int userHandle)4312 public List<PersistableBundle> getTrustAgentConfiguration(@Nullable ComponentName admin, 4313 @NonNull ComponentName agent, int userHandle) { 4314 if (mService != null) { 4315 try { 4316 return mService.getTrustAgentConfiguration(admin, agent, userHandle, 4317 mParentInstance); 4318 } catch (RemoteException e) { 4319 throw e.rethrowFromSystemServer(); 4320 } 4321 } 4322 return new ArrayList<PersistableBundle>(); // empty list 4323 } 4324 4325 /** 4326 * Called by a profile owner of a managed profile to set whether caller-Id information from the 4327 * managed profile will be shown in the parent profile, for incoming calls. 4328 * <p> 4329 * The calling device admin must be a profile owner. If it is not, a security exception will be 4330 * thrown. 4331 * 4332 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4333 * @param disabled If true caller-Id information in the managed profile is not displayed. 4334 * @throws SecurityException if {@code admin} is not a device or profile owner. 4335 */ setCrossProfileCallerIdDisabled(@onNull ComponentName admin, boolean disabled)4336 public void setCrossProfileCallerIdDisabled(@NonNull ComponentName admin, boolean disabled) { 4337 throwIfParentInstance("setCrossProfileCallerIdDisabled"); 4338 if (mService != null) { 4339 try { 4340 mService.setCrossProfileCallerIdDisabled(admin, disabled); 4341 } catch (RemoteException e) { 4342 throw e.rethrowFromSystemServer(); 4343 } 4344 } 4345 } 4346 4347 /** 4348 * Called by a profile owner of a managed profile to determine whether or not caller-Id 4349 * information has been disabled. 4350 * <p> 4351 * The calling device admin must be a profile owner. If it is not, a security exception will be 4352 * thrown. 4353 * 4354 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4355 * @throws SecurityException if {@code admin} is not a device or profile owner. 4356 */ getCrossProfileCallerIdDisabled(@onNull ComponentName admin)4357 public boolean getCrossProfileCallerIdDisabled(@NonNull ComponentName admin) { 4358 throwIfParentInstance("getCrossProfileCallerIdDisabled"); 4359 if (mService != null) { 4360 try { 4361 return mService.getCrossProfileCallerIdDisabled(admin); 4362 } catch (RemoteException e) { 4363 throw e.rethrowFromSystemServer(); 4364 } 4365 } 4366 return false; 4367 } 4368 4369 /** 4370 * Determine whether or not caller-Id information has been disabled. 4371 * 4372 * @param userHandle The user for whom to check the caller-id permission 4373 * @hide 4374 */ getCrossProfileCallerIdDisabled(UserHandle userHandle)4375 public boolean getCrossProfileCallerIdDisabled(UserHandle userHandle) { 4376 if (mService != null) { 4377 try { 4378 return mService.getCrossProfileCallerIdDisabledForUser(userHandle.getIdentifier()); 4379 } catch (RemoteException e) { 4380 throw e.rethrowFromSystemServer(); 4381 } 4382 } 4383 return false; 4384 } 4385 4386 /** 4387 * Called by a profile owner of a managed profile to set whether contacts search from the 4388 * managed profile will be shown in the parent profile, for incoming calls. 4389 * <p> 4390 * The calling device admin must be a profile owner. If it is not, a security exception will be 4391 * thrown. 4392 * 4393 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4394 * @param disabled If true contacts search in the managed profile is not displayed. 4395 * @throws SecurityException if {@code admin} is not a device or profile owner. 4396 */ setCrossProfileContactsSearchDisabled(@onNull ComponentName admin, boolean disabled)4397 public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin, 4398 boolean disabled) { 4399 throwIfParentInstance("setCrossProfileContactsSearchDisabled"); 4400 if (mService != null) { 4401 try { 4402 mService.setCrossProfileContactsSearchDisabled(admin, disabled); 4403 } catch (RemoteException e) { 4404 throw e.rethrowFromSystemServer(); 4405 } 4406 } 4407 } 4408 4409 /** 4410 * Called by a profile owner of a managed profile to determine whether or not contacts search 4411 * has been disabled. 4412 * <p> 4413 * The calling device admin must be a profile owner. If it is not, a security exception will be 4414 * thrown. 4415 * 4416 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4417 * @throws SecurityException if {@code admin} is not a device or profile owner. 4418 */ getCrossProfileContactsSearchDisabled(@onNull ComponentName admin)4419 public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) { 4420 throwIfParentInstance("getCrossProfileContactsSearchDisabled"); 4421 if (mService != null) { 4422 try { 4423 return mService.getCrossProfileContactsSearchDisabled(admin); 4424 } catch (RemoteException e) { 4425 throw e.rethrowFromSystemServer(); 4426 } 4427 } 4428 return false; 4429 } 4430 4431 4432 /** 4433 * Determine whether or not contacts search has been disabled. 4434 * 4435 * @param userHandle The user for whom to check the contacts search permission 4436 * @hide 4437 */ getCrossProfileContactsSearchDisabled(@onNull UserHandle userHandle)4438 public boolean getCrossProfileContactsSearchDisabled(@NonNull UserHandle userHandle) { 4439 if (mService != null) { 4440 try { 4441 return mService 4442 .getCrossProfileContactsSearchDisabledForUser(userHandle.getIdentifier()); 4443 } catch (RemoteException e) { 4444 throw e.rethrowFromSystemServer(); 4445 } 4446 } 4447 return false; 4448 } 4449 4450 /** 4451 * Start Quick Contact on the managed profile for the user, if the policy allows. 4452 * 4453 * @hide 4454 */ startManagedQuickContact(String actualLookupKey, long actualContactId, boolean isContactIdIgnored, long directoryId, Intent originalIntent)4455 public void startManagedQuickContact(String actualLookupKey, long actualContactId, 4456 boolean isContactIdIgnored, long directoryId, Intent originalIntent) { 4457 if (mService != null) { 4458 try { 4459 mService.startManagedQuickContact(actualLookupKey, actualContactId, 4460 isContactIdIgnored, directoryId, originalIntent); 4461 } catch (RemoteException e) { 4462 throw e.rethrowFromSystemServer(); 4463 } 4464 } 4465 } 4466 4467 /** 4468 * Start Quick Contact on the managed profile for the user, if the policy allows. 4469 * @hide 4470 */ startManagedQuickContact(String actualLookupKey, long actualContactId, Intent originalIntent)4471 public void startManagedQuickContact(String actualLookupKey, long actualContactId, 4472 Intent originalIntent) { 4473 startManagedQuickContact(actualLookupKey, actualContactId, false, Directory.DEFAULT, 4474 originalIntent); 4475 } 4476 4477 /** 4478 * Called by a profile owner of a managed profile to set whether bluetooth devices can access 4479 * enterprise contacts. 4480 * <p> 4481 * The calling device admin must be a profile owner. If it is not, a security exception will be 4482 * thrown. 4483 * <p> 4484 * This API works on managed profile only. 4485 * 4486 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4487 * @param disabled If true, bluetooth devices cannot access enterprise contacts. 4488 * @throws SecurityException if {@code admin} is not a device or profile owner. 4489 */ setBluetoothContactSharingDisabled(@onNull ComponentName admin, boolean disabled)4490 public void setBluetoothContactSharingDisabled(@NonNull ComponentName admin, boolean disabled) { 4491 throwIfParentInstance("setBluetoothContactSharingDisabled"); 4492 if (mService != null) { 4493 try { 4494 mService.setBluetoothContactSharingDisabled(admin, disabled); 4495 } catch (RemoteException e) { 4496 throw e.rethrowFromSystemServer(); 4497 } 4498 } 4499 } 4500 4501 /** 4502 * Called by a profile owner of a managed profile to determine whether or not Bluetooth devices 4503 * cannot access enterprise contacts. 4504 * <p> 4505 * The calling device admin must be a profile owner. If it is not, a security exception will be 4506 * thrown. 4507 * <p> 4508 * This API works on managed profile only. 4509 * 4510 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4511 * @throws SecurityException if {@code admin} is not a device or profile owner. 4512 */ getBluetoothContactSharingDisabled(@onNull ComponentName admin)4513 public boolean getBluetoothContactSharingDisabled(@NonNull ComponentName admin) { 4514 throwIfParentInstance("getBluetoothContactSharingDisabled"); 4515 if (mService != null) { 4516 try { 4517 return mService.getBluetoothContactSharingDisabled(admin); 4518 } catch (RemoteException e) { 4519 throw e.rethrowFromSystemServer(); 4520 } 4521 } 4522 return true; 4523 } 4524 4525 /** 4526 * Determine whether or not Bluetooth devices cannot access contacts. 4527 * <p> 4528 * This API works on managed profile UserHandle only. 4529 * 4530 * @param userHandle The user for whom to check the caller-id permission 4531 * @hide 4532 */ getBluetoothContactSharingDisabled(UserHandle userHandle)4533 public boolean getBluetoothContactSharingDisabled(UserHandle userHandle) { 4534 if (mService != null) { 4535 try { 4536 return mService.getBluetoothContactSharingDisabledForUser(userHandle 4537 .getIdentifier()); 4538 } catch (RemoteException e) { 4539 throw e.rethrowFromSystemServer(); 4540 } 4541 } 4542 return true; 4543 } 4544 4545 /** 4546 * Called by the profile owner of a managed profile so that some intents sent in the managed 4547 * profile can also be resolved in the parent, or vice versa. Only activity intents are 4548 * supported. 4549 * 4550 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4551 * @param filter The {@link IntentFilter} the intent has to match to be also resolved in the 4552 * other profile 4553 * @param flags {@link DevicePolicyManager#FLAG_MANAGED_CAN_ACCESS_PARENT} and 4554 * {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported. 4555 * @throws SecurityException if {@code admin} is not a device or profile owner. 4556 */ addCrossProfileIntentFilter(@onNull ComponentName admin, IntentFilter filter, int flags)4557 public void addCrossProfileIntentFilter(@NonNull ComponentName admin, IntentFilter filter, int flags) { 4558 throwIfParentInstance("addCrossProfileIntentFilter"); 4559 if (mService != null) { 4560 try { 4561 mService.addCrossProfileIntentFilter(admin, filter, flags); 4562 } catch (RemoteException e) { 4563 throw e.rethrowFromSystemServer(); 4564 } 4565 } 4566 } 4567 4568 /** 4569 * Called by a profile owner of a managed profile to remove the cross-profile intent filters 4570 * that go from the managed profile to the parent, or from the parent to the managed profile. 4571 * Only removes those that have been set by the profile owner. 4572 * 4573 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4574 * @throws SecurityException if {@code admin} is not a device or profile owner. 4575 */ clearCrossProfileIntentFilters(@onNull ComponentName admin)4576 public void clearCrossProfileIntentFilters(@NonNull ComponentName admin) { 4577 throwIfParentInstance("clearCrossProfileIntentFilters"); 4578 if (mService != null) { 4579 try { 4580 mService.clearCrossProfileIntentFilters(admin); 4581 } catch (RemoteException e) { 4582 throw e.rethrowFromSystemServer(); 4583 } 4584 } 4585 } 4586 4587 /** 4588 * Called by a profile or device owner to set the permitted accessibility services. When set by 4589 * a device owner or profile owner the restriction applies to all profiles of the user the 4590 * device owner or profile owner is an admin for. By default the user can use any accessiblity 4591 * service. When zero or more packages have been added, accessiblity services that are not in 4592 * the list and not part of the system can not be enabled by the user. 4593 * <p> 4594 * Calling with a null value for the list disables the restriction so that all services can be 4595 * used, calling with an empty list only allows the builtin system's services. 4596 * <p> 4597 * System accesibility services are always available to the user the list can't modify this. 4598 * 4599 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4600 * @param packageNames List of accessibility service package names. 4601 * @return true if setting the restriction succeeded. It fail if there is one or more non-system 4602 * accessibility services enabled, that are not in the list. 4603 * @throws SecurityException if {@code admin} is not a device or profile owner. 4604 */ setPermittedAccessibilityServices(@onNull ComponentName admin, List<String> packageNames)4605 public boolean setPermittedAccessibilityServices(@NonNull ComponentName admin, 4606 List<String> packageNames) { 4607 throwIfParentInstance("setPermittedAccessibilityServices"); 4608 if (mService != null) { 4609 try { 4610 return mService.setPermittedAccessibilityServices(admin, packageNames); 4611 } catch (RemoteException e) { 4612 throw e.rethrowFromSystemServer(); 4613 } 4614 } 4615 return false; 4616 } 4617 4618 /** 4619 * Returns the list of permitted accessibility services set by this device or profile owner. 4620 * <p> 4621 * An empty list means no accessibility services except system services are allowed. Null means 4622 * all accessibility services are allowed. 4623 * 4624 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4625 * @return List of accessiblity service package names. 4626 * @throws SecurityException if {@code admin} is not a device or profile owner. 4627 */ getPermittedAccessibilityServices(@onNull ComponentName admin)4628 public List<String> getPermittedAccessibilityServices(@NonNull ComponentName admin) { 4629 throwIfParentInstance("getPermittedAccessibilityServices"); 4630 if (mService != null) { 4631 try { 4632 return mService.getPermittedAccessibilityServices(admin); 4633 } catch (RemoteException e) { 4634 throw e.rethrowFromSystemServer(); 4635 } 4636 } 4637 return null; 4638 } 4639 4640 /** 4641 * Called by the system to check if a specific accessibility service is disabled by admin. 4642 * 4643 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4644 * @param packageName Accessibility service package name that needs to be checked. 4645 * @param userHandle user id the admin is running as. 4646 * @return true if the accessibility service is permitted, otherwise false. 4647 * 4648 * @hide 4649 */ isAccessibilityServicePermittedByAdmin(@onNull ComponentName admin, @NonNull String packageName, int userHandle)4650 public boolean isAccessibilityServicePermittedByAdmin(@NonNull ComponentName admin, 4651 @NonNull String packageName, int userHandle) { 4652 if (mService != null) { 4653 try { 4654 return mService.isAccessibilityServicePermittedByAdmin(admin, packageName, 4655 userHandle); 4656 } catch (RemoteException e) { 4657 throw e.rethrowFromSystemServer(); 4658 } 4659 } 4660 return false; 4661 } 4662 4663 /** 4664 * Returns the list of accessibility services permitted by the device or profiles 4665 * owners of this user. 4666 * 4667 * <p>Null means all accessibility services are allowed, if a non-null list is returned 4668 * it will contain the intersection of the permitted lists for any device or profile 4669 * owners that apply to this user. It will also include any system accessibility services. 4670 * 4671 * @param userId which user to check for. 4672 * @return List of accessiblity service package names. 4673 * @hide 4674 */ 4675 @SystemApi getPermittedAccessibilityServices(int userId)4676 public List<String> getPermittedAccessibilityServices(int userId) { 4677 throwIfParentInstance("getPermittedAccessibilityServices"); 4678 if (mService != null) { 4679 try { 4680 return mService.getPermittedAccessibilityServicesForUser(userId); 4681 } catch (RemoteException e) { 4682 throw e.rethrowFromSystemServer(); 4683 } 4684 } 4685 return null; 4686 } 4687 4688 /** 4689 * Called by a profile or device owner to set the permitted input methods services. When set by 4690 * a device owner or profile owner the restriction applies to all profiles of the user the 4691 * device owner or profile owner is an admin for. By default the user can use any input method. 4692 * When zero or more packages have been added, input method that are not in the list and not 4693 * part of the system can not be enabled by the user. This method will fail if it is called for 4694 * a admin that is not for the foreground user or a profile of the foreground user. 4695 * <p> 4696 * Calling with a null value for the list disables the restriction so that all input methods can 4697 * be used, calling with an empty list disables all but the system's own input methods. 4698 * <p> 4699 * System input methods are always available to the user this method can't modify this. 4700 * 4701 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4702 * @param packageNames List of input method package names. 4703 * @return true if setting the restriction succeeded. It will fail if there are one or more 4704 * non-system input methods currently enabled that are not in the packageNames list. 4705 * @throws SecurityException if {@code admin} is not a device or profile owner. 4706 */ setPermittedInputMethods(@onNull ComponentName admin, List<String> packageNames)4707 public boolean setPermittedInputMethods(@NonNull ComponentName admin, List<String> packageNames) { 4708 throwIfParentInstance("setPermittedInputMethods"); 4709 if (mService != null) { 4710 try { 4711 return mService.setPermittedInputMethods(admin, packageNames); 4712 } catch (RemoteException e) { 4713 throw e.rethrowFromSystemServer(); 4714 } 4715 } 4716 return false; 4717 } 4718 4719 4720 /** 4721 * Returns the list of permitted input methods set by this device or profile owner. 4722 * <p> 4723 * An empty list means no input methods except system input methods are allowed. Null means all 4724 * input methods are allowed. 4725 * 4726 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4727 * @return List of input method package names. 4728 * @throws SecurityException if {@code admin} is not a device or profile owner. 4729 */ getPermittedInputMethods(@onNull ComponentName admin)4730 public List<String> getPermittedInputMethods(@NonNull ComponentName admin) { 4731 throwIfParentInstance("getPermittedInputMethods"); 4732 if (mService != null) { 4733 try { 4734 return mService.getPermittedInputMethods(admin); 4735 } catch (RemoteException e) { 4736 throw e.rethrowFromSystemServer(); 4737 } 4738 } 4739 return null; 4740 } 4741 4742 /** 4743 * Called by the system to check if a specific input method is disabled by admin. 4744 * 4745 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4746 * @param packageName Input method package name that needs to be checked. 4747 * @param userHandle user id the admin is running as. 4748 * @return true if the input method is permitted, otherwise false. 4749 * 4750 * @hide 4751 */ isInputMethodPermittedByAdmin(@onNull ComponentName admin, @NonNull String packageName, int userHandle)4752 public boolean isInputMethodPermittedByAdmin(@NonNull ComponentName admin, 4753 @NonNull String packageName, int userHandle) { 4754 if (mService != null) { 4755 try { 4756 return mService.isInputMethodPermittedByAdmin(admin, packageName, userHandle); 4757 } catch (RemoteException e) { 4758 throw e.rethrowFromSystemServer(); 4759 } 4760 } 4761 return false; 4762 } 4763 4764 /** 4765 * Returns the list of input methods permitted by the device or profiles 4766 * owners of the current user. (*Not* calling user, due to a limitation in InputMethodManager.) 4767 * 4768 * <p>Null means all input methods are allowed, if a non-null list is returned 4769 * it will contain the intersection of the permitted lists for any device or profile 4770 * owners that apply to this user. It will also include any system input methods. 4771 * 4772 * @return List of input method package names. 4773 * @hide 4774 */ 4775 @SystemApi getPermittedInputMethodsForCurrentUser()4776 public List<String> getPermittedInputMethodsForCurrentUser() { 4777 throwIfParentInstance("getPermittedInputMethodsForCurrentUser"); 4778 if (mService != null) { 4779 try { 4780 return mService.getPermittedInputMethodsForCurrentUser(); 4781 } catch (RemoteException e) { 4782 throw e.rethrowFromSystemServer(); 4783 } 4784 } 4785 return null; 4786 } 4787 4788 /** 4789 * Called by a device owner to get the list of apps to keep around as APKs even if no user has 4790 * currently installed it. 4791 * 4792 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4793 * 4794 * @return List of package names to keep cached. 4795 * @hide 4796 */ getKeepUninstalledPackages(@onNull ComponentName admin)4797 public List<String> getKeepUninstalledPackages(@NonNull ComponentName admin) { 4798 throwIfParentInstance("getKeepUninstalledPackages"); 4799 if (mService != null) { 4800 try { 4801 return mService.getKeepUninstalledPackages(admin); 4802 } catch (RemoteException e) { 4803 throw e.rethrowFromSystemServer(); 4804 } 4805 } 4806 return null; 4807 } 4808 4809 /** 4810 * Called by a device owner to set a list of apps to keep around as APKs even if no user has 4811 * currently installed it. 4812 * 4813 * <p>Please note that setting this policy does not imply that specified apps will be 4814 * automatically pre-cached.</p> 4815 * 4816 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4817 * @param packageNames List of package names to keep cached. 4818 * @throws SecurityException if {@code admin} is not a device owner. 4819 * @hide 4820 */ setKeepUninstalledPackages(@onNull ComponentName admin, @NonNull List<String> packageNames)4821 public void setKeepUninstalledPackages(@NonNull ComponentName admin, 4822 @NonNull List<String> packageNames) { 4823 throwIfParentInstance("setKeepUninstalledPackages"); 4824 if (mService != null) { 4825 try { 4826 mService.setKeepUninstalledPackages(admin, packageNames); 4827 } catch (RemoteException e) { 4828 throw e.rethrowFromSystemServer(); 4829 } 4830 } 4831 } 4832 4833 /** 4834 * Called by a device owner to create a user with the specified name. The UserHandle returned 4835 * by this method should not be persisted as user handles are recycled as users are removed and 4836 * created. If you need to persist an identifier for this user, use 4837 * {@link UserManager#getSerialNumberForUser}. 4838 * 4839 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4840 * @param name the user's name 4841 * @see UserHandle 4842 * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the 4843 * user could not be created. 4844 * 4845 * @deprecated From {@link android.os.Build.VERSION_CODES#M} 4846 * @removed From {@link android.os.Build.VERSION_CODES#N} 4847 */ 4848 @Deprecated createUser(@onNull ComponentName admin, String name)4849 public UserHandle createUser(@NonNull ComponentName admin, String name) { 4850 return null; 4851 } 4852 4853 /** 4854 * Called by a device owner to create a user with the specified name. The UserHandle returned 4855 * by this method should not be persisted as user handles are recycled as users are removed and 4856 * created. If you need to persist an identifier for this user, use 4857 * {@link UserManager#getSerialNumberForUser}. The new user will be started in the background 4858 * immediately. 4859 * 4860 * <p> profileOwnerComponent is the {@link DeviceAdminReceiver} to be the profile owner as well 4861 * as registered as an active admin on the new user. The profile owner package will be 4862 * installed on the new user if it already is installed on the device. 4863 * 4864 * <p>If the optionalInitializeData is not null, then the extras will be passed to the 4865 * profileOwnerComponent when onEnable is called. 4866 * 4867 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4868 * @param name the user's name 4869 * @param ownerName the human readable name of the organisation associated with this DPM. 4870 * @param profileOwnerComponent The {@link DeviceAdminReceiver} that will be an active admin on 4871 * the user. 4872 * @param adminExtras Extras that will be passed to onEnable of the admin receiver 4873 * on the new user. 4874 * @see UserHandle 4875 * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the 4876 * user could not be created. 4877 * 4878 * @deprecated From {@link android.os.Build.VERSION_CODES#M} 4879 * @removed From {@link android.os.Build.VERSION_CODES#N} 4880 */ 4881 @Deprecated createAndInitializeUser(@onNull ComponentName admin, String name, String ownerName, @NonNull ComponentName profileOwnerComponent, Bundle adminExtras)4882 public UserHandle createAndInitializeUser(@NonNull ComponentName admin, String name, 4883 String ownerName, @NonNull ComponentName profileOwnerComponent, Bundle adminExtras) { 4884 return null; 4885 } 4886 4887 /** 4888 * Flag used by {@link #createAndManageUser} to skip setup wizard after creating a new user. 4889 */ 4890 public static final int SKIP_SETUP_WIZARD = 0x0001; 4891 4892 /** 4893 * Flag used by {@link #createAndManageUser} to specify that the user should be created 4894 * ephemeral. 4895 * @hide 4896 */ 4897 public static final int MAKE_USER_EPHEMERAL = 0x0002; 4898 4899 /** 4900 * Called by a device owner to create a user with the specified name and a given component of 4901 * the calling package as profile owner. The UserHandle returned by this method should not be 4902 * persisted as user handles are recycled as users are removed and created. If you need to 4903 * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new 4904 * user will not be started in the background. 4905 * <p> 4906 * admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also a 4907 * DeviceAdminReceiver in the same package as admin, and will become the profile owner and will 4908 * be registered as an active admin on the new user. The profile owner package will be installed 4909 * on the new user. 4910 * <p> 4911 * If the adminExtras are not null, they will be stored on the device until the user is started 4912 * for the first time. Then the extras will be passed to the admin when onEnable is called. 4913 * 4914 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4915 * @param name The user's name. 4916 * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the 4917 * same package as admin, otherwise no user is created and an 4918 * IllegalArgumentException is thrown. 4919 * @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new 4920 * user. 4921 * @param flags {@link #SKIP_SETUP_WIZARD} is supported. 4922 * @see UserHandle 4923 * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the 4924 * user could not be created. 4925 * @throws SecurityException if {@code admin} is not a device owner. 4926 */ createAndManageUser(@onNull ComponentName admin, @NonNull String name, @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras, int flags)4927 public UserHandle createAndManageUser(@NonNull ComponentName admin, @NonNull String name, 4928 @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras, 4929 int flags) { 4930 throwIfParentInstance("createAndManageUser"); 4931 try { 4932 return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags); 4933 } catch (RemoteException re) { 4934 throw re.rethrowFromSystemServer(); 4935 } 4936 } 4937 4938 /** 4939 * Called by a device owner to remove a user and all associated data. The primary user can not 4940 * be removed. 4941 * 4942 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4943 * @param userHandle the user to remove. 4944 * @return {@code true} if the user was removed, {@code false} otherwise. 4945 * @throws SecurityException if {@code admin} is not a device owner. 4946 */ removeUser(@onNull ComponentName admin, UserHandle userHandle)4947 public boolean removeUser(@NonNull ComponentName admin, UserHandle userHandle) { 4948 throwIfParentInstance("removeUser"); 4949 try { 4950 return mService.removeUser(admin, userHandle); 4951 } catch (RemoteException re) { 4952 throw re.rethrowFromSystemServer(); 4953 } 4954 } 4955 4956 /** 4957 * Called by a device owner to switch the specified user to the foreground. 4958 * 4959 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 4960 * @param userHandle the user to switch to; null will switch to primary. 4961 * @return {@code true} if the switch was successful, {@code false} otherwise. 4962 * @throws SecurityException if {@code admin} is not a device owner. 4963 * @see Intent#ACTION_USER_FOREGROUND 4964 */ switchUser(@onNull ComponentName admin, @Nullable UserHandle userHandle)4965 public boolean switchUser(@NonNull ComponentName admin, @Nullable UserHandle userHandle) { 4966 throwIfParentInstance("switchUser"); 4967 try { 4968 return mService.switchUser(admin, userHandle); 4969 } catch (RemoteException re) { 4970 throw re.rethrowFromSystemServer(); 4971 } 4972 } 4973 4974 /** 4975 * Retrieves the application restrictions for a given target application running in the calling 4976 * user. 4977 * <p> 4978 * The caller must be a profile or device owner on that user, or the package allowed to manage 4979 * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a 4980 * security exception will be thrown. 4981 * 4982 * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or 4983 * {@code null} if called by the application restrictions managing package. 4984 * @param packageName The name of the package to fetch restricted settings of. 4985 * @return {@link Bundle} of settings corresponding to what was set last time 4986 * {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty 4987 * {@link Bundle} if no restrictions have been set. 4988 * @throws SecurityException if {@code admin} is not a device or profile owner. 4989 * @see {@link #setApplicationRestrictionsManagingPackage} 4990 */ getApplicationRestrictions(@ullable ComponentName admin, String packageName)4991 public Bundle getApplicationRestrictions(@Nullable ComponentName admin, String packageName) { 4992 throwIfParentInstance("getApplicationRestrictions"); 4993 if (mService != null) { 4994 try { 4995 return mService.getApplicationRestrictions(admin, packageName); 4996 } catch (RemoteException e) { 4997 throw e.rethrowFromSystemServer(); 4998 } 4999 } 5000 return null; 5001 } 5002 5003 /** 5004 * Called by a profile or device owner to set a user restriction specified by the key. 5005 * <p> 5006 * The calling device admin must be a profile or device owner; if it is not, a security 5007 * exception will be thrown. 5008 * 5009 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5010 * @param key The key of the restriction. See the constants in {@link android.os.UserManager} 5011 * for the list of keys. 5012 * @throws SecurityException if {@code admin} is not a device or profile owner. 5013 */ addUserRestriction(@onNull ComponentName admin, String key)5014 public void addUserRestriction(@NonNull ComponentName admin, String key) { 5015 throwIfParentInstance("addUserRestriction"); 5016 if (mService != null) { 5017 try { 5018 mService.setUserRestriction(admin, key, true); 5019 } catch (RemoteException e) { 5020 throw e.rethrowFromSystemServer(); 5021 } 5022 } 5023 } 5024 5025 /** 5026 * Called by a profile or device owner to clear a user restriction specified by the key. 5027 * <p> 5028 * The calling device admin must be a profile or device owner; if it is not, a security 5029 * exception will be thrown. 5030 * 5031 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5032 * @param key The key of the restriction. See the constants in {@link android.os.UserManager} 5033 * for the list of keys. 5034 * @throws SecurityException if {@code admin} is not a device or profile owner. 5035 */ clearUserRestriction(@onNull ComponentName admin, String key)5036 public void clearUserRestriction(@NonNull ComponentName admin, String key) { 5037 throwIfParentInstance("clearUserRestriction"); 5038 if (mService != null) { 5039 try { 5040 mService.setUserRestriction(admin, key, false); 5041 } catch (RemoteException e) { 5042 throw e.rethrowFromSystemServer(); 5043 } 5044 } 5045 } 5046 5047 /** 5048 * Called by a profile or device owner to get user restrictions set with 5049 * {@link #addUserRestriction(ComponentName, String)}. 5050 * <p> 5051 * The target user may have more restrictions set by the system or other device owner / profile 5052 * owner. To get all the user restrictions currently set, use 5053 * {@link UserManager#getUserRestrictions()}. 5054 * 5055 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5056 * @throws SecurityException if {@code admin} is not a device or profile owner. 5057 */ getUserRestrictions(@onNull ComponentName admin)5058 public Bundle getUserRestrictions(@NonNull ComponentName admin) { 5059 throwIfParentInstance("getUserRestrictions"); 5060 Bundle ret = null; 5061 if (mService != null) { 5062 try { 5063 ret = mService.getUserRestrictions(admin); 5064 } catch (RemoteException e) { 5065 throw e.rethrowFromSystemServer(); 5066 } 5067 } 5068 return ret == null ? new Bundle() : ret; 5069 } 5070 5071 /** 5072 * Called by profile or device owners to hide or unhide packages. When a package is hidden it is 5073 * unavailable for use, but the data and actual package file remain. 5074 * 5075 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5076 * @param packageName The name of the package to hide or unhide. 5077 * @param hidden {@code true} if the package should be hidden, {@code false} if it should be 5078 * unhidden. 5079 * @return boolean Whether the hidden setting of the package was successfully updated. 5080 * @throws SecurityException if {@code admin} is not a device or profile owner. 5081 */ setApplicationHidden(@onNull ComponentName admin, String packageName, boolean hidden)5082 public boolean setApplicationHidden(@NonNull ComponentName admin, String packageName, 5083 boolean hidden) { 5084 throwIfParentInstance("setApplicationHidden"); 5085 if (mService != null) { 5086 try { 5087 return mService.setApplicationHidden(admin, packageName, hidden); 5088 } catch (RemoteException e) { 5089 throw e.rethrowFromSystemServer(); 5090 } 5091 } 5092 return false; 5093 } 5094 5095 /** 5096 * Called by profile or device owners to determine if a package is hidden. 5097 * 5098 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5099 * @param packageName The name of the package to retrieve the hidden status of. 5100 * @return boolean {@code true} if the package is hidden, {@code false} otherwise. 5101 * @throws SecurityException if {@code admin} is not a device or profile owner. 5102 */ isApplicationHidden(@onNull ComponentName admin, String packageName)5103 public boolean isApplicationHidden(@NonNull ComponentName admin, String packageName) { 5104 throwIfParentInstance("isApplicationHidden"); 5105 if (mService != null) { 5106 try { 5107 return mService.isApplicationHidden(admin, packageName); 5108 } catch (RemoteException e) { 5109 throw e.rethrowFromSystemServer(); 5110 } 5111 } 5112 return false; 5113 } 5114 5115 /** 5116 * Called by profile or device owners to re-enable a system app that was disabled by default 5117 * when the user was initialized. 5118 * 5119 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5120 * @param packageName The package to be re-enabled in the calling profile. 5121 * @throws SecurityException if {@code admin} is not a device or profile owner. 5122 */ enableSystemApp(@onNull ComponentName admin, String packageName)5123 public void enableSystemApp(@NonNull ComponentName admin, String packageName) { 5124 throwIfParentInstance("enableSystemApp"); 5125 if (mService != null) { 5126 try { 5127 mService.enableSystemApp(admin, packageName); 5128 } catch (RemoteException e) { 5129 throw e.rethrowFromSystemServer(); 5130 } 5131 } 5132 } 5133 5134 /** 5135 * Called by profile or device owners to re-enable system apps by intent that were disabled by 5136 * default when the user was initialized. 5137 * 5138 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5139 * @param intent An intent matching the app(s) to be installed. All apps that resolve for this 5140 * intent will be re-enabled in the calling profile. 5141 * @return int The number of activities that matched the intent and were installed. 5142 * @throws SecurityException if {@code admin} is not a device or profile owner. 5143 */ enableSystemApp(@onNull ComponentName admin, Intent intent)5144 public int enableSystemApp(@NonNull ComponentName admin, Intent intent) { 5145 throwIfParentInstance("enableSystemApp"); 5146 if (mService != null) { 5147 try { 5148 return mService.enableSystemAppWithIntent(admin, intent); 5149 } catch (RemoteException e) { 5150 throw e.rethrowFromSystemServer(); 5151 } 5152 } 5153 return 0; 5154 } 5155 5156 /** 5157 * Called by a device owner or profile owner to disable account management for a specific type 5158 * of account. 5159 * <p> 5160 * The calling device admin must be a device owner or profile owner. If it is not, a security 5161 * exception will be thrown. 5162 * <p> 5163 * When account management is disabled for an account type, adding or removing an account of 5164 * that type will not be possible. 5165 * <p> 5166 * From {@link android.os.Build.VERSION_CODES#N} the profile or device owner can still use 5167 * {@link android.accounts.AccountManager} APIs to add or remove accounts when account 5168 * management for a specific type is disabled. 5169 * 5170 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5171 * @param accountType For which account management is disabled or enabled. 5172 * @param disabled The boolean indicating that account management will be disabled (true) or 5173 * enabled (false). 5174 * @throws SecurityException if {@code admin} is not a device or profile owner. 5175 */ setAccountManagementDisabled(@onNull ComponentName admin, String accountType, boolean disabled)5176 public void setAccountManagementDisabled(@NonNull ComponentName admin, String accountType, 5177 boolean disabled) { 5178 throwIfParentInstance("setAccountManagementDisabled"); 5179 if (mService != null) { 5180 try { 5181 mService.setAccountManagementDisabled(admin, accountType, disabled); 5182 } catch (RemoteException e) { 5183 throw e.rethrowFromSystemServer(); 5184 } 5185 } 5186 } 5187 5188 /** 5189 * Gets the array of accounts for which account management is disabled by the profile owner. 5190 * 5191 * <p> Account management can be disabled/enabled by calling 5192 * {@link #setAccountManagementDisabled}. 5193 * 5194 * @return a list of account types for which account management has been disabled. 5195 * 5196 * @see #setAccountManagementDisabled 5197 */ getAccountTypesWithManagementDisabled()5198 public String[] getAccountTypesWithManagementDisabled() { 5199 throwIfParentInstance("getAccountTypesWithManagementDisabled"); 5200 return getAccountTypesWithManagementDisabledAsUser(myUserId()); 5201 } 5202 5203 /** 5204 * @see #getAccountTypesWithManagementDisabled() 5205 * @hide 5206 */ getAccountTypesWithManagementDisabledAsUser(int userId)5207 public String[] getAccountTypesWithManagementDisabledAsUser(int userId) { 5208 if (mService != null) { 5209 try { 5210 return mService.getAccountTypesWithManagementDisabledAsUser(userId); 5211 } catch (RemoteException e) { 5212 throw e.rethrowFromSystemServer(); 5213 } 5214 } 5215 5216 return null; 5217 } 5218 5219 /** 5220 * Sets which packages may enter lock task mode. 5221 * <p> 5222 * Any packages that shares uid with an allowed package will also be allowed to activate lock 5223 * task. From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task 5224 * package list results in locked tasks belonging to those packages to be finished. This 5225 * function can only be called by the device owner. 5226 * 5227 * @param packages The list of packages allowed to enter lock task mode 5228 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5229 * @throws SecurityException if {@code admin} is not a device owner. 5230 * @see Activity#startLockTask() 5231 * @see DeviceAdminReceiver#onLockTaskModeEntering(Context, Intent, String) 5232 * @see DeviceAdminReceiver#onLockTaskModeExiting(Context, Intent) 5233 * @see UserManager#DISALLOW_CREATE_WINDOWS 5234 */ setLockTaskPackages(@onNull ComponentName admin, String[] packages)5235 public void setLockTaskPackages(@NonNull ComponentName admin, String[] packages) 5236 throws SecurityException { 5237 throwIfParentInstance("setLockTaskPackages"); 5238 if (mService != null) { 5239 try { 5240 mService.setLockTaskPackages(admin, packages); 5241 } catch (RemoteException e) { 5242 throw e.rethrowFromSystemServer(); 5243 } 5244 } 5245 } 5246 5247 /** 5248 * This function returns the list of packages allowed to start the lock task mode. 5249 * 5250 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5251 * @hide 5252 */ getLockTaskPackages(@onNull ComponentName admin)5253 public String[] getLockTaskPackages(@NonNull ComponentName admin) { 5254 throwIfParentInstance("getLockTaskPackages"); 5255 if (mService != null) { 5256 try { 5257 return mService.getLockTaskPackages(admin); 5258 } catch (RemoteException e) { 5259 throw e.rethrowFromSystemServer(); 5260 } 5261 } 5262 return null; 5263 } 5264 5265 /** 5266 * This function lets the caller know whether the given component is allowed to start the 5267 * lock task mode. 5268 * @param pkg The package to check 5269 */ isLockTaskPermitted(String pkg)5270 public boolean isLockTaskPermitted(String pkg) { 5271 throwIfParentInstance("isLockTaskPermitted"); 5272 if (mService != null) { 5273 try { 5274 return mService.isLockTaskPermitted(pkg); 5275 } catch (RemoteException e) { 5276 throw e.rethrowFromSystemServer(); 5277 } 5278 } 5279 return false; 5280 } 5281 5282 /** 5283 * Called by device owners to update {@link Settings.Global} settings. Validation that the value 5284 * of the setting is in the correct form for the setting type should be performed by the caller. 5285 * <p> 5286 * The settings that can be updated with this method are: 5287 * <ul> 5288 * <li>{@link Settings.Global#ADB_ENABLED}</li> 5289 * <li>{@link Settings.Global#AUTO_TIME}</li> 5290 * <li>{@link Settings.Global#AUTO_TIME_ZONE}</li> 5291 * <li>{@link Settings.Global#DATA_ROAMING}</li> 5292 * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li> 5293 * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li> 5294 * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only available from 5295 * {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if 5296 * {@link #setMaximumTimeToLock} is not used to set a timeout.</li> 5297 * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This setting is only 5298 * available from {@link android.os.Build.VERSION_CODES#M} onwards.</li> 5299 * </ul> 5300 * <p> 5301 * Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}: 5302 * <ul> 5303 * <li>{@link Settings.Global#BLUETOOTH_ON}. Use 5304 * {@link android.bluetooth.BluetoothAdapter#enable()} and 5305 * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li> 5306 * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li> 5307 * <li>{@link Settings.Global#MODE_RINGER}. Use 5308 * {@link android.media.AudioManager#setRingerMode(int)} instead.</li> 5309 * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li> 5310 * <li>{@link Settings.Global#WIFI_ON}. Use 5311 * {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li> 5312 * </ul> 5313 * 5314 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5315 * @param setting The name of the setting to update. 5316 * @param value The value to update the setting to. 5317 * @throws SecurityException if {@code admin} is not a device owner. 5318 */ setGlobalSetting(@onNull ComponentName admin, String setting, String value)5319 public void setGlobalSetting(@NonNull ComponentName admin, String setting, String value) { 5320 throwIfParentInstance("setGlobalSetting"); 5321 if (mService != null) { 5322 try { 5323 mService.setGlobalSetting(admin, setting, value); 5324 } catch (RemoteException e) { 5325 throw e.rethrowFromSystemServer(); 5326 } 5327 } 5328 } 5329 5330 /** 5331 * Called by profile or device owners to update {@link Settings.Secure} settings. Validation 5332 * that the value of the setting is in the correct form for the setting type should be performed 5333 * by the caller. 5334 * <p> 5335 * The settings that can be updated by a profile or device owner with this method are: 5336 * <ul> 5337 * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li> 5338 * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li> 5339 * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li> 5340 * </ul> 5341 * <p> 5342 * A device owner can additionally update the following settings: 5343 * <ul> 5344 * <li>{@link Settings.Secure#LOCATION_MODE}</li> 5345 * </ul> 5346 * 5347 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5348 * @param setting The name of the setting to update. 5349 * @param value The value to update the setting to. 5350 * @throws SecurityException if {@code admin} is not a device or profile owner. 5351 */ setSecureSetting(@onNull ComponentName admin, String setting, String value)5352 public void setSecureSetting(@NonNull ComponentName admin, String setting, String value) { 5353 throwIfParentInstance("setSecureSetting"); 5354 if (mService != null) { 5355 try { 5356 mService.setSecureSetting(admin, setting, value); 5357 } catch (RemoteException e) { 5358 throw e.rethrowFromSystemServer(); 5359 } 5360 } 5361 } 5362 5363 /** 5364 * Designates a specific service component as the provider for making permission requests of a 5365 * local or remote administrator of the user. 5366 * <p/> 5367 * Only a profile owner can designate the restrictions provider. 5368 * 5369 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5370 * @param provider The component name of the service that implements 5371 * {@link RestrictionsReceiver}. If this param is null, it removes the restrictions 5372 * provider previously assigned. 5373 * @throws SecurityException if {@code admin} is not a device or profile owner. 5374 */ setRestrictionsProvider(@onNull ComponentName admin, @Nullable ComponentName provider)5375 public void setRestrictionsProvider(@NonNull ComponentName admin, 5376 @Nullable ComponentName provider) { 5377 throwIfParentInstance("setRestrictionsProvider"); 5378 if (mService != null) { 5379 try { 5380 mService.setRestrictionsProvider(admin, provider); 5381 } catch (RemoteException re) { 5382 throw re.rethrowFromSystemServer(); 5383 } 5384 } 5385 } 5386 5387 /** 5388 * Called by profile or device owners to set the master volume mute on or off. 5389 * 5390 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5391 * @param on {@code true} to mute master volume, {@code false} to turn mute off. 5392 * @throws SecurityException if {@code admin} is not a device or profile owner. 5393 */ setMasterVolumeMuted(@onNull ComponentName admin, boolean on)5394 public void setMasterVolumeMuted(@NonNull ComponentName admin, boolean on) { 5395 throwIfParentInstance("setMasterVolumeMuted"); 5396 if (mService != null) { 5397 try { 5398 mService.setMasterVolumeMuted(admin, on); 5399 } catch (RemoteException re) { 5400 throw re.rethrowFromSystemServer(); 5401 } 5402 } 5403 } 5404 5405 /** 5406 * Called by profile or device owners to check whether the master volume mute is on or off. 5407 * 5408 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5409 * @return {@code true} if master volume is muted, {@code false} if it's not. 5410 * @throws SecurityException if {@code admin} is not a device or profile owner. 5411 */ isMasterVolumeMuted(@onNull ComponentName admin)5412 public boolean isMasterVolumeMuted(@NonNull ComponentName admin) { 5413 throwIfParentInstance("isMasterVolumeMuted"); 5414 if (mService != null) { 5415 try { 5416 return mService.isMasterVolumeMuted(admin); 5417 } catch (RemoteException re) { 5418 throw re.rethrowFromSystemServer(); 5419 } 5420 } 5421 return false; 5422 } 5423 5424 /** 5425 * Called by profile or device owners to change whether a user can uninstall a package. 5426 * 5427 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5428 * @param packageName package to change. 5429 * @param uninstallBlocked true if the user shouldn't be able to uninstall the package. 5430 * @throws SecurityException if {@code admin} is not a device or profile owner. 5431 */ setUninstallBlocked(@onNull ComponentName admin, String packageName, boolean uninstallBlocked)5432 public void setUninstallBlocked(@NonNull ComponentName admin, String packageName, 5433 boolean uninstallBlocked) { 5434 throwIfParentInstance("setUninstallBlocked"); 5435 if (mService != null) { 5436 try { 5437 mService.setUninstallBlocked(admin, packageName, uninstallBlocked); 5438 } catch (RemoteException re) { 5439 throw re.rethrowFromSystemServer(); 5440 } 5441 } 5442 } 5443 5444 /** 5445 * Check whether the user has been blocked by device policy from uninstalling a package. 5446 * Requires the caller to be the profile owner if checking a specific admin's policy. 5447 * <p> 5448 * <strong>Note:</strong> Starting from {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}, the 5449 * behavior of this API is changed such that passing {@code null} as the {@code admin} parameter 5450 * will return if any admin has blocked the uninstallation. Before L MR1, passing {@code null} 5451 * will cause a NullPointerException to be raised. 5452 * 5453 * @param admin The name of the admin component whose blocking policy will be checked, or 5454 * {@code null} to check whether any admin has blocked the uninstallation. 5455 * @param packageName package to check. 5456 * @return true if uninstallation is blocked. 5457 * @throws SecurityException if {@code admin} is not a device or profile owner. 5458 */ isUninstallBlocked(@ullable ComponentName admin, String packageName)5459 public boolean isUninstallBlocked(@Nullable ComponentName admin, String packageName) { 5460 throwIfParentInstance("isUninstallBlocked"); 5461 if (mService != null) { 5462 try { 5463 return mService.isUninstallBlocked(admin, packageName); 5464 } catch (RemoteException re) { 5465 throw re.rethrowFromSystemServer(); 5466 } 5467 } 5468 return false; 5469 } 5470 5471 /** 5472 * Called by the profile owner of a managed profile to enable widget providers from a given 5473 * package to be available in the parent profile. As a result the user will be able to add 5474 * widgets from the white-listed package running under the profile to a widget host which runs 5475 * under the parent profile, for example the home screen. Note that a package may have zero or 5476 * more provider components, where each component provides a different widget type. 5477 * <p> 5478 * <strong>Note:</strong> By default no widget provider package is white-listed. 5479 * 5480 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5481 * @param packageName The package from which widget providers are white-listed. 5482 * @return Whether the package was added. 5483 * @throws SecurityException if {@code admin} is not a profile owner. 5484 * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String) 5485 * @see #getCrossProfileWidgetProviders(android.content.ComponentName) 5486 */ addCrossProfileWidgetProvider(@onNull ComponentName admin, String packageName)5487 public boolean addCrossProfileWidgetProvider(@NonNull ComponentName admin, String packageName) { 5488 throwIfParentInstance("addCrossProfileWidgetProvider"); 5489 if (mService != null) { 5490 try { 5491 return mService.addCrossProfileWidgetProvider(admin, packageName); 5492 } catch (RemoteException re) { 5493 throw re.rethrowFromSystemServer(); 5494 } 5495 } 5496 return false; 5497 } 5498 5499 /** 5500 * Called by the profile owner of a managed profile to disable widget providers from a given 5501 * package to be available in the parent profile. For this method to take effect the package 5502 * should have been added via 5503 * {@link #addCrossProfileWidgetProvider( android.content.ComponentName, String)}. 5504 * <p> 5505 * <strong>Note:</strong> By default no widget provider package is white-listed. 5506 * 5507 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5508 * @param packageName The package from which widget providers are no longer white-listed. 5509 * @return Whether the package was removed. 5510 * @throws SecurityException if {@code admin} is not a profile owner. 5511 * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String) 5512 * @see #getCrossProfileWidgetProviders(android.content.ComponentName) 5513 */ removeCrossProfileWidgetProvider( @onNull ComponentName admin, String packageName)5514 public boolean removeCrossProfileWidgetProvider( 5515 @NonNull ComponentName admin, String packageName) { 5516 throwIfParentInstance("removeCrossProfileWidgetProvider"); 5517 if (mService != null) { 5518 try { 5519 return mService.removeCrossProfileWidgetProvider(admin, packageName); 5520 } catch (RemoteException re) { 5521 throw re.rethrowFromSystemServer(); 5522 } 5523 } 5524 return false; 5525 } 5526 5527 /** 5528 * Called by the profile owner of a managed profile to query providers from which packages are 5529 * available in the parent profile. 5530 * 5531 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5532 * @return The white-listed package list. 5533 * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String) 5534 * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String) 5535 * @throws SecurityException if {@code admin} is not a profile owner. 5536 */ getCrossProfileWidgetProviders(@onNull ComponentName admin)5537 public List<String> getCrossProfileWidgetProviders(@NonNull ComponentName admin) { 5538 throwIfParentInstance("getCrossProfileWidgetProviders"); 5539 if (mService != null) { 5540 try { 5541 List<String> providers = mService.getCrossProfileWidgetProviders(admin); 5542 if (providers != null) { 5543 return providers; 5544 } 5545 } catch (RemoteException re) { 5546 throw re.rethrowFromSystemServer(); 5547 } 5548 } 5549 return Collections.emptyList(); 5550 } 5551 5552 /** 5553 * Called by profile or device owners to set the user's photo. 5554 * 5555 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5556 * @param icon the bitmap to set as the photo. 5557 * @throws SecurityException if {@code admin} is not a device or profile owner. 5558 */ setUserIcon(@onNull ComponentName admin, Bitmap icon)5559 public void setUserIcon(@NonNull ComponentName admin, Bitmap icon) { 5560 throwIfParentInstance("setUserIcon"); 5561 try { 5562 mService.setUserIcon(admin, icon); 5563 } catch (RemoteException re) { 5564 throw re.rethrowFromSystemServer(); 5565 } 5566 } 5567 5568 /** 5569 * Called by device owners to set a local system update policy. When a new policy is set, 5570 * {@link #ACTION_SYSTEM_UPDATE_POLICY_CHANGED} is broadcasted. 5571 * 5572 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. All 5573 * components in the device owner package can set system update policies and the most 5574 * recent policy takes effect. 5575 * @param policy the new policy, or {@code null} to clear the current policy. 5576 * @throws SecurityException if {@code admin} is not a device owner. 5577 * @see SystemUpdatePolicy 5578 */ setSystemUpdatePolicy(@onNull ComponentName admin, SystemUpdatePolicy policy)5579 public void setSystemUpdatePolicy(@NonNull ComponentName admin, SystemUpdatePolicy policy) { 5580 throwIfParentInstance("setSystemUpdatePolicy"); 5581 if (mService != null) { 5582 try { 5583 mService.setSystemUpdatePolicy(admin, policy); 5584 } catch (RemoteException re) { 5585 throw re.rethrowFromSystemServer(); 5586 } 5587 } 5588 } 5589 5590 /** 5591 * Retrieve a local system update policy set previously by {@link #setSystemUpdatePolicy}. 5592 * 5593 * @return The current policy object, or {@code null} if no policy is set. 5594 */ getSystemUpdatePolicy()5595 public SystemUpdatePolicy getSystemUpdatePolicy() { 5596 throwIfParentInstance("getSystemUpdatePolicy"); 5597 if (mService != null) { 5598 try { 5599 return mService.getSystemUpdatePolicy(); 5600 } catch (RemoteException re) { 5601 throw re.rethrowFromSystemServer(); 5602 } 5603 } 5604 return null; 5605 } 5606 5607 /** 5608 * Called by a device owner to disable the keyguard altogether. 5609 * <p> 5610 * Setting the keyguard to disabled has the same effect as choosing "None" as the screen lock 5611 * type. However, this call has no effect if a password, pin or pattern is currently set. If a 5612 * password, pin or pattern is set after the keyguard was disabled, the keyguard stops being 5613 * disabled. 5614 * 5615 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5616 * @param disabled {@code true} disables the keyguard, {@code false} reenables it. 5617 * @return {@code false} if attempting to disable the keyguard while a lock password was in 5618 * place. {@code true} otherwise. 5619 * @throws SecurityException if {@code admin} is not a device owner. 5620 */ setKeyguardDisabled(@onNull ComponentName admin, boolean disabled)5621 public boolean setKeyguardDisabled(@NonNull ComponentName admin, boolean disabled) { 5622 throwIfParentInstance("setKeyguardDisabled"); 5623 try { 5624 return mService.setKeyguardDisabled(admin, disabled); 5625 } catch (RemoteException re) { 5626 throw re.rethrowFromSystemServer(); 5627 } 5628 } 5629 5630 /** 5631 * Called by device owner to disable the status bar. Disabling the status bar blocks 5632 * notifications, quick settings and other screen overlays that allow escaping from a single use 5633 * device. 5634 * 5635 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5636 * @param disabled {@code true} disables the status bar, {@code false} reenables it. 5637 * @return {@code false} if attempting to disable the status bar failed. {@code true} otherwise. 5638 * @throws SecurityException if {@code admin} is not a device owner. 5639 */ setStatusBarDisabled(@onNull ComponentName admin, boolean disabled)5640 public boolean setStatusBarDisabled(@NonNull ComponentName admin, boolean disabled) { 5641 throwIfParentInstance("setStatusBarDisabled"); 5642 try { 5643 return mService.setStatusBarDisabled(admin, disabled); 5644 } catch (RemoteException re) { 5645 throw re.rethrowFromSystemServer(); 5646 } 5647 } 5648 5649 /** 5650 * Callable by the system update service to notify device owners about pending updates. 5651 * The caller must hold {@link android.Manifest.permission#NOTIFY_PENDING_SYSTEM_UPDATE} 5652 * permission. 5653 * 5654 * @param updateReceivedTime The time as given by {@link System#currentTimeMillis()} indicating 5655 * when the current pending update was first available. -1 if no update is available. 5656 * @hide 5657 */ 5658 @SystemApi notifyPendingSystemUpdate(long updateReceivedTime)5659 public void notifyPendingSystemUpdate(long updateReceivedTime) { 5660 throwIfParentInstance("notifyPendingSystemUpdate"); 5661 if (mService != null) { 5662 try { 5663 mService.notifyPendingSystemUpdate(updateReceivedTime); 5664 } catch (RemoteException re) { 5665 throw re.rethrowFromSystemServer(); 5666 } 5667 } 5668 } 5669 5670 /** 5671 * Called by profile or device owners to set the default response for future runtime permission 5672 * requests by applications. The policy can allow for normal operation which prompts the user to 5673 * grant a permission, or can allow automatic granting or denying of runtime permission requests 5674 * by an application. This also applies to new permissions declared by app updates. When a 5675 * permission is denied or granted this way, the effect is equivalent to setting the permission 5676 * grant state via {@link #setPermissionGrantState}. 5677 * <p/> 5678 * As this policy only acts on runtime permission requests, it only applies to applications 5679 * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. 5680 * 5681 * @param admin Which profile or device owner this request is associated with. 5682 * @param policy One of the policy constants {@link #PERMISSION_POLICY_PROMPT}, 5683 * {@link #PERMISSION_POLICY_AUTO_GRANT} and {@link #PERMISSION_POLICY_AUTO_DENY}. 5684 * @throws SecurityException if {@code admin} is not a device or profile owner. 5685 * @see #setPermissionGrantState 5686 */ setPermissionPolicy(@onNull ComponentName admin, int policy)5687 public void setPermissionPolicy(@NonNull ComponentName admin, int policy) { 5688 throwIfParentInstance("setPermissionPolicy"); 5689 try { 5690 mService.setPermissionPolicy(admin, policy); 5691 } catch (RemoteException re) { 5692 throw re.rethrowFromSystemServer(); 5693 } 5694 } 5695 5696 /** 5697 * Returns the current runtime permission policy set by the device or profile owner. The 5698 * default is {@link #PERMISSION_POLICY_PROMPT}. 5699 * @param admin Which profile or device owner this request is associated with. 5700 * @return the current policy for future permission requests. 5701 */ getPermissionPolicy(ComponentName admin)5702 public int getPermissionPolicy(ComponentName admin) { 5703 throwIfParentInstance("getPermissionPolicy"); 5704 try { 5705 return mService.getPermissionPolicy(admin); 5706 } catch (RemoteException re) { 5707 throw re.rethrowFromSystemServer(); 5708 } 5709 } 5710 5711 /** 5712 * Sets the grant state of a runtime permission for a specific application. The state can be 5713 * {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it through the UI, 5714 * {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission is denied and the user 5715 * cannot manage it through the UI, and {@link #PERMISSION_GRANT_STATE_GRANTED granted} in which 5716 * the permission is granted and the user cannot manage it through the UI. This might affect all 5717 * permissions in a group that the runtime permission belongs to. This method can only be called 5718 * by a profile or device owner. 5719 * <p/> 5720 * Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not revoke 5721 * the permission. It retains the previous grant, if any. 5722 * <p/> 5723 * Permissions can be granted or revoked only for applications built with a 5724 * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. 5725 * 5726 * @param admin Which profile or device owner this request is associated with. 5727 * @param packageName The application to grant or revoke a permission to. 5728 * @param permission The permission to grant or revoke. 5729 * @param grantState The permission grant state which is one of 5730 * {@link #PERMISSION_GRANT_STATE_DENIED}, {@link #PERMISSION_GRANT_STATE_DEFAULT}, 5731 * {@link #PERMISSION_GRANT_STATE_GRANTED}, 5732 * @return whether the permission was successfully granted or revoked. 5733 * @throws SecurityException if {@code admin} is not a device or profile owner. 5734 * @see #PERMISSION_GRANT_STATE_DENIED 5735 * @see #PERMISSION_GRANT_STATE_DEFAULT 5736 * @see #PERMISSION_GRANT_STATE_GRANTED 5737 */ setPermissionGrantState(@onNull ComponentName admin, String packageName, String permission, int grantState)5738 public boolean setPermissionGrantState(@NonNull ComponentName admin, String packageName, 5739 String permission, int grantState) { 5740 throwIfParentInstance("setPermissionGrantState"); 5741 try { 5742 return mService.setPermissionGrantState(admin, packageName, permission, grantState); 5743 } catch (RemoteException re) { 5744 throw re.rethrowFromSystemServer(); 5745 } 5746 } 5747 5748 /** 5749 * Returns the current grant state of a runtime permission for a specific application. 5750 * 5751 * @param admin Which profile or device owner this request is associated with. 5752 * @param packageName The application to check the grant state for. 5753 * @param permission The permission to check for. 5754 * @return the current grant state specified by device policy. If the profile or device owner 5755 * has not set a grant state, the return value is 5756 * {@link #PERMISSION_GRANT_STATE_DEFAULT}. This does not indicate whether or not the 5757 * permission is currently granted for the package. 5758 * <p/> 5759 * If a grant state was set by the profile or device owner, then the return value will 5760 * be one of {@link #PERMISSION_GRANT_STATE_DENIED} or 5761 * {@link #PERMISSION_GRANT_STATE_GRANTED}, which indicates if the permission is 5762 * currently denied or granted. 5763 * @throws SecurityException if {@code admin} is not a device or profile owner. 5764 * @see #setPermissionGrantState(ComponentName, String, String, int) 5765 * @see PackageManager#checkPermission(String, String) 5766 */ getPermissionGrantState(@onNull ComponentName admin, String packageName, String permission)5767 public int getPermissionGrantState(@NonNull ComponentName admin, String packageName, 5768 String permission) { 5769 throwIfParentInstance("getPermissionGrantState"); 5770 try { 5771 return mService.getPermissionGrantState(admin, packageName, permission); 5772 } catch (RemoteException re) { 5773 throw re.rethrowFromSystemServer(); 5774 } 5775 } 5776 5777 /** 5778 * Returns if provisioning a managed profile or device is possible or not. 5779 * @param action One of {@link #ACTION_PROVISION_MANAGED_DEVICE}, 5780 * {@link #ACTION_PROVISION_MANAGED_PROFILE}. 5781 * @return if provisioning a managed profile or device is possible or not. 5782 * @throws IllegalArgumentException if the supplied action is not valid. 5783 */ isProvisioningAllowed(String action)5784 public boolean isProvisioningAllowed(String action) { 5785 throwIfParentInstance("isProvisioningAllowed"); 5786 try { 5787 return mService.isProvisioningAllowed(action); 5788 } catch (RemoteException re) { 5789 throw re.rethrowFromSystemServer(); 5790 } 5791 } 5792 5793 /** 5794 * Return if this user is a managed profile of another user. An admin can become the profile 5795 * owner of a managed profile with {@link #ACTION_PROVISION_MANAGED_PROFILE} and of a managed 5796 * user with {@link #createAndManageUser} 5797 * @param admin Which profile owner this request is associated with. 5798 * @return if this user is a managed profile of another user. 5799 */ isManagedProfile(@onNull ComponentName admin)5800 public boolean isManagedProfile(@NonNull ComponentName admin) { 5801 throwIfParentInstance("isManagedProfile"); 5802 try { 5803 return mService.isManagedProfile(admin); 5804 } catch (RemoteException re) { 5805 throw re.rethrowFromSystemServer(); 5806 } 5807 } 5808 5809 /** 5810 * @hide 5811 * Return if this user is a system-only user. An admin can manage a device from a system only 5812 * user by calling {@link #ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE}. 5813 * @param admin Which device owner this request is associated with. 5814 * @return if this user is a system-only user. 5815 */ isSystemOnlyUser(@onNull ComponentName admin)5816 public boolean isSystemOnlyUser(@NonNull ComponentName admin) { 5817 try { 5818 return mService.isSystemOnlyUser(admin); 5819 } catch (RemoteException re) { 5820 throw re.rethrowFromSystemServer(); 5821 } 5822 } 5823 5824 /** 5825 * Called by device owner to get the MAC address of the Wi-Fi device. 5826 * 5827 * @param admin Which device owner this request is associated with. 5828 * @return the MAC address of the Wi-Fi device, or null when the information is not available. 5829 * (For example, Wi-Fi hasn't been enabled, or the device doesn't support Wi-Fi.) 5830 * <p> 5831 * The address will be in the {@code XX:XX:XX:XX:XX:XX} format. 5832 * @throws SecurityException if {@code admin} is not a device owner. 5833 */ getWifiMacAddress(@onNull ComponentName admin)5834 public String getWifiMacAddress(@NonNull ComponentName admin) { 5835 throwIfParentInstance("getWifiMacAddress"); 5836 try { 5837 return mService.getWifiMacAddress(admin); 5838 } catch (RemoteException re) { 5839 throw re.rethrowFromSystemServer(); 5840 } 5841 } 5842 5843 /** 5844 * Called by device owner to reboot the device. If there is an ongoing call on the device, 5845 * throws an {@link IllegalStateException}. 5846 * @param admin Which device owner the request is associated with. 5847 * @throws IllegalStateException if device has an ongoing call. 5848 * @throws SecurityException if {@code admin} is not a device owner. 5849 * @see TelephonyManager#CALL_STATE_IDLE 5850 */ reboot(@onNull ComponentName admin)5851 public void reboot(@NonNull ComponentName admin) { 5852 throwIfParentInstance("reboot"); 5853 try { 5854 mService.reboot(admin); 5855 } catch (RemoteException re) { 5856 throw re.rethrowFromSystemServer(); 5857 } 5858 } 5859 5860 /** 5861 * Called by a device admin to set the short support message. This will be displayed to the user 5862 * in settings screens where funtionality has been disabled by the admin. The message should be 5863 * limited to a short statement such as "This setting is disabled by your administrator. Contact 5864 * someone@example.com for support." If the message is longer than 200 characters it may be 5865 * truncated. 5866 * <p> 5867 * If the short support message needs to be localized, it is the responsibility of the 5868 * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast 5869 * and set a new version of this string accordingly. 5870 * 5871 * @see #setLongSupportMessage 5872 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5873 * @param message Short message to be displayed to the user in settings or null to clear the 5874 * existing message. 5875 * @throws SecurityException if {@code admin} is not an active administrator. 5876 */ setShortSupportMessage(@onNull ComponentName admin, @Nullable CharSequence message)5877 public void setShortSupportMessage(@NonNull ComponentName admin, 5878 @Nullable CharSequence message) { 5879 throwIfParentInstance("setShortSupportMessage"); 5880 if (mService != null) { 5881 try { 5882 mService.setShortSupportMessage(admin, message); 5883 } catch (RemoteException e) { 5884 throw e.rethrowFromSystemServer(); 5885 } 5886 } 5887 } 5888 5889 /** 5890 * Called by a device admin to get the short support message. 5891 * 5892 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5893 * @return The message set by {@link #setShortSupportMessage(ComponentName, CharSequence)} or 5894 * null if no message has been set. 5895 * @throws SecurityException if {@code admin} is not an active administrator. 5896 */ getShortSupportMessage(@onNull ComponentName admin)5897 public CharSequence getShortSupportMessage(@NonNull ComponentName admin) { 5898 throwIfParentInstance("getShortSupportMessage"); 5899 if (mService != null) { 5900 try { 5901 return mService.getShortSupportMessage(admin); 5902 } catch (RemoteException e) { 5903 throw e.rethrowFromSystemServer(); 5904 } 5905 } 5906 return null; 5907 } 5908 5909 /** 5910 * Called by a device admin to set the long support message. This will be displayed to the user 5911 * in the device administators settings screen. 5912 * <p> 5913 * If the long support message needs to be localized, it is the responsibility of the 5914 * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast 5915 * and set a new version of this string accordingly. 5916 * 5917 * @see #setShortSupportMessage 5918 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5919 * @param message Long message to be displayed to the user in settings or null to clear the 5920 * existing message. 5921 * @throws SecurityException if {@code admin} is not an active administrator. 5922 */ setLongSupportMessage(@onNull ComponentName admin, @Nullable CharSequence message)5923 public void setLongSupportMessage(@NonNull ComponentName admin, 5924 @Nullable CharSequence message) { 5925 throwIfParentInstance("setLongSupportMessage"); 5926 if (mService != null) { 5927 try { 5928 mService.setLongSupportMessage(admin, message); 5929 } catch (RemoteException e) { 5930 throw e.rethrowFromSystemServer(); 5931 } 5932 } 5933 } 5934 5935 /** 5936 * Called by a device admin to get the long support message. 5937 * 5938 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5939 * @return The message set by {@link #setLongSupportMessage(ComponentName, CharSequence)} or 5940 * null if no message has been set. 5941 * @throws SecurityException if {@code admin} is not an active administrator. 5942 */ getLongSupportMessage(@onNull ComponentName admin)5943 public CharSequence getLongSupportMessage(@NonNull ComponentName admin) { 5944 throwIfParentInstance("getLongSupportMessage"); 5945 if (mService != null) { 5946 try { 5947 return mService.getLongSupportMessage(admin); 5948 } catch (RemoteException e) { 5949 throw e.rethrowFromSystemServer(); 5950 } 5951 } 5952 return null; 5953 } 5954 5955 /** 5956 * Called by the system to get the short support message. 5957 * 5958 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5959 * @param userHandle user id the admin is running as. 5960 * @return The message set by {@link #setShortSupportMessage(ComponentName, CharSequence)} 5961 * 5962 * @hide 5963 */ getShortSupportMessageForUser(@onNull ComponentName admin, int userHandle)5964 public CharSequence getShortSupportMessageForUser(@NonNull ComponentName admin, 5965 int userHandle) { 5966 if (mService != null) { 5967 try { 5968 return mService.getShortSupportMessageForUser(admin, userHandle); 5969 } catch (RemoteException e) { 5970 throw e.rethrowFromSystemServer(); 5971 } 5972 } 5973 return null; 5974 } 5975 5976 5977 /** 5978 * Called by the system to get the long support message. 5979 * 5980 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 5981 * @param userHandle user id the admin is running as. 5982 * @return The message set by {@link #setLongSupportMessage(ComponentName, CharSequence)} 5983 * 5984 * @hide 5985 */ getLongSupportMessageForUser(@onNull ComponentName admin, int userHandle)5986 public CharSequence getLongSupportMessageForUser(@NonNull ComponentName admin, int userHandle) { 5987 if (mService != null) { 5988 try { 5989 return mService.getLongSupportMessageForUser(admin, userHandle); 5990 } catch (RemoteException e) { 5991 throw e.rethrowFromSystemServer(); 5992 } 5993 } 5994 return null; 5995 } 5996 5997 /** 5998 * Called by the profile owner of a managed profile to obtain a {@link DevicePolicyManager} 5999 * whose calls act on the parent profile. 6000 * 6001 * <p>The following methods are supported for the parent instance, all other methods will 6002 * throw a SecurityException when called on the parent instance: 6003 * <ul> 6004 * <li>{@link #getPasswordQuality}</li> 6005 * <li>{@link #setPasswordQuality}</li> 6006 * <li>{@link #getPasswordMinimumLength}</li> 6007 * <li>{@link #setPasswordMinimumLength}</li> 6008 * <li>{@link #getPasswordMinimumUpperCase}</li> 6009 * <li>{@link #setPasswordMinimumUpperCase}</li> 6010 * <li>{@link #getPasswordMinimumLowerCase}</li> 6011 * <li>{@link #setPasswordMinimumLowerCase}</li> 6012 * <li>{@link #getPasswordMinimumLetters}</li> 6013 * <li>{@link #setPasswordMinimumLetters}</li> 6014 * <li>{@link #getPasswordMinimumNumeric}</li> 6015 * <li>{@link #setPasswordMinimumNumeric}</li> 6016 * <li>{@link #getPasswordMinimumSymbols}</li> 6017 * <li>{@link #setPasswordMinimumSymbols}</li> 6018 * <li>{@link #getPasswordMinimumNonLetter}</li> 6019 * <li>{@link #setPasswordMinimumNonLetter}</li> 6020 * <li>{@link #getPasswordHistoryLength}</li> 6021 * <li>{@link #setPasswordHistoryLength}</li> 6022 * <li>{@link #getPasswordExpirationTimeout}</li> 6023 * <li>{@link #setPasswordExpirationTimeout}</li> 6024 * <li>{@link #getPasswordExpiration}</li> 6025 * <li>{@link #isActivePasswordSufficient}</li> 6026 * <li>{@link #getCurrentFailedPasswordAttempts}</li> 6027 * <li>{@link #getMaximumFailedPasswordsForWipe}</li> 6028 * <li>{@link #setMaximumFailedPasswordsForWipe}</li> 6029 * <li>{@link #getMaximumTimeToLock}</li> 6030 * <li>{@link #setMaximumTimeToLock}</li> 6031 * <li>{@link #lockNow}</li> 6032 * <li>{@link #getKeyguardDisabledFeatures}</li> 6033 * <li>{@link #setKeyguardDisabledFeatures}</li> 6034 * <li>{@link #getTrustAgentConfiguration}</li> 6035 * <li>{@link #setTrustAgentConfiguration}</li> 6036 * </ul> 6037 * 6038 * @return a new instance of {@link DevicePolicyManager} that acts on the parent profile. 6039 * @throws SecurityException if {@code admin} is not a profile owner. 6040 */ getParentProfileInstance(@onNull ComponentName admin)6041 public DevicePolicyManager getParentProfileInstance(@NonNull ComponentName admin) { 6042 throwIfParentInstance("getParentProfileInstance"); 6043 try { 6044 if (!mService.isManagedProfile(admin)) { 6045 throw new SecurityException("The current user does not have a parent profile."); 6046 } 6047 return new DevicePolicyManager(mContext, true); 6048 } catch (RemoteException e) { 6049 throw e.rethrowFromSystemServer(); 6050 } 6051 } 6052 6053 /** 6054 * Called by device owner to control the security logging feature. Logging can only be 6055 * enabled on single user devices where the sole user is managed by the device owner. 6056 * 6057 * <p> Security logs contain various information intended for security auditing purposes. 6058 * See {@link SecurityEvent} for details. 6059 * 6060 * <p>There must be only one user on the device, managed by the device owner. 6061 * Otherwise a {@link SecurityException} will be thrown. 6062 * 6063 * @param admin Which device owner this request is associated with. 6064 * @param enabled whether security logging should be enabled or not. 6065 * @throws SecurityException if {@code admin} is not a device owner. 6066 * @see #retrieveSecurityLogs 6067 */ setSecurityLoggingEnabled(@onNull ComponentName admin, boolean enabled)6068 public void setSecurityLoggingEnabled(@NonNull ComponentName admin, boolean enabled) { 6069 throwIfParentInstance("setSecurityLoggingEnabled"); 6070 try { 6071 mService.setSecurityLoggingEnabled(admin, enabled); 6072 } catch (RemoteException re) { 6073 throw re.rethrowFromSystemServer(); 6074 } 6075 } 6076 6077 /** 6078 * Return whether security logging is enabled or not by the device owner. 6079 * 6080 * <p>Can only be called by the device owner, otherwise a {@link SecurityException} will be 6081 * thrown. 6082 * 6083 * @param admin Which device owner this request is associated with. 6084 * @return {@code true} if security logging is enabled by device owner, {@code false} otherwise. 6085 * @throws SecurityException if {@code admin} is not a device owner. 6086 */ isSecurityLoggingEnabled(@onNull ComponentName admin)6087 public boolean isSecurityLoggingEnabled(@NonNull ComponentName admin) { 6088 throwIfParentInstance("isSecurityLoggingEnabled"); 6089 try { 6090 return mService.isSecurityLoggingEnabled(admin); 6091 } catch (RemoteException re) { 6092 throw re.rethrowFromSystemServer(); 6093 } 6094 } 6095 6096 /** 6097 * Called by device owner to retrieve all new security logging entries since the last call to 6098 * this API after device boots. 6099 * 6100 * <p> Access to the logs is rate limited and it will only return new logs after the device 6101 * owner has been notified via {@link DeviceAdminReceiver#onSecurityLogsAvailable}. 6102 * 6103 * <p>There must be only one user on the device, managed by the device owner. 6104 * Otherwise a {@link SecurityException} will be thrown. 6105 * 6106 * @param admin Which device owner this request is associated with. 6107 * @return the new batch of security logs which is a list of {@link SecurityEvent}, 6108 * or {@code null} if rate limitation is exceeded or if logging is currently disabled. 6109 * @throws SecurityException if {@code admin} is not a device owner. 6110 */ retrieveSecurityLogs(@onNull ComponentName admin)6111 public List<SecurityEvent> retrieveSecurityLogs(@NonNull ComponentName admin) { 6112 throwIfParentInstance("retrieveSecurityLogs"); 6113 try { 6114 ParceledListSlice<SecurityEvent> list = mService.retrieveSecurityLogs(admin); 6115 if (list != null) { 6116 return list.getList(); 6117 } else { 6118 // Rate limit exceeded. 6119 return null; 6120 } 6121 } catch (RemoteException re) { 6122 throw re.rethrowFromSystemServer(); 6123 } 6124 } 6125 6126 /** 6127 * Called by the system to obtain a {@link DevicePolicyManager} whose calls act on the parent 6128 * profile. 6129 * 6130 * @hide 6131 */ getParentProfileInstance(UserInfo uInfo)6132 public DevicePolicyManager getParentProfileInstance(UserInfo uInfo) { 6133 mContext.checkSelfPermission( 6134 android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); 6135 if (!uInfo.isManagedProfile()) { 6136 throw new SecurityException("The user " + uInfo.id 6137 + " does not have a parent profile."); 6138 } 6139 return new DevicePolicyManager(mContext, true); 6140 } 6141 6142 /** 6143 * Called by device owners to retrieve device logs from before the device's last reboot. 6144 * <p> 6145 * <strong> This API is not supported on all devices. Calling this API on unsupported devices 6146 * will result in {@code null} being returned. The device logs are retrieved from a RAM region 6147 * which is not guaranteed to be corruption-free during power cycles, as a result be cautious 6148 * about data corruption when parsing. </strong> 6149 * <p> 6150 * There must be only one user on the device, managed by the device owner. Otherwise a 6151 * {@link SecurityException} will be thrown. 6152 * 6153 * @param admin Which device owner this request is associated with. 6154 * @return Device logs from before the latest reboot of the system, or {@code null} if this API 6155 * is not supported on the device. 6156 * @throws SecurityException if {@code admin} is not a device owner. 6157 */ retrievePreRebootSecurityLogs(@onNull ComponentName admin)6158 public List<SecurityEvent> retrievePreRebootSecurityLogs(@NonNull ComponentName admin) { 6159 throwIfParentInstance("retrievePreRebootSecurityLogs"); 6160 try { 6161 ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs(admin); 6162 if (list != null) { 6163 return list.getList(); 6164 } else { 6165 return null; 6166 } 6167 } catch (RemoteException re) { 6168 throw re.rethrowFromSystemServer(); 6169 } 6170 } 6171 6172 /** 6173 * Called by a profile owner of a managed profile to set the color used for customization. This 6174 * color is used as background color of the confirm credentials screen for that user. The 6175 * default color is teal (#00796B). 6176 * <p> 6177 * The confirm credentials screen can be created using 6178 * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent}. 6179 * 6180 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 6181 * @param color The 24bit (0xRRGGBB) representation of the color to be used. 6182 * @throws SecurityException if {@code admin} is not a profile owner. 6183 */ setOrganizationColor(@onNull ComponentName admin, int color)6184 public void setOrganizationColor(@NonNull ComponentName admin, int color) { 6185 throwIfParentInstance("setOrganizationColor"); 6186 try { 6187 // always enforce alpha channel to have 100% opacity 6188 color |= 0xFF000000; 6189 mService.setOrganizationColor(admin, color); 6190 } catch (RemoteException re) { 6191 throw re.rethrowFromSystemServer(); 6192 } 6193 } 6194 6195 /** 6196 * @hide 6197 * 6198 * Sets the color used for customization. 6199 * 6200 * @param color The 24bit (0xRRGGBB) representation of the color to be used. 6201 * @param userId which user to set the color to. 6202 * @RequiresPermission(allOf = { 6203 * Manifest.permission.MANAGE_USERS, 6204 * Manifest.permission.INTERACT_ACROSS_USERS_FULL}) 6205 */ setOrganizationColorForUser(@olorInt int color, @UserIdInt int userId)6206 public void setOrganizationColorForUser(@ColorInt int color, @UserIdInt int userId) { 6207 try { 6208 // always enforce alpha channel to have 100% opacity 6209 color |= 0xFF000000; 6210 mService.setOrganizationColorForUser(color, userId); 6211 } catch (RemoteException re) { 6212 throw re.rethrowFromSystemServer(); 6213 } 6214 } 6215 6216 /** 6217 * Called by a profile owner of a managed profile to retrieve the color used for customization. 6218 * This color is used as background color of the confirm credentials screen for that user. 6219 * 6220 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 6221 * @return The 24bit (0xRRGGBB) representation of the color to be used. 6222 * @throws SecurityException if {@code admin} is not a profile owner. 6223 */ getOrganizationColor(@onNull ComponentName admin)6224 public @ColorInt int getOrganizationColor(@NonNull ComponentName admin) { 6225 throwIfParentInstance("getOrganizationColor"); 6226 try { 6227 return mService.getOrganizationColor(admin); 6228 } catch (RemoteException re) { 6229 throw re.rethrowFromSystemServer(); 6230 } 6231 } 6232 6233 /** 6234 * @hide 6235 * Retrieve the customization color for a given user. 6236 * 6237 * @param userHandle The user id of the user we're interested in. 6238 * @return The 24bit (0xRRGGBB) representation of the color to be used. 6239 */ getOrganizationColorForUser(int userHandle)6240 public @ColorInt int getOrganizationColorForUser(int userHandle) { 6241 try { 6242 return mService.getOrganizationColorForUser(userHandle); 6243 } catch (RemoteException re) { 6244 throw re.rethrowFromSystemServer(); 6245 } 6246 } 6247 6248 /** 6249 * Called by a profile owner of a managed profile to set the name of the organization under 6250 * management. 6251 * <p> 6252 * If the organization name needs to be localized, it is the responsibility of the 6253 * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast 6254 * and set a new version of this string accordingly. 6255 * 6256 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 6257 * @param title The organization name or {@code null} to clear a previously set name. 6258 * @throws SecurityException if {@code admin} is not a profile owner. 6259 */ setOrganizationName(@onNull ComponentName admin, @Nullable CharSequence title)6260 public void setOrganizationName(@NonNull ComponentName admin, @Nullable CharSequence title) { 6261 throwIfParentInstance("setOrganizationName"); 6262 try { 6263 mService.setOrganizationName(admin, title); 6264 } catch (RemoteException re) { 6265 throw re.rethrowFromSystemServer(); 6266 } 6267 } 6268 6269 /** 6270 * Called by a profile owner of a managed profile to retrieve the name of the organization under 6271 * management. 6272 * 6273 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 6274 * @return The organization name or {@code null} if none is set. 6275 * @throws SecurityException if {@code admin} is not a profile owner. 6276 */ getOrganizationName(@onNull ComponentName admin)6277 public CharSequence getOrganizationName(@NonNull ComponentName admin) { 6278 throwIfParentInstance("getOrganizationName"); 6279 try { 6280 return mService.getOrganizationName(admin); 6281 } catch (RemoteException re) { 6282 throw re.rethrowFromSystemServer(); 6283 } 6284 } 6285 6286 /** 6287 * Retrieve the default title message used in the confirm credentials screen for a given user. 6288 * 6289 * @param userHandle The user id of the user we're interested in. 6290 * @return The organization name or {@code null} if none is set. 6291 * 6292 * @hide 6293 */ getOrganizationNameForUser(int userHandle)6294 public CharSequence getOrganizationNameForUser(int userHandle) { 6295 try { 6296 return mService.getOrganizationNameForUser(userHandle); 6297 } catch (RemoteException re) { 6298 throw re.rethrowFromSystemServer(); 6299 } 6300 } 6301 6302 /** 6303 * @return the {@link UserProvisioningState} for the current user - for unmanaged users will 6304 * return {@link #STATE_USER_UNMANAGED} 6305 * @hide 6306 */ 6307 @SystemApi 6308 @UserProvisioningState getUserProvisioningState()6309 public int getUserProvisioningState() { 6310 throwIfParentInstance("getUserProvisioningState"); 6311 if (mService != null) { 6312 try { 6313 return mService.getUserProvisioningState(); 6314 } catch (RemoteException e) { 6315 throw e.rethrowFromSystemServer(); 6316 } 6317 } 6318 return STATE_USER_UNMANAGED; 6319 } 6320 6321 /** 6322 * Set the {@link UserProvisioningState} for the supplied user, if they are managed. 6323 * 6324 * @param state to store 6325 * @param userHandle for user 6326 * @hide 6327 */ setUserProvisioningState(@serProvisioningState int state, int userHandle)6328 public void setUserProvisioningState(@UserProvisioningState int state, int userHandle) { 6329 if (mService != null) { 6330 try { 6331 mService.setUserProvisioningState(state, userHandle); 6332 } catch (RemoteException e) { 6333 throw e.rethrowFromSystemServer(); 6334 } 6335 } 6336 } 6337 6338 /** 6339 * @hide 6340 * Indicates the entity that controls the device or profile owner. A user/profile is considered 6341 * affiliated if it is managed by the same entity as the device. 6342 * 6343 * <p> By definition, the user that the device owner runs on is always affiliated. Any other 6344 * user/profile is considered affiliated if the following conditions are both met: 6345 * <ul> 6346 * <li>The device owner and the user's/profile's profile owner have called this method, 6347 * specifying a set of opaque affiliation ids each. If the sets specified by the device owner 6348 * and a profile owner intersect, they must have come from the same source, which means that 6349 * the device owner and profile owner are controlled by the same entity.</li> 6350 * <li>The device owner's and profile owner's package names are the same.</li> 6351 * </ul> 6352 * 6353 * @param admin Which profile or device owner this request is associated with. 6354 * @param ids A set of opaque affiliation ids. 6355 */ setAffiliationIds(@onNull ComponentName admin, Set<String> ids)6356 public void setAffiliationIds(@NonNull ComponentName admin, Set<String> ids) { 6357 throwIfParentInstance("setAffiliationIds"); 6358 try { 6359 mService.setAffiliationIds(admin, new ArrayList<String>(ids)); 6360 } catch (RemoteException e) { 6361 throw e.rethrowFromSystemServer(); 6362 } 6363 } 6364 6365 /** 6366 * @hide 6367 * Returns whether this user/profile is affiliated with the device. See 6368 * {@link #setAffiliationIds} for the definition of affiliation. 6369 * 6370 * @return whether this user/profile is affiliated with the device. 6371 */ isAffiliatedUser()6372 public boolean isAffiliatedUser() { 6373 throwIfParentInstance("isAffiliatedUser"); 6374 try { 6375 return mService != null && mService.isAffiliatedUser(); 6376 } catch (RemoteException e) { 6377 throw e.rethrowFromSystemServer(); 6378 } 6379 } 6380 6381 /** 6382 * @hide 6383 * Returns whether the uninstall for {@code packageName} for the current user is in queue 6384 * to be started 6385 * @param packageName the package to check for 6386 * @return whether the uninstall intent for {@code packageName} is pending 6387 */ isUninstallInQueue(String packageName)6388 public boolean isUninstallInQueue(String packageName) { 6389 try { 6390 return mService.isUninstallInQueue(packageName); 6391 } catch (RemoteException re) { 6392 throw re.rethrowFromSystemServer(); 6393 } 6394 } 6395 6396 /** 6397 * @hide 6398 * @param packageName the package containing active DAs to be uninstalled 6399 */ uninstallPackageWithActiveAdmins(String packageName)6400 public void uninstallPackageWithActiveAdmins(String packageName) { 6401 try { 6402 mService.uninstallPackageWithActiveAdmins(packageName); 6403 } catch (RemoteException re) { 6404 throw re.rethrowFromSystemServer(); 6405 } 6406 } 6407 6408 /** 6409 * @hide 6410 * Remove a test admin synchronously without sending it a broadcast about being removed. 6411 * If the admin is a profile owner or device owner it will still be removed. 6412 * 6413 * @param userHandle user id to remove the admin for. 6414 * @param admin The administration compononent to remove. 6415 * @throws SecurityException if the caller is not shell / root or the admin package 6416 * isn't a test application see {@link ApplicationInfo#FLAG_TEST_APP}. 6417 */ forceRemoveActiveAdmin(ComponentName adminReceiver, int userHandle)6418 public void forceRemoveActiveAdmin(ComponentName adminReceiver, int userHandle) { 6419 try { 6420 mService.forceRemoveActiveAdmin(adminReceiver, userHandle); 6421 } catch (RemoteException re) { 6422 throw re.rethrowFromSystemServer(); 6423 } 6424 } 6425 6426 /** 6427 * @hide 6428 * @return whether {@link android.provider.Settings.Global#DEVICE_PROVISIONED} has ever been set 6429 * to 1. 6430 */ isDeviceProvisioned()6431 public boolean isDeviceProvisioned() { 6432 try { 6433 return mService.isDeviceProvisioned(); 6434 } catch (RemoteException re) { 6435 throw re.rethrowFromSystemServer(); 6436 } 6437 } 6438 6439 /** 6440 * @hide 6441 * Writes that the provisioning configuration has been applied. 6442 */ setDeviceProvisioningConfigApplied()6443 public void setDeviceProvisioningConfigApplied() { 6444 try { 6445 mService.setDeviceProvisioningConfigApplied(); 6446 } catch (RemoteException re) { 6447 throw re.rethrowFromSystemServer(); 6448 } 6449 } 6450 6451 /** 6452 * @hide 6453 * @return whether the provisioning configuration has been applied. 6454 */ isDeviceProvisioningConfigApplied()6455 public boolean isDeviceProvisioningConfigApplied() { 6456 try { 6457 return mService.isDeviceProvisioningConfigApplied(); 6458 } catch (RemoteException re) { 6459 throw re.rethrowFromSystemServer(); 6460 } 6461 } 6462 throwIfParentInstance(String functionName)6463 private void throwIfParentInstance(String functionName) { 6464 if (mParentInstance) { 6465 throw new SecurityException(functionName + " cannot be called on the parent instance"); 6466 } 6467 } 6468 } 6469