blob: 47530997eb6e2f6239124cc195ee068f2cb64906 [file] [log] [blame]
Dianne Hackbornd6847842010-01-12 18:14:19 -08001/*
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
Dianne Hackborn87bba1e2010-02-26 17:25:54 -080017package android.app.admin;
Dianne Hackbornd6847842010-01-12 18:14:19 -080018
Dianne Hackbornd6847842010-01-12 18:14:19 -080019import android.annotation.SdkConstant;
20import android.annotation.SdkConstant.SdkConstantType;
Justin Moreyb5deda72014-07-24 10:53:40 -050021import android.annotation.SystemApi;
Jason Monkd7b86212014-06-16 13:15:38 -040022import android.app.Activity;
Svetoslav976e8bd2014-07-16 15:12:03 -070023import android.app.admin.IDevicePolicyManager;
Dianne Hackbornd6847842010-01-12 18:14:19 -080024import android.content.ComponentName;
25import android.content.Context;
Adam Connors010cfd42014-04-16 12:48:13 +010026import android.content.Intent;
Sander Alewijnsef475ca32014-02-17 15:13:58 +000027import android.content.IntentFilter;
Dianne Hackbornd6847842010-01-12 18:14:19 -080028import android.content.pm.ActivityInfo;
29import android.content.pm.PackageManager;
30import android.content.pm.ResolveInfo;
Jason Monk03bc9912014-05-13 09:44:57 -040031import android.net.ProxyInfo;
Robin Lee66e5d962014-04-09 16:44:21 +010032import android.os.Bundle;
Dianne Hackbornd6847842010-01-12 18:14:19 -080033import android.os.Handler;
Jim Millere303bf42014-08-26 17:12:29 -070034import android.os.PersistableBundle;
Adam Connors776c5552014-01-09 10:42:56 +000035import android.os.Process;
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080036import android.os.RemoteCallback;
Dianne Hackbornd6847842010-01-12 18:14:19 -080037import android.os.RemoteException;
38import android.os.ServiceManager;
Amith Yamasani599dd7c2012-09-14 23:20:08 -070039import android.os.UserHandle;
Julia Reynolds1e958392014-05-16 14:25:21 -040040import android.os.UserManager;
Julia Reynoldsda551652014-05-14 17:15:16 -040041import android.provider.Settings;
Bernhard Bauer26408cc2014-09-08 14:07:31 +010042import android.security.Credentials;
Amith Yamasanid1d7c022014-08-19 17:03:41 -070043import android.service.restrictions.RestrictionsReceiver;
Jim Millere303bf42014-08-26 17:12:29 -070044import android.service.trust.TrustAgentService;
Dianne Hackbornd6847842010-01-12 18:14:19 -080045import android.util.Log;
46
Maggie Benthallda51e682013-08-08 22:35:44 -040047import com.android.org.conscrypt.TrustedCertificateStore;
48
Jessica Hummel91da58d2014-04-10 17:39:43 +010049import org.xmlpull.v1.XmlPullParserException;
50
Maggie Benthallda51e682013-08-08 22:35:44 -040051import java.io.ByteArrayInputStream;
Dianne Hackbornd6847842010-01-12 18:14:19 -080052import java.io.IOException;
Oscar Montemayor69238c62010-08-03 10:51:06 -070053import java.net.InetSocketAddress;
54import java.net.Proxy;
Bernhard Bauer26408cc2014-09-08 14:07:31 +010055import java.security.PrivateKey;
56import java.security.cert.Certificate;
Maggie Benthallda51e682013-08-08 22:35:44 -040057import java.security.cert.CertificateException;
58import java.security.cert.CertificateFactory;
59import java.security.cert.X509Certificate;
Jim Miller604e7552014-07-18 19:00:02 -070060import java.util.ArrayList;
Svetoslav976e8bd2014-07-16 15:12:03 -070061import java.util.Collections;
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -080062import java.util.List;
Dianne Hackbornd6847842010-01-12 18:14:19 -080063
64/**
Alexandra Gherghina541afcd2014-11-07 11:18:12 +000065 * Public interface for managing policies enforced on a device. Most clients of this class must be
66 * registered with the system as a
67 * <a href={@docRoot}guide/topics/admin/device-admin.html">device administrator</a>. Additionally,
68 * a device administrator may be registered as either a profile or device owner. A given method is
69 * accessible to all device administrators unless the documentation for that method specifies that
70 * it is restricted to either device or profile owners.
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080071 *
72 * <div class="special reference">
73 * <h3>Developer Guides</h3>
Alexandra Gherghina541afcd2014-11-07 11:18:12 +000074 * <p>For more information about managing policies for device administration, read the
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080075 * <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>
76 * developer guide.</p>
77 * </div>
Dianne Hackbornd6847842010-01-12 18:14:19 -080078 */
79public class DevicePolicyManager {
80 private static String TAG = "DevicePolicyManager";
Dianne Hackbornd6847842010-01-12 18:14:19 -080081
82 private final Context mContext;
Dianne Hackbornd6847842010-01-12 18:14:19 -080083 private final IDevicePolicyManager mService;
Konstantin Lopyrev32558232010-05-20 16:18:05 -070084
Dianne Hackborn21f1bd12010-02-19 17:02:21 -080085 private DevicePolicyManager(Context context, Handler handler) {
Dianne Hackbornd6847842010-01-12 18:14:19 -080086 mContext = context;
Dianne Hackbornd6847842010-01-12 18:14:19 -080087 mService = IDevicePolicyManager.Stub.asInterface(
88 ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
89 }
90
Dianne Hackborn87bba1e2010-02-26 17:25:54 -080091 /** @hide */
92 public static DevicePolicyManager create(Context context, Handler handler) {
Dianne Hackborn21f1bd12010-02-19 17:02:21 -080093 DevicePolicyManager me = new DevicePolicyManager(context, handler);
94 return me.mService != null ? me : null;
95 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -070096
Dianne Hackbornd6847842010-01-12 18:14:19 -080097 /**
Jessica Hummelf72078b2014-03-06 16:13:12 +000098 * Activity action: Starts the provisioning flow which sets up a managed profile.
Jessica Hummelf72078b2014-03-06 16:13:12 +000099 *
Jessica Hummel9da60392014-05-21 12:32:57 +0100100 * <p>A managed profile allows data separation for example for the usage of a
101 * device as a personal and corporate device. The user which provisioning is started from and
102 * the managed profile share a launcher.
103 *
104 * <p>This intent will typically be sent by a mobile device management application (mdm).
105 * Provisioning adds a managed profile and sets the mdm as the profile owner who has full
106 * control over the profile
107 *
Jessica Hummele3da7902014-08-20 15:20:11 +0100108 * <p>This intent must contain the extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}.
Jessica Hummelf72078b2014-03-06 16:13:12 +0000109 *
110 * <p> When managed provisioning has completed, an intent of the type
111 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcasted to the
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100112 * managed profile.
Jessica Hummel9da60392014-05-21 12:32:57 +0100113 *
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100114 * <p> If provisioning fails, the managedProfile is removed so the device returns to its
115 * previous state.
Jessica Hummelf72078b2014-03-06 16:13:12 +0000116 *
117 * <p>Input: Nothing.</p>
118 * <p>Output: Nothing</p>
119 */
120 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
121 public static final String ACTION_PROVISION_MANAGED_PROFILE
Esteban Talaveraef9c5232014-09-08 13:51:18 +0100122 = "android.app.action.PROVISION_MANAGED_PROFILE";
Jessica Hummelf72078b2014-03-06 16:13:12 +0000123
124 /**
Brian Carlstromf1fe51b2014-09-03 08:55:05 -0700125 * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that allows
126 * a mobile device management application that starts managed profile provisioning to pass data
127 * to itself on the managed profile when provisioning completes. The mobile device management
128 * application sends this extra in an intent with the action
129 * {@link #ACTION_PROVISION_MANAGED_PROFILE} and receives it in
130 * {@link DeviceAdminReceiver#onProfileProvisioningComplete} via an intent with the action
131 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}. The bundle is not changed
132 * during the managed profile provisioning.
Sander Alewijnse90f14bf2014-08-20 16:22:44 +0100133 */
134 public static final String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE =
Esteban Talavera37f01842014-09-05 10:50:57 +0100135 "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE";
Sander Alewijnse90f14bf2014-08-20 16:22:44 +0100136
137 /**
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100138 * A String extra holding the package name of the mobile device management application that
139 * will be set as the profile owner or device owner.
140 *
141 * <p>If an application starts provisioning directly via an intent with action
142 * {@link #ACTION_PROVISION_MANAGED_PROFILE} this package has to match the package name of the
143 * application that started provisioning. The package will be set as profile owner in that case.
144 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000145 * <p>This package is set as device owner when device owner provisioning is started by an NFC
146 * message containing an NFC record with MIME type {@link #MIME_TYPE_PROVISIONING_NFC}.
Jessica Hummelf72078b2014-03-06 16:13:12 +0000147 */
148 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
Esteban Talaveraef9c5232014-09-08 13:51:18 +0100149 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
Jessica Hummelf72078b2014-03-06 16:13:12 +0000150
151 /**
Alexandra Gherghinaaaf2f3e2014-11-13 12:46:15 +0000152 * An {@link android.accounts.Account} extra holding the account to migrate during managed
153 * profile provisioning. If the account supplied is present in the primary user, it will be
154 * copied, along with its credentials to the managed profile and removed from the primary user.
155 *
156 * Use with {@link #ACTION_PROVISION_MANAGED_PROFILE}.
157 */
158
159 public static final String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
160 = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE";
161
162 /**
Jessica Hummele3da7902014-08-20 15:20:11 +0100163 * A String extra that, holds the email address of the account which a managed profile is
164 * created for. Used with {@link #ACTION_PROVISION_MANAGED_PROFILE} and
165 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE}.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100166 *
Sander Alewijnse2b338a22014-09-12 12:28:40 +0100167 * <p> This extra is part of the {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}.
168 *
Jessica Hummele3da7902014-08-20 15:20:11 +0100169 * <p> If the {@link #ACTION_PROVISION_MANAGED_PROFILE} intent that starts managed provisioning
170 * contains this extra, it is forwarded in the
171 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} intent to the mobile
172 * device management application that was set as the profile owner during provisioning.
173 * It is usually used to avoid that the user has to enter their email address twice.
Nicolas Prevot07ac20b2014-05-27 15:37:45 +0100174 */
Sander Alewijnse2b338a22014-09-12 12:28:40 +0100175 public static final String EXTRA_PROVISIONING_EMAIL_ADDRESS
176 = "android.app.extra.PROVISIONING_EMAIL_ADDRESS";
Nicolas Prevot07ac20b2014-05-27 15:37:45 +0100177
178 /**
Sander Alewijnse8c411562014-11-12 18:03:11 +0000179 * A Boolean extra that can be used by the mobile device management application to skip the
180 * disabling of system apps during provisioning when set to <code>true</code>.
181 *
182 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
183 * provisioning via an NFC bump.
184 */
Sander Alewijnse5a144252014-11-18 13:25:04 +0000185 public static final String EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED =
186 "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED";
Sander Alewijnse8c411562014-11-12 18:03:11 +0000187
188 /**
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100189 * A String extra holding the time zone {@link android.app.AlarmManager} that the device
190 * will be set to.
191 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000192 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
193 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100194 */
195 public static final String EXTRA_PROVISIONING_TIME_ZONE
Esteban Talavera37f01842014-09-05 10:50:57 +0100196 = "android.app.extra.PROVISIONING_TIME_ZONE";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100197
198 /**
Esteban Talaverad469a0b2014-08-20 13:54:25 +0100199 * A Long extra holding the wall clock time (in milliseconds) to be set on the device's
200 * {@link android.app.AlarmManager}.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100201 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000202 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
203 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100204 */
205 public static final String EXTRA_PROVISIONING_LOCAL_TIME
Esteban Talavera37f01842014-09-05 10:50:57 +0100206 = "android.app.extra.PROVISIONING_LOCAL_TIME";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100207
208 /**
209 * A String extra holding the {@link java.util.Locale} that the device will be set to.
210 * Format: xx_yy, where xx is the language code, and yy the country code.
211 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000212 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
213 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100214 */
215 public static final String EXTRA_PROVISIONING_LOCALE
Esteban Talavera37f01842014-09-05 10:50:57 +0100216 = "android.app.extra.PROVISIONING_LOCALE";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100217
218 /**
219 * A String extra holding the ssid of the wifi network that should be used during nfc device
220 * owner provisioning for downloading the mobile device management application.
221 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000222 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
223 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100224 */
225 public static final String EXTRA_PROVISIONING_WIFI_SSID
Esteban Talavera37f01842014-09-05 10:50:57 +0100226 = "android.app.extra.PROVISIONING_WIFI_SSID";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100227
228 /**
229 * A boolean extra indicating whether the wifi network in {@link #EXTRA_PROVISIONING_WIFI_SSID}
230 * is hidden or not.
231 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000232 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
233 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100234 */
235 public static final String EXTRA_PROVISIONING_WIFI_HIDDEN
Esteban Talavera37f01842014-09-05 10:50:57 +0100236 = "android.app.extra.PROVISIONING_WIFI_HIDDEN";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100237
238 /**
239 * A String extra indicating the security type of the wifi network in
240 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
241 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000242 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
243 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100244 */
245 public static final String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
Esteban Talavera37f01842014-09-05 10:50:57 +0100246 = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100247
248 /**
249 * A String extra holding the password of the wifi network in
250 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
251 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000252 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
253 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100254 */
255 public static final String EXTRA_PROVISIONING_WIFI_PASSWORD
Esteban Talavera37f01842014-09-05 10:50:57 +0100256 = "android.app.extra.PROVISIONING_WIFI_PASSWORD";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100257
258 /**
259 * A String extra holding the proxy host for the wifi network in
260 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
261 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000262 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
263 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100264 */
265 public static final String EXTRA_PROVISIONING_WIFI_PROXY_HOST
Esteban Talavera37f01842014-09-05 10:50:57 +0100266 = "android.app.extra.PROVISIONING_WIFI_PROXY_HOST";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100267
268 /**
269 * An int extra holding the proxy port for the wifi network in
270 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
271 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000272 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
273 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100274 */
275 public static final String EXTRA_PROVISIONING_WIFI_PROXY_PORT
Esteban Talavera37f01842014-09-05 10:50:57 +0100276 = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100277
278 /**
279 * A String extra holding the proxy bypass for the wifi network in
280 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
281 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000282 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
283 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100284 */
285 public static final String EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
Esteban Talavera37f01842014-09-05 10:50:57 +0100286 = "android.app.extra.PROVISIONING_WIFI_PROXY_BYPASS";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100287
288 /**
289 * A String extra holding the proxy auto-config (PAC) URL for the wifi network in
290 * {@link #EXTRA_PROVISIONING_WIFI_SSID}.
291 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000292 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
293 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100294 */
295 public static final String EXTRA_PROVISIONING_WIFI_PAC_URL
Esteban Talavera37f01842014-09-05 10:50:57 +0100296 = "android.app.extra.PROVISIONING_WIFI_PAC_URL";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100297
298 /**
299 * A String extra holding a url that specifies the download location of the device admin
300 * package. When not provided it is assumed that the device admin package is already installed.
301 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000302 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
303 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100304 */
305 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION
Esteban Talavera37f01842014-09-05 10:50:57 +0100306 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100307
308 /**
Sander Alewijnse681bce92014-07-24 16:46:26 +0100309 * A String extra holding a http cookie header which should be used in the http request to the
310 * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
311 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000312 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
313 * provisioning via an NFC bump.
Sander Alewijnse681bce92014-07-24 16:46:26 +0100314 */
315 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
Esteban Talavera37f01842014-09-05 10:50:57 +0100316 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
Sander Alewijnse681bce92014-07-24 16:46:26 +0100317
318 /**
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100319 * A String extra holding the SHA-1 checksum of the file at download location specified in
320 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. If this doesn't match
321 * the file at the download location an error will be shown to the user and the user will be
322 * asked to factory reset the device.
323 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000324 * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
325 * provisioning via an NFC bump.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100326 */
327 public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
Esteban Talavera37f01842014-09-05 10:50:57 +0100328 = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100329
330 /**
331 * This MIME type is used for starting the Device Owner provisioning.
332 *
333 * <p>During device owner provisioning a device admin app is set as the owner of the device.
334 * A device owner has full control over the device. The device owner can not be modified by the
335 * user and the only way of resetting the device is if the device owner app calls a factory
336 * reset.
337 *
338 * <p> A typical use case would be a device that is owned by a company, but used by either an
339 * employee or client.
340 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000341 * <p> The NFC message should be send to an unprovisioned device.
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100342 *
Sander Alewijnse8c411562014-11-12 18:03:11 +0000343 * <p>The NFC record must contain a serialized {@link java.util.Properties} object which
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100344 * contains the following properties:
345 * <ul>
346 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}</li>
347 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}</li>
Sander Alewijnse681bce92014-07-24 16:46:26 +0100348 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100349 * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}</li>
350 * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
351 * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
352 * <li>{@link #EXTRA_PROVISIONING_LOCALE}, optional</li>
353 * <li>{@link #EXTRA_PROVISIONING_WIFI_SSID}, optional</li>
354 * <li>{@link #EXTRA_PROVISIONING_WIFI_HIDDEN} (convert to String), optional</li>
355 * <li>{@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, optional</li>
356 * <li>{@link #EXTRA_PROVISIONING_WIFI_PASSWORD}, optional</li>
357 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, optional</li>
358 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT} (convert to String), optional</li>
359 * <li>{@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}, optional</li>
360 * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li></ul>
361 *
362 * <p> When device owner provisioning has completed, an intent of the type
363 * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} is broadcasted to the
364 * device owner.
365 *
366 * <p>
367 * If provisioning fails, the device is factory reset.
368 *
369 * <p>Input: Nothing.</p>
370 * <p>Output: Nothing</p>
371 */
Esteban Talaveraf057f062014-08-20 14:27:45 +0100372 public static final String MIME_TYPE_PROVISIONING_NFC
Sander Alewijnse1cc4ecc2014-06-23 19:56:52 +0100373 = "application/com.android.managedprovisioning";
374
375 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -0800376 * Activity action: ask the user to add a new device administrator to the system.
377 * The desired policy is the ComponentName of the policy in the
378 * {@link #EXTRA_DEVICE_ADMIN} extra field. This will invoke a UI to
379 * bring the user through adding the device administrator to the system (or
380 * allowing them to reject it).
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700381 *
Dianne Hackborn8ea138c2010-01-26 18:01:04 -0800382 * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
383 * field to provide the user with additional explanation (in addition
384 * to your component's description) about what is being added.
Andy Stadlerc25f70a2010-12-08 15:56:45 -0800385 *
386 * <p>If your administrator is already active, this will ordinarily return immediately (without
387 * user intervention). However, if your administrator has been updated and is requesting
388 * additional uses-policy flags, the user will be presented with the new list. New policies
389 * will not be available to the updated administrator until the user has accepted the new list.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800390 */
391 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
392 public static final String ACTION_ADD_DEVICE_ADMIN
393 = "android.app.action.ADD_DEVICE_ADMIN";
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700394
Dianne Hackbornd6847842010-01-12 18:14:19 -0800395 /**
Amith Yamasanibf3a9462014-07-28 14:26:42 -0700396 * @hide
397 * Activity action: ask the user to add a new device administrator as the profile owner
398 * for this user. Only system privileged apps that have MANAGE_USERS and MANAGE_DEVICE_ADMINS
399 * permission can call this API.
400 *
401 * <p>The ComponentName of the profile owner admin is pass in {@link #EXTRA_DEVICE_ADMIN} extra
402 * field. This will invoke a UI to bring the user through adding the profile owner admin
403 * to remotely control restrictions on the user.
404 *
405 * <p>The intent must be invoked via {@link Activity#startActivityForResult()} to receive the
406 * result of whether or not the user approved the action. If approved, the result will
407 * be {@link Activity#RESULT_OK} and the component will be set as an active admin as well
408 * as a profile owner.
409 *
410 * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION}
411 * field to provide the user with additional explanation (in addition
412 * to your component's description) about what is being added.
413 *
414 * <p>If there is already a profile owner active or the caller doesn't have the required
415 * permissions, the operation will return a failure result.
416 */
417 @SystemApi
418 public static final String ACTION_SET_PROFILE_OWNER
419 = "android.app.action.SET_PROFILE_OWNER";
420
421 /**
422 * @hide
423 * Name of the profile owner admin that controls the user.
424 */
425 @SystemApi
426 public static final String EXTRA_PROFILE_OWNER_NAME
427 = "android.app.extra.PROFILE_OWNER_NAME";
428
429 /**
Jim Miller284b62e2010-06-08 14:27:42 -0700430 * Activity action: send when any policy admin changes a policy.
431 * This is generally used to find out when a new policy is in effect.
Jim Miller3e5d3fd2011-09-02 17:30:35 -0700432 *
Jim Miller284b62e2010-06-08 14:27:42 -0700433 * @hide
434 */
435 public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
436 = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED";
437
438 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -0800439 * The ComponentName of the administrator component.
440 *
441 * @see #ACTION_ADD_DEVICE_ADMIN
442 */
443 public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700444
Dianne Hackbornd6847842010-01-12 18:14:19 -0800445 /**
Dianne Hackborn8ea138c2010-01-26 18:01:04 -0800446 * An optional CharSequence providing additional explanation for why the
447 * admin is being added.
448 *
449 * @see #ACTION_ADD_DEVICE_ADMIN
450 */
451 public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION";
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700452
Dianne Hackborn8ea138c2010-01-26 18:01:04 -0800453 /**
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700454 * Activity action: have the user enter a new password. This activity should
455 * be launched after using {@link #setPasswordQuality(ComponentName, int)},
456 * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user
457 * enter a new password that meets the current requirements. You can use
458 * {@link #isActivePasswordSufficient()} to determine whether you need to
459 * have the user select a new password in order to meet the current
460 * constraints. Upon being resumed from this activity, you can check the new
461 * password characteristics to see if they are sufficient.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800462 */
463 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
464 public static final String ACTION_SET_NEW_PASSWORD
465 = "android.app.action.SET_NEW_PASSWORD";
Amith Yamasanibf3a9462014-07-28 14:26:42 -0700466
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000467 /**
Jeff Sharkey97978802014-10-14 10:48:18 -0700468 * Flag used by {@link #addCrossProfileIntentFilter} to allow access
469 * <em>from</em> a managed profile <em>to</em> its parent. That is, any
470 * matching activities in the parent profile are included in the
471 * disambiguation list shown when an app in the managed profile calls
472 * {@link Activity#startActivity(Intent)}.
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000473 */
Nicolas Prevot86a96732014-09-08 12:13:05 +0100474 public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 0x0001;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000475
476 /**
Jeff Sharkey97978802014-10-14 10:48:18 -0700477 * Flag used by {@link #addCrossProfileIntentFilter} to allow access
478 * <em>from</em> a parent <em>to</em> its managed profile. That is, any
479 * matching activities in the managed profile are included in the
480 * disambiguation list shown when an app in the parent profile calls
481 * {@link Activity#startActivity(Intent)}.
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000482 */
Nicolas Prevot86a96732014-09-08 12:13:05 +0100483 public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 0x0002;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700484
Dianne Hackbornd6847842010-01-12 18:14:19 -0800485 /**
486 * Return true if the given administrator component is currently
487 * active (enabled) in the system.
488 */
489 public boolean isAdminActive(ComponentName who) {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +0100490 return isAdminActiveAsUser(who, UserHandle.myUserId());
491 }
492
493 /**
494 * @see #isAdminActive(ComponentName)
495 * @hide
496 */
497 public boolean isAdminActiveAsUser(ComponentName who, int userId) {
Dianne Hackbornd6847842010-01-12 18:14:19 -0800498 if (mService != null) {
499 try {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +0100500 return mService.isAdminActive(who, userId);
Dianne Hackbornd6847842010-01-12 18:14:19 -0800501 } catch (RemoteException e) {
502 Log.w(TAG, "Failed talking with device policy service", e);
503 }
504 }
505 return false;
506 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700507
Dianne Hackbornd6847842010-01-12 18:14:19 -0800508 /**
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -0800509 * Return a list of all currently active device administrator's component
510 * names. Note that if there are no administrators than null may be
511 * returned.
512 */
513 public List<ComponentName> getActiveAdmins() {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +0100514 return getActiveAdminsAsUser(UserHandle.myUserId());
515 }
516
517 /**
518 * @see #getActiveAdmins()
519 * @hide
520 */
521 public List<ComponentName> getActiveAdminsAsUser(int userId) {
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -0800522 if (mService != null) {
523 try {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +0100524 return mService.getActiveAdmins(userId);
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -0800525 } catch (RemoteException e) {
526 Log.w(TAG, "Failed talking with device policy service", e);
527 }
528 }
529 return null;
530 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700531
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -0800532 /**
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700533 * Used by package administration code to determine if a package can be stopped
534 * or uninstalled.
Dianne Hackborn21f1bd12010-02-19 17:02:21 -0800535 * @hide
536 */
537 public boolean packageHasActiveAdmins(String packageName) {
538 if (mService != null) {
539 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700540 return mService.packageHasActiveAdmins(packageName, UserHandle.myUserId());
Dianne Hackborn21f1bd12010-02-19 17:02:21 -0800541 } catch (RemoteException e) {
542 Log.w(TAG, "Failed talking with device policy service", e);
543 }
544 }
545 return false;
546 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700547
Dianne Hackborn21f1bd12010-02-19 17:02:21 -0800548 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -0800549 * Remove a current administration component. This can only be called
550 * by the application that owns the administration component; if you
551 * try to remove someone else's component, a security exception will be
552 * thrown.
553 */
554 public void removeActiveAdmin(ComponentName who) {
555 if (mService != null) {
556 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700557 mService.removeActiveAdmin(who, UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -0800558 } catch (RemoteException e) {
559 Log.w(TAG, "Failed talking with device policy service", e);
560 }
561 }
562 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700563
Dianne Hackbornd6847842010-01-12 18:14:19 -0800564 /**
Andy Stadlerc25f70a2010-12-08 15:56:45 -0800565 * Returns true if an administrator has been granted a particular device policy. This can
566 * be used to check if the administrator was activated under an earlier set of policies,
567 * but requires additional policies after an upgrade.
568 *
569 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be
570 * an active administrator, or an exception will be thrown.
571 * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}.
572 */
573 public boolean hasGrantedPolicy(ComponentName admin, int usesPolicy) {
574 if (mService != null) {
575 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700576 return mService.hasGrantedPolicy(admin, usesPolicy, UserHandle.myUserId());
Andy Stadlerc25f70a2010-12-08 15:56:45 -0800577 } catch (RemoteException e) {
578 Log.w(TAG, "Failed talking with device policy service", e);
579 }
580 }
581 return false;
582 }
583
584 /**
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800585 * Constant for {@link #setPasswordQuality}: the policy has no requirements
586 * for the password. Note that quality constants are ordered so that higher
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800587 * values are more restrictive.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800588 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800589 public static final int PASSWORD_QUALITY_UNSPECIFIED = 0;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700590
Dianne Hackbornd6847842010-01-12 18:14:19 -0800591 /**
Jim Miller3e5d3fd2011-09-02 17:30:35 -0700592 * Constant for {@link #setPasswordQuality}: the policy allows for low-security biometric
593 * recognition technology. This implies technologies that can recognize the identity of
594 * an individual to about a 3 digit PIN (false detection is less than 1 in 1,000).
595 * Note that quality constants are ordered so that higher values are more restrictive.
596 */
597 public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 0x8000;
598
599 /**
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800600 * Constant for {@link #setPasswordQuality}: the policy requires some kind
601 * of password, but doesn't care what it is. Note that quality constants
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800602 * are ordered so that higher values are more restrictive.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800603 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800604 public static final int PASSWORD_QUALITY_SOMETHING = 0x10000;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700605
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800606 /**
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800607 * Constant for {@link #setPasswordQuality}: the user must have entered a
608 * password containing at least numeric characters. Note that quality
609 * constants are ordered so that higher values are more restrictive.
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800610 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800611 public static final int PASSWORD_QUALITY_NUMERIC = 0x20000;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700612
Dianne Hackbornd6847842010-01-12 18:14:19 -0800613 /**
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800614 * Constant for {@link #setPasswordQuality}: the user must have entered a
Jim Miller85516d02014-01-31 17:08:37 -0800615 * password containing at least numeric characters with no repeating (4444)
616 * or ordered (1234, 4321, 2468) sequences. Note that quality
617 * constants are ordered so that higher values are more restrictive.
618 */
619 public static final int PASSWORD_QUALITY_NUMERIC_COMPLEX = 0x30000;
620
621 /**
622 * Constant for {@link #setPasswordQuality}: the user must have entered a
Dianne Hackborn85f2c9c2010-03-22 11:12:48 -0700623 * password containing at least alphabetic (or other symbol) characters.
624 * Note that quality constants are ordered so that higher values are more
625 * restrictive.
626 */
627 public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700628
Dianne Hackborn85f2c9c2010-03-22 11:12:48 -0700629 /**
630 * Constant for {@link #setPasswordQuality}: the user must have entered a
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800631 * password containing at least <em>both></em> numeric <em>and</em>
Dianne Hackborn85f2c9c2010-03-22 11:12:48 -0700632 * alphabetic (or other symbol) characters. Note that quality constants are
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800633 * ordered so that higher values are more restrictive.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800634 */
Dianne Hackborn85f2c9c2010-03-22 11:12:48 -0700635 public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000;
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700636
Dianne Hackbornd6847842010-01-12 18:14:19 -0800637 /**
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700638 * Constant for {@link #setPasswordQuality}: the user must have entered a
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700639 * password containing at least a letter, a numerical digit and a special
640 * symbol, by default. With this password quality, passwords can be
641 * restricted to contain various sets of characters, like at least an
642 * uppercase letter, etc. These are specified using various methods,
643 * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note
644 * that quality constants are ordered so that higher values are more
645 * restrictive.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700646 */
647 public static final int PASSWORD_QUALITY_COMPLEX = 0x60000;
648
649 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -0800650 * Called by an application that is administering the device to set the
651 * password restrictions it is imposing. After setting this, the user
652 * will not be able to enter a new password that is not at least as
653 * restrictive as what has been set. Note that the current password
654 * will remain until the user has set a new one, so the change does not
655 * take place immediately. To prompt the user for a new password, use
656 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value.
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700657 *
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800658 * <p>Quality constants are ordered so that higher values are more restrictive;
659 * thus the highest requested quality constant (between the policy set here,
Dianne Hackborndf83afa2010-01-20 13:37:26 -0800660 * the user's preference, and any other considerations) is the one that
661 * is in effect.
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700662 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -0800663 * <p>The calling device admin must have requested
664 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
665 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700666 *
Dianne Hackbornef6b22f2010-02-16 20:38:49 -0800667 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800668 * @param quality The new desired quality. One of
669 * {@link #PASSWORD_QUALITY_UNSPECIFIED}, {@link #PASSWORD_QUALITY_SOMETHING},
Jim Miller85516d02014-01-31 17:08:37 -0800670 * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX},
671 * {@link #PASSWORD_QUALITY_ALPHABETIC}, {@link #PASSWORD_QUALITY_ALPHANUMERIC}
672 * or {@link #PASSWORD_QUALITY_COMPLEX}.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800673 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800674 public void setPasswordQuality(ComponentName admin, int quality) {
Dianne Hackbornd6847842010-01-12 18:14:19 -0800675 if (mService != null) {
676 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700677 mService.setPasswordQuality(admin, quality, UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -0800678 } catch (RemoteException e) {
679 Log.w(TAG, "Failed talking with device policy service", e);
680 }
681 }
682 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700683
Dianne Hackbornd6847842010-01-12 18:14:19 -0800684 /**
Jessica Hummel91da58d2014-04-10 17:39:43 +0100685 * Retrieve the current minimum password quality for all admins of this user
686 * and its profiles or a particular one.
Dianne Hackborn254cb442010-01-27 19:23:59 -0800687 * @param admin The name of the admin component to check, or null to aggregate
688 * all admins.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800689 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800690 public int getPasswordQuality(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700691 return getPasswordQuality(admin, UserHandle.myUserId());
692 }
693
694 /** @hide per-user version */
695 public int getPasswordQuality(ComponentName admin, int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -0800696 if (mService != null) {
697 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700698 return mService.getPasswordQuality(admin, userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -0800699 } catch (RemoteException e) {
700 Log.w(TAG, "Failed talking with device policy service", e);
701 }
702 }
Dianne Hackborn9327f4f2010-01-29 10:38:29 -0800703 return PASSWORD_QUALITY_UNSPECIFIED;
Dianne Hackbornd6847842010-01-12 18:14:19 -0800704 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700705
Dianne Hackbornd6847842010-01-12 18:14:19 -0800706 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -0800707 * Called by an application that is administering the device to set the
708 * minimum allowed password length. After setting this, the user
709 * will not be able to enter a new password that is not at least as
710 * restrictive as what has been set. Note that the current password
711 * will remain until the user has set a new one, so the change does not
712 * take place immediately. To prompt the user for a new password, use
713 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
714 * constraint is only imposed if the administrator has also requested either
Jim Miller85516d02014-01-31 17:08:37 -0800715 * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX},
716 * {@link #PASSWORD_QUALITY_ALPHABETIC}, {@link #PASSWORD_QUALITY_ALPHANUMERIC},
717 * or {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}.
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700718 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -0800719 * <p>The calling device admin must have requested
720 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
721 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700722 *
Dianne Hackbornef6b22f2010-02-16 20:38:49 -0800723 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800724 * @param length The new desired minimum password length. A value of 0
725 * means there is no restriction.
726 */
Dianne Hackborn254cb442010-01-27 19:23:59 -0800727 public void setPasswordMinimumLength(ComponentName admin, int length) {
Dianne Hackbornd6847842010-01-12 18:14:19 -0800728 if (mService != null) {
729 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700730 mService.setPasswordMinimumLength(admin, length, UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -0800731 } catch (RemoteException e) {
732 Log.w(TAG, "Failed talking with device policy service", e);
733 }
734 }
735 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700736
Dianne Hackbornd6847842010-01-12 18:14:19 -0800737 /**
Jessica Hummel91da58d2014-04-10 17:39:43 +0100738 * Retrieve the current minimum password length for all admins of this
739 * user and its profiles or a particular one.
Dianne Hackborn254cb442010-01-27 19:23:59 -0800740 * @param admin The name of the admin component to check, or null to aggregate
741 * all admins.
Dianne Hackbornd6847842010-01-12 18:14:19 -0800742 */
Dianne Hackborn254cb442010-01-27 19:23:59 -0800743 public int getPasswordMinimumLength(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700744 return getPasswordMinimumLength(admin, UserHandle.myUserId());
745 }
746
747 /** @hide per-user version */
748 public int getPasswordMinimumLength(ComponentName admin, int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -0800749 if (mService != null) {
750 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700751 return mService.getPasswordMinimumLength(admin, userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -0800752 } catch (RemoteException e) {
753 Log.w(TAG, "Failed talking with device policy service", e);
754 }
755 }
756 return 0;
757 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -0700758
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700759 /**
760 * Called by an application that is administering the device to set the
761 * minimum number of upper case letters required in the password. After
762 * setting this, the user will not be able to enter a new password that is
763 * not at least as restrictive as what has been set. Note that the current
764 * password will remain until the user has set a new one, so the change does
765 * not take place immediately. To prompt the user for a new password, use
766 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
767 * constraint is only imposed if the administrator has also requested
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700768 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The
769 * default value is 0.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700770 * <p>
771 * The calling device admin must have requested
772 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
773 * this method; if it has not, a security exception will be thrown.
774 *
775 * @param admin Which {@link DeviceAdminReceiver} this request is associated
776 * with.
777 * @param length The new desired minimum number of upper case letters
778 * required in the password. A value of 0 means there is no
779 * restriction.
780 */
781 public void setPasswordMinimumUpperCase(ComponentName admin, int length) {
782 if (mService != null) {
783 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700784 mService.setPasswordMinimumUpperCase(admin, length, UserHandle.myUserId());
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700785 } catch (RemoteException e) {
786 Log.w(TAG, "Failed talking with device policy service", e);
787 }
788 }
789 }
790
791 /**
792 * Retrieve the current number of upper case letters required in the
Jessica Hummel91da58d2014-04-10 17:39:43 +0100793 * password for all admins of this user and its profiles or a particular one.
794 * This is the same value as set by
795 * {#link {@link #setPasswordMinimumUpperCase(ComponentName, int)}
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700796 * and only applies when the password quality is
797 * {@link #PASSWORD_QUALITY_COMPLEX}.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700798 *
799 * @param admin The name of the admin component to check, or null to
800 * aggregate all admins.
801 * @return The minimum number of upper case letters required in the
802 * password.
803 */
804 public int getPasswordMinimumUpperCase(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700805 return getPasswordMinimumUpperCase(admin, UserHandle.myUserId());
806 }
807
808 /** @hide per-user version */
809 public int getPasswordMinimumUpperCase(ComponentName admin, int userHandle) {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700810 if (mService != null) {
811 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700812 return mService.getPasswordMinimumUpperCase(admin, userHandle);
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700813 } catch (RemoteException e) {
814 Log.w(TAG, "Failed talking with device policy service", e);
815 }
816 }
817 return 0;
818 }
819
820 /**
821 * Called by an application that is administering the device to set the
822 * minimum number of lower case letters required in the password. After
823 * setting this, the user will not be able to enter a new password that is
824 * not at least as restrictive as what has been set. Note that the current
825 * password will remain until the user has set a new one, so the change does
826 * not take place immediately. To prompt the user for a new password, use
827 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
828 * constraint is only imposed if the administrator has also requested
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700829 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The
830 * default value is 0.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700831 * <p>
832 * The calling device admin must have requested
833 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
834 * this method; if it has not, a security exception will be thrown.
835 *
836 * @param admin Which {@link DeviceAdminReceiver} this request is associated
837 * with.
838 * @param length The new desired minimum number of lower case letters
839 * required in the password. A value of 0 means there is no
840 * restriction.
841 */
842 public void setPasswordMinimumLowerCase(ComponentName admin, int length) {
843 if (mService != null) {
844 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700845 mService.setPasswordMinimumLowerCase(admin, length, UserHandle.myUserId());
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700846 } catch (RemoteException e) {
847 Log.w(TAG, "Failed talking with device policy service", e);
848 }
849 }
850 }
851
852 /**
853 * Retrieve the current number of lower case letters required in the
Jessica Hummel91da58d2014-04-10 17:39:43 +0100854 * password for all admins of this user and its profiles or a particular one.
855 * This is the same value as set by
856 * {#link {@link #setPasswordMinimumLowerCase(ComponentName, int)}
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700857 * and only applies when the password quality is
858 * {@link #PASSWORD_QUALITY_COMPLEX}.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700859 *
860 * @param admin The name of the admin component to check, or null to
861 * aggregate all admins.
862 * @return The minimum number of lower case letters required in the
863 * password.
864 */
865 public int getPasswordMinimumLowerCase(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700866 return getPasswordMinimumLowerCase(admin, UserHandle.myUserId());
867 }
868
869 /** @hide per-user version */
870 public int getPasswordMinimumLowerCase(ComponentName admin, int userHandle) {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700871 if (mService != null) {
872 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700873 return mService.getPasswordMinimumLowerCase(admin, userHandle);
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700874 } catch (RemoteException e) {
875 Log.w(TAG, "Failed talking with device policy service", e);
876 }
877 }
878 return 0;
879 }
880
881 /**
882 * Called by an application that is administering the device to set the
883 * minimum number of letters required in the password. After setting this,
884 * the user will not be able to enter a new password that is not at least as
885 * restrictive as what has been set. Note that the current password will
886 * remain until the user has set a new one, so the change does not take
887 * place immediately. To prompt the user for a new password, use
888 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
889 * constraint is only imposed if the administrator has also requested
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700890 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The
891 * default value is 1.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700892 * <p>
893 * The calling device admin must have requested
894 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
895 * this method; if it has not, a security exception will be thrown.
896 *
897 * @param admin Which {@link DeviceAdminReceiver} this request is associated
898 * with.
899 * @param length The new desired minimum number of letters required in the
900 * password. A value of 0 means there is no restriction.
901 */
902 public void setPasswordMinimumLetters(ComponentName admin, int length) {
903 if (mService != null) {
904 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700905 mService.setPasswordMinimumLetters(admin, length, UserHandle.myUserId());
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700906 } catch (RemoteException e) {
907 Log.w(TAG, "Failed talking with device policy service", e);
908 }
909 }
910 }
911
912 /**
913 * Retrieve the current number of letters required in the password for all
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700914 * admins or a particular one. This is the same value as
915 * set by {#link {@link #setPasswordMinimumLetters(ComponentName, int)}
916 * and only applies when the password quality is
917 * {@link #PASSWORD_QUALITY_COMPLEX}.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700918 *
919 * @param admin The name of the admin component to check, or null to
920 * aggregate all admins.
921 * @return The minimum number of letters required in the password.
922 */
923 public int getPasswordMinimumLetters(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700924 return getPasswordMinimumLetters(admin, UserHandle.myUserId());
925 }
926
927 /** @hide per-user version */
928 public int getPasswordMinimumLetters(ComponentName admin, int userHandle) {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700929 if (mService != null) {
930 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700931 return mService.getPasswordMinimumLetters(admin, userHandle);
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700932 } catch (RemoteException e) {
933 Log.w(TAG, "Failed talking with device policy service", e);
934 }
935 }
936 return 0;
937 }
938
939 /**
940 * Called by an application that is administering the device to set the
941 * minimum number of numerical digits required in the password. After
942 * setting this, the user will not be able to enter a new password that is
943 * not at least as restrictive as what has been set. Note that the current
944 * password will remain until the user has set a new one, so the change does
945 * not take place immediately. To prompt the user for a new password, use
946 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
947 * constraint is only imposed if the administrator has also requested
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700948 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The
949 * default value is 1.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700950 * <p>
951 * The calling device admin must have requested
952 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
953 * this method; if it has not, a security exception will be thrown.
954 *
955 * @param admin Which {@link DeviceAdminReceiver} this request is associated
956 * with.
957 * @param length The new desired minimum number of numerical digits required
958 * in the password. A value of 0 means there is no restriction.
959 */
960 public void setPasswordMinimumNumeric(ComponentName admin, int length) {
961 if (mService != null) {
962 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700963 mService.setPasswordMinimumNumeric(admin, length, UserHandle.myUserId());
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700964 } catch (RemoteException e) {
965 Log.w(TAG, "Failed talking with device policy service", e);
966 }
967 }
968 }
969
970 /**
971 * Retrieve the current number of numerical digits required in the password
Jessica Hummel91da58d2014-04-10 17:39:43 +0100972 * for all admins of this user and its profiles or a particular one.
973 * This is the same value as set by
974 * {#link {@link #setPasswordMinimumNumeric(ComponentName, int)}
Konstantin Lopyrevc8577402010-06-04 17:15:02 -0700975 * and only applies when the password quality is
976 * {@link #PASSWORD_QUALITY_COMPLEX}.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700977 *
978 * @param admin The name of the admin component to check, or null to
979 * aggregate all admins.
980 * @return The minimum number of numerical digits required in the password.
981 */
982 public int getPasswordMinimumNumeric(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700983 return getPasswordMinimumNumeric(admin, UserHandle.myUserId());
984 }
985
986 /** @hide per-user version */
987 public int getPasswordMinimumNumeric(ComponentName admin, int userHandle) {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700988 if (mService != null) {
989 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700990 return mService.getPasswordMinimumNumeric(admin, userHandle);
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -0700991 } catch (RemoteException e) {
992 Log.w(TAG, "Failed talking with device policy service", e);
993 }
994 }
995 return 0;
996 }
997
998 /**
999 * Called by an application that is administering the device to set the
1000 * minimum number of symbols required in the password. After setting this,
1001 * the user will not be able to enter a new password that is not at least as
1002 * restrictive as what has been set. Note that the current password will
1003 * remain until the user has set a new one, so the change does not take
1004 * place immediately. To prompt the user for a new password, use
1005 * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This
1006 * constraint is only imposed if the administrator has also requested
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001007 * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The
1008 * default value is 1.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07001009 * <p>
1010 * The calling device admin must have requested
1011 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
1012 * this method; if it has not, a security exception will be thrown.
1013 *
1014 * @param admin Which {@link DeviceAdminReceiver} this request is associated
1015 * with.
1016 * @param length The new desired minimum number of symbols required in the
1017 * password. A value of 0 means there is no restriction.
1018 */
1019 public void setPasswordMinimumSymbols(ComponentName admin, int length) {
1020 if (mService != null) {
1021 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001022 mService.setPasswordMinimumSymbols(admin, length, UserHandle.myUserId());
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07001023 } catch (RemoteException e) {
1024 Log.w(TAG, "Failed talking with device policy service", e);
1025 }
1026 }
1027 }
1028
1029 /**
1030 * Retrieve the current number of symbols required in the password for all
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001031 * admins or a particular one. This is the same value as
1032 * set by {#link {@link #setPasswordMinimumSymbols(ComponentName, int)}
1033 * and only applies when the password quality is
1034 * {@link #PASSWORD_QUALITY_COMPLEX}.
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07001035 *
1036 * @param admin The name of the admin component to check, or null to
1037 * aggregate all admins.
1038 * @return The minimum number of symbols required in the password.
1039 */
1040 public int getPasswordMinimumSymbols(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001041 return getPasswordMinimumSymbols(admin, UserHandle.myUserId());
1042 }
1043
1044 /** @hide per-user version */
1045 public int getPasswordMinimumSymbols(ComponentName admin, int userHandle) {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07001046 if (mService != null) {
1047 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001048 return mService.getPasswordMinimumSymbols(admin, userHandle);
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07001049 } catch (RemoteException e) {
1050 Log.w(TAG, "Failed talking with device policy service", e);
1051 }
1052 }
1053 return 0;
1054 }
1055
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001056 /**
1057 * Called by an application that is administering the device to set the
1058 * minimum number of non-letter characters (numerical digits or symbols)
1059 * required in the password. After setting this, the user will not be able
1060 * to enter a new password that is not at least as restrictive as what has
1061 * been set. Note that the current password will remain until the user has
1062 * set a new one, so the change does not take place immediately. To prompt
1063 * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} after
1064 * setting this value. This constraint is only imposed if the administrator
1065 * has also requested {@link #PASSWORD_QUALITY_COMPLEX} with
1066 * {@link #setPasswordQuality}. The default value is 0.
1067 * <p>
1068 * The calling device admin must have requested
1069 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
1070 * this method; if it has not, a security exception will be thrown.
1071 *
1072 * @param admin Which {@link DeviceAdminReceiver} this request is associated
1073 * with.
1074 * @param length The new desired minimum number of letters required in the
1075 * password. A value of 0 means there is no restriction.
1076 */
1077 public void setPasswordMinimumNonLetter(ComponentName admin, int length) {
1078 if (mService != null) {
1079 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001080 mService.setPasswordMinimumNonLetter(admin, length, UserHandle.myUserId());
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001081 } catch (RemoteException e) {
1082 Log.w(TAG, "Failed talking with device policy service", e);
1083 }
1084 }
1085 }
1086
1087 /**
1088 * Retrieve the current number of non-letter characters required in the
Jessica Hummel91da58d2014-04-10 17:39:43 +01001089 * password for all admins of this user and its profiles or a particular one.
1090 * This is the same value as set by
1091 * {#link {@link #setPasswordMinimumNonLetter(ComponentName, int)}
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001092 * and only applies when the password quality is
1093 * {@link #PASSWORD_QUALITY_COMPLEX}.
1094 *
1095 * @param admin The name of the admin component to check, or null to
1096 * aggregate all admins.
1097 * @return The minimum number of letters required in the password.
1098 */
1099 public int getPasswordMinimumNonLetter(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001100 return getPasswordMinimumNonLetter(admin, UserHandle.myUserId());
1101 }
1102
1103 /** @hide per-user version */
1104 public int getPasswordMinimumNonLetter(ComponentName admin, int userHandle) {
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001105 if (mService != null) {
1106 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001107 return mService.getPasswordMinimumNonLetter(admin, userHandle);
Konstantin Lopyrevc8577402010-06-04 17:15:02 -07001108 } catch (RemoteException e) {
1109 Log.w(TAG, "Failed talking with device policy service", e);
1110 }
1111 }
1112 return 0;
1113 }
1114
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001115 /**
1116 * Called by an application that is administering the device to set the length
1117 * of the password history. After setting this, the user will not be able to
1118 * enter a new password that is the same as any password in the history. Note
1119 * that the current password will remain until the user has set a new one, so
1120 * the change does not take place immediately. To prompt the user for a new
1121 * password, use {@link #ACTION_SET_NEW_PASSWORD} after setting this value.
1122 * This constraint is only imposed if the administrator has also requested
Jim Miller85516d02014-01-31 17:08:37 -08001123 * either {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}
1124 * {@link #PASSWORD_QUALITY_ALPHABETIC}, or {@link #PASSWORD_QUALITY_ALPHANUMERIC}
1125 * with {@link #setPasswordQuality}.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001126 *
1127 * <p>
1128 * The calling device admin must have requested
1129 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this
1130 * method; if it has not, a security exception will be thrown.
1131 *
1132 * @param admin Which {@link DeviceAdminReceiver} this request is associated
1133 * with.
1134 * @param length The new desired length of password history. A value of 0
1135 * means there is no restriction.
1136 */
1137 public void setPasswordHistoryLength(ComponentName admin, int length) {
1138 if (mService != null) {
1139 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001140 mService.setPasswordHistoryLength(admin, length, UserHandle.myUserId());
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001141 } catch (RemoteException e) {
1142 Log.w(TAG, "Failed talking with device policy service", e);
1143 }
1144 }
1145 }
1146
1147 /**
Jim Millera4e28d12010-11-08 16:15:47 -08001148 * Called by a device admin to set the password expiration timeout. Calling this method
1149 * will restart the countdown for password expiration for the given admin, as will changing
1150 * the device password (for all admins).
1151 *
1152 * <p>The provided timeout is the time delta in ms and will be added to the current time.
1153 * For example, to have the password expire 5 days from now, timeout would be
1154 * 5 * 86400 * 1000 = 432000000 ms for timeout.
1155 *
1156 * <p>To disable password expiration, a value of 0 may be used for timeout.
1157 *
Jim Millera4e28d12010-11-08 16:15:47 -08001158 * <p>The calling device admin must have requested
1159 * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this
1160 * method; if it has not, a security exception will be thrown.
1161 *
Jessica Hummel9da60392014-05-21 12:32:57 +01001162 * <p> Note that setting the password will automatically reset the expiration time for all
1163 * active admins. Active admins do not need to explicitly call this method in that case.
1164 *
Jim Millera4e28d12010-11-08 16:15:47 -08001165 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1166 * @param timeout The limit (in ms) that a password can remain in effect. A value of 0
1167 * means there is no restriction (unlimited).
1168 */
1169 public void setPasswordExpirationTimeout(ComponentName admin, long timeout) {
1170 if (mService != null) {
1171 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001172 mService.setPasswordExpirationTimeout(admin, timeout, UserHandle.myUserId());
Jim Millera4e28d12010-11-08 16:15:47 -08001173 } catch (RemoteException e) {
1174 Log.w(TAG, "Failed talking with device policy service", e);
1175 }
1176 }
1177 }
1178
1179 /**
Jim Miller6b857682011-02-16 16:27:41 -08001180 * Get the password expiration timeout for the given admin. The expiration timeout is the
1181 * recurring expiration timeout provided in the call to
1182 * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the
1183 * aggregate of all policy administrators if admin is null.
Jim Millera4e28d12010-11-08 16:15:47 -08001184 *
1185 * @param admin The name of the admin component to check, or null to aggregate all admins.
1186 * @return The timeout for the given admin or the minimum of all timeouts
1187 */
1188 public long getPasswordExpirationTimeout(ComponentName admin) {
1189 if (mService != null) {
1190 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001191 return mService.getPasswordExpirationTimeout(admin, UserHandle.myUserId());
Jim Millera4e28d12010-11-08 16:15:47 -08001192 } catch (RemoteException e) {
1193 Log.w(TAG, "Failed talking with device policy service", e);
1194 }
1195 }
1196 return 0;
1197 }
1198
1199 /**
1200 * Get the current password expiration time for the given admin or an aggregate of
Jessica Hummel91da58d2014-04-10 17:39:43 +01001201 * all admins of this user and its profiles if admin is null. If the password is
1202 * expired, this will return the time since the password expired as a negative number.
1203 * If admin is null, then a composite of all expiration timeouts is returned
1204 * - which will be the minimum of all timeouts.
Jim Millera4e28d12010-11-08 16:15:47 -08001205 *
1206 * @param admin The name of the admin component to check, or null to aggregate all admins.
1207 * @return The password expiration time, in ms.
1208 */
1209 public long getPasswordExpiration(ComponentName admin) {
1210 if (mService != null) {
1211 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001212 return mService.getPasswordExpiration(admin, UserHandle.myUserId());
Jim Millera4e28d12010-11-08 16:15:47 -08001213 } catch (RemoteException e) {
1214 Log.w(TAG, "Failed talking with device policy service", e);
1215 }
1216 }
1217 return 0;
1218 }
1219
1220 /**
Jessica Hummel91da58d2014-04-10 17:39:43 +01001221 * Retrieve the current password history length for all admins of this
1222 * user and its profiles or a particular one.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001223 * @param admin The name of the admin component to check, or null to aggregate
1224 * all admins.
1225 * @return The length of the password history
1226 */
1227 public int getPasswordHistoryLength(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001228 return getPasswordHistoryLength(admin, UserHandle.myUserId());
1229 }
1230
1231 /** @hide per-user version */
1232 public int getPasswordHistoryLength(ComponentName admin, int userHandle) {
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001233 if (mService != null) {
1234 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001235 return mService.getPasswordHistoryLength(admin, userHandle);
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001236 } catch (RemoteException e) {
1237 Log.w(TAG, "Failed talking with device policy service", e);
1238 }
1239 }
1240 return 0;
1241 }
1242
Dianne Hackbornd6847842010-01-12 18:14:19 -08001243 /**
Dianne Hackborn254cb442010-01-27 19:23:59 -08001244 * Return the maximum password length that the device supports for a
Dianne Hackborn9327f4f2010-01-29 10:38:29 -08001245 * particular password quality.
Dianne Hackborn364f6e32010-01-29 17:38:20 -08001246 * @param quality The quality being interrogated.
Dianne Hackborn254cb442010-01-27 19:23:59 -08001247 * @return Returns the maximum length that the user can enter.
1248 */
Dianne Hackborn9327f4f2010-01-29 10:38:29 -08001249 public int getPasswordMaximumLength(int quality) {
Dianne Hackborn254cb442010-01-27 19:23:59 -08001250 // Kind-of arbitrary.
1251 return 16;
1252 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001253
Dianne Hackborn254cb442010-01-27 19:23:59 -08001254 /**
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001255 * Determine whether the current password the user has set is sufficient
Dianne Hackborn9327f4f2010-01-29 10:38:29 -08001256 * to meet the policy requirements (quality, minimum length) that have been
Jessica Hummel91da58d2014-04-10 17:39:43 +01001257 * requested by the admins of this user and its profiles.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001258 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001259 * <p>The calling device admin must have requested
1260 * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call
1261 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001262 *
Jessica Hummel91da58d2014-04-10 17:39:43 +01001263 * @return Returns true if the password meets the current requirements, else false.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001264 */
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001265 public boolean isActivePasswordSufficient() {
Dianne Hackbornd6847842010-01-12 18:14:19 -08001266 if (mService != null) {
1267 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001268 return mService.isActivePasswordSufficient(UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -08001269 } catch (RemoteException e) {
1270 Log.w(TAG, "Failed talking with device policy service", e);
1271 }
1272 }
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001273 return false;
Dianne Hackbornd6847842010-01-12 18:14:19 -08001274 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001275
Dianne Hackbornd6847842010-01-12 18:14:19 -08001276 /**
1277 * Retrieve the number of times the user has failed at entering a
1278 * password since that last successful password entry.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001279 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001280 * <p>The calling device admin must have requested
1281 * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call
1282 * this method; if it has not, a security exception will be thrown.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001283 */
1284 public int getCurrentFailedPasswordAttempts() {
1285 if (mService != null) {
1286 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001287 return mService.getCurrentFailedPasswordAttempts(UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -08001288 } catch (RemoteException e) {
1289 Log.w(TAG, "Failed talking with device policy service", e);
1290 }
1291 }
1292 return -1;
1293 }
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001294
1295 /**
Andrew Stadler88209d12010-02-08 22:59:36 -08001296 * Setting this to a value greater than zero enables a built-in policy
1297 * that will perform a device wipe after too many incorrect
1298 * device-unlock passwords have been entered. This built-in policy combines
1299 * watching for failed passwords and wiping the device, and requires
1300 * that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08001301 * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001302 *
Andrew Stadler88209d12010-02-08 22:59:36 -08001303 * <p>To implement any other policy (e.g. wiping data for a particular
1304 * application only, erasing or revoking credentials, or reporting the
1305 * failure to a server), you should implement
Dianne Hackbornef6b22f2010-02-16 20:38:49 -08001306 * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)}
Andrew Stadler88209d12010-02-08 22:59:36 -08001307 * instead. Do not use this API, because if the maximum count is reached,
1308 * the device will be wiped immediately, and your callback will not be invoked.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001309 *
Dianne Hackbornef6b22f2010-02-16 20:38:49 -08001310 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08001311 * @param num The number of failed password attempts at which point the
1312 * device will wipe its data.
1313 */
1314 public void setMaximumFailedPasswordsForWipe(ComponentName admin, int num) {
1315 if (mService != null) {
1316 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001317 mService.setMaximumFailedPasswordsForWipe(admin, num, UserHandle.myUserId());
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08001318 } catch (RemoteException e) {
1319 Log.w(TAG, "Failed talking with device policy service", e);
1320 }
1321 }
1322 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001323
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08001324 /**
Dianne Hackborn254cb442010-01-27 19:23:59 -08001325 * Retrieve the current maximum number of login attempts that are allowed
Jessica Hummel91da58d2014-04-10 17:39:43 +01001326 * before the device wipes itself, for all admins of this user and its profiles
Dianne Hackborn254cb442010-01-27 19:23:59 -08001327 * or a particular one.
1328 * @param admin The name of the admin component to check, or null to aggregate
1329 * all admins.
1330 */
1331 public int getMaximumFailedPasswordsForWipe(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001332 return getMaximumFailedPasswordsForWipe(admin, UserHandle.myUserId());
1333 }
1334
1335 /** @hide per-user version */
1336 public int getMaximumFailedPasswordsForWipe(ComponentName admin, int userHandle) {
Dianne Hackborn254cb442010-01-27 19:23:59 -08001337 if (mService != null) {
1338 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001339 return mService.getMaximumFailedPasswordsForWipe(admin, userHandle);
Dianne Hackborn254cb442010-01-27 19:23:59 -08001340 } catch (RemoteException e) {
1341 Log.w(TAG, "Failed talking with device policy service", e);
1342 }
1343 }
1344 return 0;
1345 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001346
Dianne Hackborn254cb442010-01-27 19:23:59 -08001347 /**
Amith Yamasani3a3d2122014-10-29 11:41:31 -07001348 * Returns the profile with the smallest maximum failed passwords for wipe,
1349 * for the given user. So for primary user, it might return the primary or
1350 * a managed profile. For a secondary user, it would be the same as the
1351 * user passed in.
1352 * @hide Used only by Keyguard
1353 */
1354 public int getProfileWithMinimumFailedPasswordsForWipe(int userHandle) {
1355 if (mService != null) {
1356 try {
1357 return mService.getProfileWithMinimumFailedPasswordsForWipe(userHandle);
1358 } catch (RemoteException e) {
1359 Log.w(TAG, "Failed talking with device policy service", e);
1360 }
1361 }
1362 return UserHandle.USER_NULL;
1363 }
1364
1365 /**
Dianne Hackborn87bba1e2010-02-26 17:25:54 -08001366 * Flag for {@link #resetPassword}: don't allow other admins to change
1367 * the password again until the user has entered it.
1368 */
1369 public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001;
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001370
Dianne Hackborn87bba1e2010-02-26 17:25:54 -08001371 /**
Dianne Hackbornef6b22f2010-02-16 20:38:49 -08001372 * Force a new device unlock password (the password needed to access the
1373 * entire device, not for individual accounts) on the user. This takes
1374 * effect immediately.
Dianne Hackborn9327f4f2010-01-29 10:38:29 -08001375 * The given password must be sufficient for the
1376 * current password quality and length constraints as returned by
1377 * {@link #getPasswordQuality(ComponentName)} and
1378 * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet
1379 * these constraints, then it will be rejected and false returned. Note
1380 * that the password may be a stronger quality (containing alphanumeric
1381 * characters when the requested quality is only numeric), in which case
1382 * the currently active quality will be increased to match.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001383 *
Adrian Roosf8f56bc2014-11-20 23:55:34 +01001384 * <p>Calling with a null or empty password will clear any existing PIN,
1385 * pattern or password if the current password constraints allow it.
1386 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001387 * <p>The calling device admin must have requested
1388 * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call
1389 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001390 *
Amith Yamasani242f4b12014-10-14 16:06:13 -07001391 * <p>Calling this from a managed profile will throw a security exception.
Jessica Hummel91da58d2014-04-10 17:39:43 +01001392 *
Adrian Roosf8f56bc2014-11-20 23:55:34 +01001393 * @param password The new password for the user. Null or empty clears the password.
Dianne Hackborn87bba1e2010-02-26 17:25:54 -08001394 * @param flags May be 0 or {@link #RESET_PASSWORD_REQUIRE_ENTRY}.
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001395 * @return Returns true if the password was applied, or false if it is
1396 * not acceptable for the current constraints.
1397 */
Dianne Hackborn87bba1e2010-02-26 17:25:54 -08001398 public boolean resetPassword(String password, int flags) {
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001399 if (mService != null) {
1400 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001401 return mService.resetPassword(password, flags, UserHandle.myUserId());
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001402 } catch (RemoteException e) {
1403 Log.w(TAG, "Failed talking with device policy service", e);
1404 }
1405 }
1406 return false;
1407 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001408
Dianne Hackbornd6847842010-01-12 18:14:19 -08001409 /**
1410 * Called by an application that is administering the device to set the
1411 * maximum time for user activity until the device will lock. This limits
1412 * the length that the user can set. It takes effect immediately.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001413 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001414 * <p>The calling device admin must have requested
Dianne Hackborn315ada72010-02-11 12:14:08 -08001415 * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001416 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001417 *
Dianne Hackbornef6b22f2010-02-16 20:38:49 -08001418 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001419 * @param timeMs The new desired maximum time to lock in milliseconds.
1420 * A value of 0 means there is no restriction.
1421 */
1422 public void setMaximumTimeToLock(ComponentName admin, long timeMs) {
1423 if (mService != null) {
1424 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001425 mService.setMaximumTimeToLock(admin, timeMs, UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -08001426 } catch (RemoteException e) {
1427 Log.w(TAG, "Failed talking with device policy service", e);
1428 }
1429 }
1430 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001431
Dianne Hackbornd6847842010-01-12 18:14:19 -08001432 /**
Jessica Hummel91da58d2014-04-10 17:39:43 +01001433 * Retrieve the current maximum time to unlock for all admins of this user
1434 * and its profiles or a particular one.
Dianne Hackborn254cb442010-01-27 19:23:59 -08001435 * @param admin The name of the admin component to check, or null to aggregate
1436 * all admins.
Jim Millerd4efaac2014-08-14 18:02:45 -07001437 * @return time in milliseconds for the given admin or the minimum value (strictest) of
Jim Miller76b9b8b2014-08-22 17:04:57 -07001438 * all admins if admin is null. Returns 0 if there are no restrictions.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001439 */
Dianne Hackborn254cb442010-01-27 19:23:59 -08001440 public long getMaximumTimeToLock(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001441 return getMaximumTimeToLock(admin, UserHandle.myUserId());
1442 }
1443
1444 /** @hide per-user version */
1445 public long getMaximumTimeToLock(ComponentName admin, int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08001446 if (mService != null) {
1447 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001448 return mService.getMaximumTimeToLock(admin, userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -08001449 } catch (RemoteException e) {
1450 Log.w(TAG, "Failed talking with device policy service", e);
1451 }
1452 }
1453 return 0;
1454 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001455
Dianne Hackbornd6847842010-01-12 18:14:19 -08001456 /**
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001457 * Make the device lock immediately, as if the lock screen timeout has
1458 * expired at the point of this call.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001459 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001460 * <p>The calling device admin must have requested
1461 * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call
1462 * this method; if it has not, a security exception will be thrown.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001463 */
Dianne Hackborndf83afa2010-01-20 13:37:26 -08001464 public void lockNow() {
1465 if (mService != null) {
1466 try {
1467 mService.lockNow();
1468 } catch (RemoteException e) {
1469 Log.w(TAG, "Failed talking with device policy service", e);
1470 }
1471 }
1472 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001473
Dianne Hackbornd6847842010-01-12 18:14:19 -08001474 /**
Dianne Hackborn42499172010-10-15 18:45:07 -07001475 * Flag for {@link #wipeData(int)}: also erase the device's external
Paul Crowleya7e87ac2014-11-18 13:50:19 +00001476 * storage (such as SD cards).
Dianne Hackborn42499172010-10-15 18:45:07 -07001477 */
1478 public static final int WIPE_EXTERNAL_STORAGE = 0x0001;
1479
1480 /**
Paul Crowleya7e87ac2014-11-18 13:50:19 +00001481 * Flag for {@link #wipeData(int)}: also erase the factory reset protection
1482 * data.
1483 *
Paul Crowley2934b262014-12-02 11:21:13 +00001484 * <p>This flag may only be set by device owner admins; if it is set by
1485 * other admins a {@link SecurityException} will be thrown.
Paul Crowleya7e87ac2014-11-18 13:50:19 +00001486 */
1487 public static final int WIPE_RESET_PROTECTION_DATA = 0x0002;
1488
1489 /**
Paul Quei2450a0e2013-09-20 09:26:21 +08001490 * Ask the user data be wiped. This will cause the device to reboot,
Paul Crowleya7e87ac2014-11-18 13:50:19 +00001491 * erasing all user data while next booting up.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001492 *
Dianne Hackborn8aa2e892010-01-22 11:31:30 -08001493 * <p>The calling device admin must have requested
1494 * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to be able to call
1495 * this method; if it has not, a security exception will be thrown.
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001496 *
Paul Crowleya7e87ac2014-11-18 13:50:19 +00001497 * @param flags Bit mask of additional options: currently supported flags
1498 * are {@link #WIPE_EXTERNAL_STORAGE} and
1499 * {@link #WIPE_RESET_PROTECTION_DATA}.
Dianne Hackbornd6847842010-01-12 18:14:19 -08001500 */
1501 public void wipeData(int flags) {
1502 if (mService != null) {
1503 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001504 mService.wipeData(flags, UserHandle.myUserId());
Dianne Hackbornd6847842010-01-12 18:14:19 -08001505 } catch (RemoteException e) {
1506 Log.w(TAG, "Failed talking with device policy service", e);
1507 }
1508 }
1509 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07001510
Dianne Hackbornd6847842010-01-12 18:14:19 -08001511 /**
Oscar Montemayor69238c62010-08-03 10:51:06 -07001512 * Called by an application that is administering the device to set the
1513 * global proxy and exclusion list.
1514 * <p>
1515 * The calling device admin must have requested
1516 * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call
1517 * this method; if it has not, a security exception will be thrown.
1518 * Only the first device admin can set the proxy. If a second admin attempts
1519 * to set the proxy, the {@link ComponentName} of the admin originally setting the
1520 * proxy will be returned. If successful in setting the proxy, null will
1521 * be returned.
1522 * The method can be called repeatedly by the device admin alrady setting the
1523 * proxy to update the proxy and exclusion list.
1524 *
1525 * @param admin Which {@link DeviceAdminReceiver} this request is associated
1526 * with.
1527 * @param proxySpec the global proxy desired. Must be an HTTP Proxy.
1528 * Pass Proxy.NO_PROXY to reset the proxy.
1529 * @param exclusionList a list of domains to be excluded from the global proxy.
Oscar Montemayor69238c62010-08-03 10:51:06 -07001530 * @return returns null if the proxy was successfully set, or a {@link ComponentName}
1531 * of the device admin that sets thew proxy otherwise.
Andy Stadlerd2672722011-02-16 10:53:33 -08001532 * @hide
Oscar Montemayor69238c62010-08-03 10:51:06 -07001533 */
1534 public ComponentName setGlobalProxy(ComponentName admin, Proxy proxySpec,
1535 List<String> exclusionList ) {
1536 if (proxySpec == null) {
1537 throw new NullPointerException();
1538 }
1539 if (mService != null) {
1540 try {
1541 String hostSpec;
1542 String exclSpec;
1543 if (proxySpec.equals(Proxy.NO_PROXY)) {
1544 hostSpec = null;
1545 exclSpec = null;
1546 } else {
1547 if (!proxySpec.type().equals(Proxy.Type.HTTP)) {
1548 throw new IllegalArgumentException();
1549 }
1550 InetSocketAddress sa = (InetSocketAddress)proxySpec.address();
1551 String hostName = sa.getHostName();
1552 int port = sa.getPort();
1553 StringBuilder hostBuilder = new StringBuilder();
1554 hostSpec = hostBuilder.append(hostName)
1555 .append(":").append(Integer.toString(port)).toString();
1556 if (exclusionList == null) {
1557 exclSpec = "";
1558 } else {
1559 StringBuilder listBuilder = new StringBuilder();
1560 boolean firstDomain = true;
1561 for (String exclDomain : exclusionList) {
1562 if (!firstDomain) {
1563 listBuilder = listBuilder.append(",");
1564 } else {
1565 firstDomain = false;
1566 }
1567 listBuilder = listBuilder.append(exclDomain.trim());
1568 }
1569 exclSpec = listBuilder.toString();
1570 }
Yuhao Zheng90704842014-02-28 17:22:45 -08001571 if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec)
1572 != android.net.Proxy.PROXY_VALID)
1573 throw new IllegalArgumentException();
Oscar Montemayor69238c62010-08-03 10:51:06 -07001574 }
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001575 return mService.setGlobalProxy(admin, hostSpec, exclSpec, UserHandle.myUserId());
Oscar Montemayor69238c62010-08-03 10:51:06 -07001576 } catch (RemoteException e) {
1577 Log.w(TAG, "Failed talking with device policy service", e);
1578 }
1579 }
1580 return null;
1581 }
1582
1583 /**
Jason Monk03bc9912014-05-13 09:44:57 -04001584 * Set a network-independent global HTTP proxy. This is not normally what you want
1585 * for typical HTTP proxies - they are generally network dependent. However if you're
1586 * doing something unusual like general internal filtering this may be useful. On
1587 * a private network where the proxy is not accessible, you may break HTTP using this.
1588 *
1589 * <p>This method requires the caller to be the device owner.
1590 *
1591 * <p>This proxy is only a recommendation and it is possible that some apps will ignore it.
1592 * @see ProxyInfo
1593 *
1594 * @param admin Which {@link DeviceAdminReceiver} this request is associated
1595 * with.
1596 * @param proxyInfo The a {@link ProxyInfo} object defining the new global
1597 * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
1598 */
1599 public void setRecommendedGlobalProxy(ComponentName admin, ProxyInfo proxyInfo) {
1600 if (mService != null) {
1601 try {
1602 mService.setRecommendedGlobalProxy(admin, proxyInfo);
1603 } catch (RemoteException e) {
1604 Log.w(TAG, "Failed talking with device policy service", e);
1605 }
1606 }
1607 }
1608
1609 /**
Oscar Montemayor69238c62010-08-03 10:51:06 -07001610 * Returns the component name setting the global proxy.
1611 * @return ComponentName object of the device admin that set the global proxy, or
1612 * null if no admin has set the proxy.
Andy Stadlerd2672722011-02-16 10:53:33 -08001613 * @hide
Oscar Montemayor69238c62010-08-03 10:51:06 -07001614 */
1615 public ComponentName getGlobalProxyAdmin() {
1616 if (mService != null) {
1617 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001618 return mService.getGlobalProxyAdmin(UserHandle.myUserId());
Oscar Montemayor69238c62010-08-03 10:51:06 -07001619 } catch (RemoteException e) {
1620 Log.w(TAG, "Failed talking with device policy service", e);
1621 }
1622 }
1623 return null;
1624 }
1625
1626 /**
Andy Stadler22dbfda2011-01-17 12:47:31 -08001627 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001628 * indicating that encryption is not supported.
1629 */
1630 public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0;
1631
1632 /**
Andy Stadler22dbfda2011-01-17 12:47:31 -08001633 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001634 * indicating that encryption is supported, but is not currently active.
1635 */
1636 public static final int ENCRYPTION_STATUS_INACTIVE = 1;
1637
1638 /**
Andy Stadler22dbfda2011-01-17 12:47:31 -08001639 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001640 * indicating that encryption is not currently active, but is currently
1641 * being activated. This is only reported by devices that support
1642 * encryption of data and only when the storage is currently
1643 * undergoing a process of becoming encrypted. A device that must reboot and/or wipe data
1644 * to become encrypted will never return this value.
1645 */
Andy Stadler22dbfda2011-01-17 12:47:31 -08001646 public static final int ENCRYPTION_STATUS_ACTIVATING = 2;
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001647
1648 /**
Andy Stadler22dbfda2011-01-17 12:47:31 -08001649 * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001650 * indicating that encryption is active.
1651 */
Andy Stadler22dbfda2011-01-17 12:47:31 -08001652 public static final int ENCRYPTION_STATUS_ACTIVE = 3;
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001653
1654 /**
1655 * Activity action: begin the process of encrypting data on the device. This activity should
1656 * be launched after using {@link #setStorageEncryption} to request encryption be activated.
1657 * After resuming from this activity, use {@link #getStorageEncryption}
1658 * to check encryption status. However, on some devices this activity may never return, as
1659 * it may trigger a reboot and in some cases a complete data wipe of the device.
1660 */
1661 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1662 public static final String ACTION_START_ENCRYPTION
1663 = "android.app.action.START_ENCRYPTION";
1664
1665 /**
Jim Millerb8ec4702012-08-31 17:19:10 -07001666 * Widgets are enabled in keyguard
1667 */
Jim Miller48b9b0d2012-09-19 23:16:50 -07001668 public static final int KEYGUARD_DISABLE_FEATURES_NONE = 0;
Jim Millerb8ec4702012-08-31 17:19:10 -07001669
1670 /**
Jim Miller50e62182014-04-23 17:25:00 -07001671 * Disable all keyguard widgets. Has no effect.
Jim Millerb8ec4702012-08-31 17:19:10 -07001672 */
Jim Miller48b9b0d2012-09-19 23:16:50 -07001673 public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1 << 0;
1674
1675 /**
1676 * Disable the camera on secure keyguard screens (e.g. PIN/Pattern/Password)
1677 */
1678 public static final int KEYGUARD_DISABLE_SECURE_CAMERA = 1 << 1;
1679
1680 /**
Jim Miller50e62182014-04-23 17:25:00 -07001681 * Disable showing all notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
1682 */
1683 public static final int KEYGUARD_DISABLE_SECURE_NOTIFICATIONS = 1 << 2;
1684
1685 /**
1686 * Only allow redacted notifications on secure keyguard screens (e.g. PIN/Pattern/Password)
1687 */
1688 public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 1 << 3;
1689
1690 /**
Adrian Roosa06d5ca2014-07-28 15:14:21 +02001691 * Ignore trust agent state on secure keyguard screens
Jim Miller50e62182014-04-23 17:25:00 -07001692 * (e.g. PIN/Pattern/Password).
1693 */
1694 public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4;
1695
1696 /**
Jim Miller06e34502014-07-17 14:46:05 -07001697 * Disable fingerprint sensor on keyguard secure screens (e.g. PIN/Pattern/Password).
1698 */
1699 public static final int KEYGUARD_DISABLE_FINGERPRINT = 1 << 5;
1700
1701 /**
Jim Miller35207742012-11-02 15:33:20 -07001702 * Disable all current and future keyguard customizations.
Jim Miller48b9b0d2012-09-19 23:16:50 -07001703 */
1704 public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff;
Jim Millerb8ec4702012-08-31 17:19:10 -07001705
1706 /**
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001707 * Called by an application that is administering the device to
Andy Stadler22dbfda2011-01-17 12:47:31 -08001708 * request that the storage system be encrypted.
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001709 *
1710 * <p>When multiple device administrators attempt to control device
1711 * encryption, the most secure, supported setting will always be
1712 * used. If any device administrator requests device encryption,
1713 * it will be enabled; Conversely, if a device administrator
1714 * attempts to disable device encryption while another
1715 * device administrator has enabled it, the call to disable will
1716 * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}).
1717 *
1718 * <p>This policy controls encryption of the secure (application data) storage area. Data
Andy Stadler50c294f2011-03-07 19:13:42 -08001719 * written to other storage areas may or may not be encrypted, and this policy does not require
1720 * or control the encryption of any other storage areas.
1721 * There is one exception: If {@link android.os.Environment#isExternalStorageEmulated()} is
1722 * {@code true}, then the directory returned by
1723 * {@link android.os.Environment#getExternalStorageDirectory()} must be written to disk
1724 * within the encrypted storage area.
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001725 *
1726 * <p>Important Note: On some devices, it is possible to encrypt storage without requiring
1727 * the user to create a device PIN or Password. In this case, the storage is encrypted, but
1728 * the encryption key may not be fully secured. For maximum security, the administrator should
1729 * also require (and check for) a pattern, PIN, or password.
1730 *
1731 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1732 * @param encrypt true to request encryption, false to release any previous request
Andy Stadler22dbfda2011-01-17 12:47:31 -08001733 * @return the new request status (for all active admins) - will be one of
1734 * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or
1735 * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use
1736 * {@link #getStorageEncryptionStatus()} to query the actual device state.
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001737 */
1738 public int setStorageEncryption(ComponentName admin, boolean encrypt) {
1739 if (mService != null) {
1740 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001741 return mService.setStorageEncryption(admin, encrypt, UserHandle.myUserId());
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001742 } catch (RemoteException e) {
1743 Log.w(TAG, "Failed talking with device policy service", e);
1744 }
1745 }
1746 return ENCRYPTION_STATUS_UNSUPPORTED;
1747 }
1748
1749 /**
1750 * Called by an application that is administering the device to
Andy Stadler22dbfda2011-01-17 12:47:31 -08001751 * determine the requested setting for secure storage.
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001752 *
Andy Stadler22dbfda2011-01-17 12:47:31 -08001753 * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null,
1754 * this will return the requested encryption setting as an aggregate of all active
1755 * administrators.
1756 * @return true if the admin(s) are requesting encryption, false if not.
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001757 */
Andy Stadler22dbfda2011-01-17 12:47:31 -08001758 public boolean getStorageEncryption(ComponentName admin) {
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001759 if (mService != null) {
1760 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001761 return mService.getStorageEncryption(admin, UserHandle.myUserId());
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001762 } catch (RemoteException e) {
1763 Log.w(TAG, "Failed talking with device policy service", e);
1764 }
1765 }
Andy Stadler22dbfda2011-01-17 12:47:31 -08001766 return false;
1767 }
1768
1769 /**
1770 * Called by an application that is administering the device to
1771 * determine the current encryption status of the device.
1772 *
1773 * Depending on the returned status code, the caller may proceed in different
1774 * ways. If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the
1775 * storage system does not support encryption. If the
1776 * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link
1777 * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the
1778 * storage. If the result is {@link #ENCRYPTION_STATUS_ACTIVATING} or
1779 * {@link #ENCRYPTION_STATUS_ACTIVE}, no further action is required.
1780 *
Robin Lee7e678712014-07-24 16:41:31 +01001781 * @return current status of encryption. The value will be one of
Andy Stadler22dbfda2011-01-17 12:47:31 -08001782 * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE},
1783 * {@link #ENCRYPTION_STATUS_ACTIVATING}, or{@link #ENCRYPTION_STATUS_ACTIVE}.
1784 */
1785 public int getStorageEncryptionStatus() {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001786 return getStorageEncryptionStatus(UserHandle.myUserId());
1787 }
1788
1789 /** @hide per-user version */
1790 public int getStorageEncryptionStatus(int userHandle) {
Andy Stadler22dbfda2011-01-17 12:47:31 -08001791 if (mService != null) {
1792 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001793 return mService.getStorageEncryptionStatus(userHandle);
Andy Stadler22dbfda2011-01-17 12:47:31 -08001794 } catch (RemoteException e) {
1795 Log.w(TAG, "Failed talking with device policy service", e);
1796 }
1797 }
Andy Stadler7b0f8f02011-01-12 14:59:52 -08001798 return ENCRYPTION_STATUS_UNSUPPORTED;
1799 }
1800
1801 /**
Robin Lee7e678712014-07-24 16:41:31 +01001802 * Installs the given certificate as a user CA.
1803 *
1804 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1805 * @param certBuffer encoded form of the certificate to install.
Maggie Benthallda51e682013-08-08 22:35:44 -04001806 *
1807 * @return false if the certBuffer cannot be parsed or installation is
Robin Lee7e678712014-07-24 16:41:31 +01001808 * interrupted, true otherwise.
Maggie Benthallda51e682013-08-08 22:35:44 -04001809 */
Robin Lee7e678712014-07-24 16:41:31 +01001810 public boolean installCaCert(ComponentName admin, byte[] certBuffer) {
Maggie Benthallda51e682013-08-08 22:35:44 -04001811 if (mService != null) {
1812 try {
Robin Lee7e678712014-07-24 16:41:31 +01001813 return mService.installCaCert(admin, certBuffer);
Maggie Benthallda51e682013-08-08 22:35:44 -04001814 } catch (RemoteException e) {
1815 Log.w(TAG, "Failed talking with device policy service", e);
1816 }
1817 }
1818 return false;
1819 }
1820
1821 /**
Robin Lee7e678712014-07-24 16:41:31 +01001822 * Uninstalls the given certificate from trusted user CAs, if present.
1823 *
1824 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1825 * @param certBuffer encoded form of the certificate to remove.
Maggie Benthallda51e682013-08-08 22:35:44 -04001826 */
Robin Lee7e678712014-07-24 16:41:31 +01001827 public void uninstallCaCert(ComponentName admin, byte[] certBuffer) {
Maggie Benthallda51e682013-08-08 22:35:44 -04001828 if (mService != null) {
1829 try {
Robin Lee306fe082014-06-19 14:04:24 +00001830 final String alias = getCaCertAlias(certBuffer);
Robin Lee7e678712014-07-24 16:41:31 +01001831 mService.uninstallCaCert(admin, alias);
Robin Lee306fe082014-06-19 14:04:24 +00001832 } catch (CertificateException e) {
1833 Log.w(TAG, "Unable to parse certificate", e);
Maggie Benthallda51e682013-08-08 22:35:44 -04001834 } catch (RemoteException e) {
1835 Log.w(TAG, "Failed talking with device policy service", e);
1836 }
1837 }
1838 }
1839
1840 /**
Robin Lee7e678712014-07-24 16:41:31 +01001841 * Returns all CA certificates that are currently trusted, excluding system CA certificates.
1842 * If a user has installed any certificates by other means than device policy these will be
1843 * included too.
1844 *
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001845 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Robin Lee7e678712014-07-24 16:41:31 +01001846 * @return a List of byte[] arrays, each encoding one user CA certificate.
Maggie Benthallda51e682013-08-08 22:35:44 -04001847 */
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001848 public List<byte[]> getInstalledCaCerts(ComponentName admin) {
Robin Lee7e678712014-07-24 16:41:31 +01001849 List<byte[]> certs = new ArrayList<byte[]>();
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001850 if (mService != null) {
Robin Lee7e678712014-07-24 16:41:31 +01001851 try {
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001852 mService.enforceCanManageCaCerts(admin);
1853 final TrustedCertificateStore certStore = new TrustedCertificateStore();
1854 for (String alias : certStore.userAliases()) {
1855 try {
1856 certs.add(certStore.getCertificate(alias).getEncoded());
1857 } catch (CertificateException ce) {
1858 Log.w(TAG, "Could not encode certificate: " + alias, ce);
1859 }
1860 }
1861 } catch (RemoteException re) {
1862 Log.w(TAG, "Failed talking with device policy service", re);
Robin Lee7e678712014-07-24 16:41:31 +01001863 }
1864 }
1865 return certs;
Maggie Benthallda51e682013-08-08 22:35:44 -04001866 }
1867
1868 /**
Robin Lee7e678712014-07-24 16:41:31 +01001869 * Uninstalls all custom trusted CA certificates from the profile. Certificates installed by
1870 * means other than device policy will also be removed, except for system CA certificates.
1871 *
1872 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1873 */
1874 public void uninstallAllUserCaCerts(ComponentName admin) {
1875 if (mService != null) {
1876 for (String alias : new TrustedCertificateStore().userAliases()) {
1877 try {
1878 mService.uninstallCaCert(admin, alias);
1879 } catch (RemoteException re) {
1880 Log.w(TAG, "Failed talking with device policy service", re);
1881 }
1882 }
1883 }
1884 }
1885
1886 /**
1887 * Returns whether this certificate is installed as a trusted CA.
1888 *
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001889 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Robin Lee7e678712014-07-24 16:41:31 +01001890 * @param certBuffer encoded form of the certificate to look up.
Maggie Benthallda51e682013-08-08 22:35:44 -04001891 */
Esteban Talavera808f6ef2014-08-28 17:15:54 +01001892 public boolean hasCaCertInstalled(ComponentName admin, byte[] certBuffer) {
1893 if (mService != null) {
1894 try {
1895 mService.enforceCanManageCaCerts(admin);
1896 return getCaCertAlias(certBuffer) != null;
1897 } catch (RemoteException re) {
1898 Log.w(TAG, "Failed talking with device policy service", re);
1899 } catch (CertificateException ce) {
1900 Log.w(TAG, "Could not parse certificate", ce);
1901 }
Maggie Benthallda51e682013-08-08 22:35:44 -04001902 }
1903 return false;
1904 }
1905
1906 /**
Bernhard Bauer26408cc2014-09-08 14:07:31 +01001907 * Called by a device or profile owner to install a certificate and private key pair. The
1908 * keypair will be visible to all apps within the profile.
1909 *
1910 * @param who Which {@link DeviceAdminReceiver} this request is associated with.
1911 * @param privKey The private key to install.
1912 * @param cert The certificate to install.
1913 * @param alias The private key alias under which to install the certificate. If a certificate
1914 * with that alias already exists, it will be overwritten.
1915 * @return {@code true} if the keys were installed, {@code false} otherwise.
1916 */
1917 public boolean installKeyPair(ComponentName who, PrivateKey privKey, Certificate cert,
1918 String alias) {
1919 try {
1920 final byte[] pemCert = Credentials.convertToPem(cert);
1921 return mService.installKeyPair(who, privKey.getEncoded(), pemCert, alias);
1922 } catch (CertificateException e) {
1923 Log.w(TAG, "Error encoding certificate", e);
1924 } catch (IOException e) {
1925 Log.w(TAG, "Error writing certificate", e);
1926 } catch (RemoteException e) {
1927 Log.w(TAG, "Failed talking with device policy service", e);
1928 }
1929 return false;
1930 }
1931
1932 /**
Robin Lee306fe082014-06-19 14:04:24 +00001933 * Returns the alias of a given CA certificate in the certificate store, or null if it
1934 * doesn't exist.
1935 */
1936 private static String getCaCertAlias(byte[] certBuffer) throws CertificateException {
1937 final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
1938 final X509Certificate cert = (X509Certificate) certFactory.generateCertificate(
1939 new ByteArrayInputStream(certBuffer));
1940 return new TrustedCertificateStore().getCertificateAlias(cert);
1941 }
1942
1943 /**
Ben Komalo2447edd2011-05-09 16:05:33 -07001944 * Called by an application that is administering the device to disable all cameras
Amith Yamasani242f4b12014-10-14 16:06:13 -07001945 * on the device, for this user. After setting this, no applications running as this user
1946 * will be able to access any cameras on the device.
Ben Komalo2447edd2011-05-09 16:05:33 -07001947 *
1948 * <p>The calling device admin must have requested
1949 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call
1950 * this method; if it has not, a security exception will be thrown.
1951 *
1952 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
1953 * @param disabled Whether or not the camera should be disabled.
1954 */
1955 public void setCameraDisabled(ComponentName admin, boolean disabled) {
1956 if (mService != null) {
1957 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001958 mService.setCameraDisabled(admin, disabled, UserHandle.myUserId());
Ben Komalo2447edd2011-05-09 16:05:33 -07001959 } catch (RemoteException e) {
1960 Log.w(TAG, "Failed talking with device policy service", e);
1961 }
1962 }
1963 }
1964
1965 /**
Amith Yamasani242f4b12014-10-14 16:06:13 -07001966 * Determine whether or not the device's cameras have been disabled for this user,
1967 * either by the current admin, if specified, or all admins.
Ben Komalo2447edd2011-05-09 16:05:33 -07001968 * @param admin The name of the admin component to check, or null to check if any admins
1969 * have disabled the camera
1970 */
1971 public boolean getCameraDisabled(ComponentName admin) {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001972 return getCameraDisabled(admin, UserHandle.myUserId());
1973 }
1974
1975 /** @hide per-user version */
1976 public boolean getCameraDisabled(ComponentName admin, int userHandle) {
Ben Komalo2447edd2011-05-09 16:05:33 -07001977 if (mService != null) {
1978 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07001979 return mService.getCameraDisabled(admin, userHandle);
Ben Komalo2447edd2011-05-09 16:05:33 -07001980 } catch (RemoteException e) {
1981 Log.w(TAG, "Failed talking with device policy service", e);
1982 }
1983 }
1984 return false;
1985 }
1986
1987 /**
Esteban Talavera1aee98f2014-08-21 14:03:55 +01001988 * Called by a device/profile owner to set whether the screen capture is disabled. Disabling
1989 * screen capture also prevents the content from being shown on display devices that do not have
1990 * a secure video output. See {@link android.view.Display#FLAG_SECURE} for more details about
1991 * secure surfaces and secure displays.
Sander Alewijnsed2a1eec2014-07-09 12:57:05 +01001992 *
1993 * <p>The calling device admin must be a device or profile owner. If it is not, a
1994 * security exception will be thrown.
1995 *
1996 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Sander Alewijnse0ced6272014-08-26 11:18:26 +01001997 * @param disabled Whether screen capture is disabled or not.
Sander Alewijnsed2a1eec2014-07-09 12:57:05 +01001998 */
1999 public void setScreenCaptureDisabled(ComponentName admin, boolean disabled) {
2000 if (mService != null) {
2001 try {
2002 mService.setScreenCaptureDisabled(admin, UserHandle.myUserId(), disabled);
2003 } catch (RemoteException e) {
2004 Log.w(TAG, "Failed talking with device policy service", e);
2005 }
2006 }
2007 }
2008
2009 /**
2010 * Determine whether or not screen capture has been disabled by the current
2011 * admin, if specified, or all admins.
2012 * @param admin The name of the admin component to check, or null to check if any admins
2013 * have disabled screen capture.
2014 */
2015 public boolean getScreenCaptureDisabled(ComponentName admin) {
2016 return getScreenCaptureDisabled(admin, UserHandle.myUserId());
2017 }
2018
2019 /** @hide per-user version */
2020 public boolean getScreenCaptureDisabled(ComponentName admin, int userHandle) {
2021 if (mService != null) {
2022 try {
2023 return mService.getScreenCaptureDisabled(admin, userHandle);
2024 } catch (RemoteException e) {
2025 Log.w(TAG, "Failed talking with device policy service", e);
2026 }
2027 }
2028 return false;
2029 }
2030
2031 /**
Sander Alewijnse0ced6272014-08-26 11:18:26 +01002032 * Called by a device owner to set whether auto time is required. If auto time is
2033 * required the user cannot set the date and time, but has to use network date and time.
2034 *
2035 * <p>Note: if auto time is required the user can still manually set the time zone.
2036 *
2037 * <p>The calling device admin must be a device owner. If it is not, a security exception will
2038 * be thrown.
2039 *
2040 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2041 * @param required Whether auto time is set required or not.
2042 */
2043 public void setAutoTimeRequired(ComponentName admin, boolean required) {
2044 if (mService != null) {
2045 try {
2046 mService.setAutoTimeRequired(admin, UserHandle.myUserId(), required);
2047 } catch (RemoteException e) {
2048 Log.w(TAG, "Failed talking with device policy service", e);
2049 }
2050 }
2051 }
2052
2053 /**
2054 * @return true if auto time is required.
2055 */
2056 public boolean getAutoTimeRequired() {
2057 if (mService != null) {
2058 try {
2059 return mService.getAutoTimeRequired();
2060 } catch (RemoteException e) {
2061 Log.w(TAG, "Failed talking with device policy service", e);
2062 }
2063 }
2064 return false;
2065 }
2066
2067 /**
Jim Miller48b9b0d2012-09-19 23:16:50 -07002068 * Called by an application that is administering the device to disable keyguard customizations,
2069 * such as widgets. After setting this, keyguard features will be disabled according to the
2070 * provided feature list.
Jim Millerb8ec4702012-08-31 17:19:10 -07002071 *
2072 * <p>The calling device admin must have requested
Jim Miller48b9b0d2012-09-19 23:16:50 -07002073 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call
Jim Millerb8ec4702012-08-31 17:19:10 -07002074 * this method; if it has not, a security exception will be thrown.
2075 *
Amith Yamasani242f4b12014-10-14 16:06:13 -07002076 * <p>Calling this from a managed profile will throw a security exception.
2077 *
Jim Millerb8ec4702012-08-31 17:19:10 -07002078 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Jim Miller35207742012-11-02 15:33:20 -07002079 * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default),
2080 * {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA},
Jim Miller50e62182014-04-23 17:25:00 -07002081 * {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS}, {@link #KEYGUARD_DISABLE_TRUST_AGENTS},
2082 * {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, {@link #KEYGUARD_DISABLE_FEATURES_ALL}
Jim Millerb8ec4702012-08-31 17:19:10 -07002083 */
Jim Miller48b9b0d2012-09-19 23:16:50 -07002084 public void setKeyguardDisabledFeatures(ComponentName admin, int which) {
Jim Millerb8ec4702012-08-31 17:19:10 -07002085 if (mService != null) {
2086 try {
Jim Miller48b9b0d2012-09-19 23:16:50 -07002087 mService.setKeyguardDisabledFeatures(admin, which, UserHandle.myUserId());
Jim Millerb8ec4702012-08-31 17:19:10 -07002088 } catch (RemoteException e) {
2089 Log.w(TAG, "Failed talking with device policy service", e);
2090 }
2091 }
2092 }
2093
2094 /**
Jim Miller48b9b0d2012-09-19 23:16:50 -07002095 * Determine whether or not features have been disabled in keyguard either by the current
Jim Millerb8ec4702012-08-31 17:19:10 -07002096 * admin, if specified, or all admins.
2097 * @param admin The name of the admin component to check, or null to check if any admins
Jim Miller48b9b0d2012-09-19 23:16:50 -07002098 * have disabled features in keyguard.
Jim Miller35207742012-11-02 15:33:20 -07002099 * @return bitfield of flags. See {@link #setKeyguardDisabledFeatures(ComponentName, int)}
2100 * for a list.
Jim Millerb8ec4702012-08-31 17:19:10 -07002101 */
Jim Miller48b9b0d2012-09-19 23:16:50 -07002102 public int getKeyguardDisabledFeatures(ComponentName admin) {
2103 return getKeyguardDisabledFeatures(admin, UserHandle.myUserId());
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002104 }
2105
2106 /** @hide per-user version */
Jim Miller48b9b0d2012-09-19 23:16:50 -07002107 public int getKeyguardDisabledFeatures(ComponentName admin, int userHandle) {
Jim Millerb8ec4702012-08-31 17:19:10 -07002108 if (mService != null) {
2109 try {
Jim Miller48b9b0d2012-09-19 23:16:50 -07002110 return mService.getKeyguardDisabledFeatures(admin, userHandle);
Jim Millerb8ec4702012-08-31 17:19:10 -07002111 } catch (RemoteException e) {
2112 Log.w(TAG, "Failed talking with device policy service", e);
2113 }
2114 }
Jim Miller48b9b0d2012-09-19 23:16:50 -07002115 return KEYGUARD_DISABLE_FEATURES_NONE;
Jim Millerb8ec4702012-08-31 17:19:10 -07002116 }
2117
2118 /**
Dianne Hackbornd6847842010-01-12 18:14:19 -08002119 * @hide
2120 */
Jessica Hummel6d36b602014-04-04 12:42:17 +01002121 public void setActiveAdmin(ComponentName policyReceiver, boolean refreshing, int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08002122 if (mService != null) {
2123 try {
Jessica Hummel6d36b602014-04-04 12:42:17 +01002124 mService.setActiveAdmin(policyReceiver, refreshing, userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -08002125 } catch (RemoteException e) {
2126 Log.w(TAG, "Failed talking with device policy service", e);
2127 }
2128 }
2129 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002130
Dianne Hackbornd6847842010-01-12 18:14:19 -08002131 /**
Jessica Hummel6d36b602014-04-04 12:42:17 +01002132 * @hide
2133 */
2134 public void setActiveAdmin(ComponentName policyReceiver, boolean refreshing) {
2135 setActiveAdmin(policyReceiver, refreshing, UserHandle.myUserId());
2136 }
2137
2138 /**
Andy Stadlerc25f70a2010-12-08 15:56:45 -08002139 * Returns the DeviceAdminInfo as defined by the administrator's package info & meta-data
Dianne Hackbornd6847842010-01-12 18:14:19 -08002140 * @hide
2141 */
Dianne Hackbornd47c6ed2010-01-27 16:21:20 -08002142 public DeviceAdminInfo getAdminInfo(ComponentName cn) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08002143 ActivityInfo ai;
2144 try {
2145 ai = mContext.getPackageManager().getReceiverInfo(cn,
2146 PackageManager.GET_META_DATA);
2147 } catch (PackageManager.NameNotFoundException e) {
2148 Log.w(TAG, "Unable to retrieve device policy " + cn, e);
2149 return null;
2150 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002151
Dianne Hackbornd6847842010-01-12 18:14:19 -08002152 ResolveInfo ri = new ResolveInfo();
2153 ri.activityInfo = ai;
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002154
Dianne Hackbornd6847842010-01-12 18:14:19 -08002155 try {
2156 return new DeviceAdminInfo(mContext, ri);
2157 } catch (XmlPullParserException e) {
2158 Log.w(TAG, "Unable to parse device policy " + cn, e);
2159 return null;
2160 } catch (IOException e) {
2161 Log.w(TAG, "Unable to parse device policy " + cn, e);
2162 return null;
2163 }
2164 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002165
Dianne Hackbornd6847842010-01-12 18:14:19 -08002166 /**
2167 * @hide
2168 */
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08002169 public void getRemoveWarning(ComponentName admin, RemoteCallback result) {
2170 if (mService != null) {
2171 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002172 mService.getRemoveWarning(admin, result, UserHandle.myUserId());
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08002173 } catch (RemoteException e) {
2174 Log.w(TAG, "Failed talking with device policy service", e);
2175 }
2176 }
2177 }
2178
2179 /**
2180 * @hide
2181 */
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07002182 public void setActivePasswordState(int quality, int length, int letters, int uppercase,
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002183 int lowercase, int numbers, int symbols, int nonletter, int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08002184 if (mService != null) {
2185 try {
Konstantin Lopyreva15dcfa2010-05-24 17:10:56 -07002186 mService.setActivePasswordState(quality, length, letters, uppercase, lowercase,
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002187 numbers, symbols, nonletter, userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -08002188 } catch (RemoteException e) {
2189 Log.w(TAG, "Failed talking with device policy service", e);
2190 }
2191 }
2192 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002193
Dianne Hackbornd6847842010-01-12 18:14:19 -08002194 /**
2195 * @hide
2196 */
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002197 public void reportFailedPasswordAttempt(int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08002198 if (mService != null) {
2199 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002200 mService.reportFailedPasswordAttempt(userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -08002201 } catch (RemoteException e) {
2202 Log.w(TAG, "Failed talking with device policy service", e);
2203 }
2204 }
2205 }
Konstantin Lopyrev32558232010-05-20 16:18:05 -07002206
Dianne Hackbornd6847842010-01-12 18:14:19 -08002207 /**
2208 * @hide
2209 */
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002210 public void reportSuccessfulPasswordAttempt(int userHandle) {
Dianne Hackbornd6847842010-01-12 18:14:19 -08002211 if (mService != null) {
2212 try {
Amith Yamasani599dd7c2012-09-14 23:20:08 -07002213 mService.reportSuccessfulPasswordAttempt(userHandle);
Dianne Hackbornd6847842010-01-12 18:14:19 -08002214 } catch (RemoteException e) {
2215 Log.w(TAG, "Failed talking with device policy service", e);
2216 }
2217 }
2218 }
Amith Yamasani71e6c692013-03-24 17:39:28 -07002219
2220 /**
2221 * @hide
2222 * Sets the given package as the device owner. The package must already be installed and there
2223 * shouldn't be an existing device owner registered, for this call to succeed. Also, this
2224 * method must be called before the device is provisioned.
2225 * @param packageName the package name of the application to be registered as the device owner.
2226 * @return whether the package was successfully registered as the device owner.
2227 * @throws IllegalArgumentException if the package name is null or invalid
2228 * @throws IllegalStateException if a device owner is already registered or the device has
2229 * already been provisioned.
2230 */
2231 public boolean setDeviceOwner(String packageName) throws IllegalArgumentException,
2232 IllegalStateException {
Geoffrey Borggaard334c7e32013-08-08 14:31:36 -04002233 return setDeviceOwner(packageName, null);
2234 }
2235
2236 /**
2237 * @hide
2238 * Sets the given package as the device owner. The package must already be installed and there
2239 * shouldn't be an existing device owner registered, for this call to succeed. Also, this
2240 * method must be called before the device is provisioned.
2241 * @param packageName the package name of the application to be registered as the device owner.
2242 * @param ownerName the human readable name of the institution that owns this device.
2243 * @return whether the package was successfully registered as the device owner.
2244 * @throws IllegalArgumentException if the package name is null or invalid
2245 * @throws IllegalStateException if a device owner is already registered or the device has
2246 * already been provisioned.
2247 */
2248 public boolean setDeviceOwner(String packageName, String ownerName)
2249 throws IllegalArgumentException, IllegalStateException {
Amith Yamasani71e6c692013-03-24 17:39:28 -07002250 if (mService != null) {
2251 try {
Geoffrey Borggaard334c7e32013-08-08 14:31:36 -04002252 return mService.setDeviceOwner(packageName, ownerName);
Amith Yamasani71e6c692013-03-24 17:39:28 -07002253 } catch (RemoteException re) {
2254 Log.w(TAG, "Failed to set device owner");
2255 }
2256 }
2257 return false;
2258 }
2259
2260 /**
Amith Yamasani3b458ad2013-04-18 18:40:07 -07002261 * Used to determine if a particular package has been registered as a Device Owner app.
2262 * A device owner app is a special device admin that cannot be deactivated by the user, once
2263 * activated as a device admin. It also cannot be uninstalled. To check if a particular
2264 * package is currently registered as the device owner app, pass in the package name from
2265 * {@link Context#getPackageName()} to this method.<p/>This is useful for device
2266 * admin apps that want to check if they are also registered as the device owner app. The
2267 * exact mechanism by which a device admin app is registered as a device owner app is defined by
2268 * the setup process.
2269 * @param packageName the package name of the app, to compare with the registered device owner
2270 * app, if any.
2271 * @return whether or not the package is registered as the device owner app.
Amith Yamasani71e6c692013-03-24 17:39:28 -07002272 */
Amith Yamasani3b458ad2013-04-18 18:40:07 -07002273 public boolean isDeviceOwnerApp(String packageName) {
Amith Yamasani71e6c692013-03-24 17:39:28 -07002274 if (mService != null) {
2275 try {
2276 return mService.isDeviceOwner(packageName);
2277 } catch (RemoteException re) {
2278 Log.w(TAG, "Failed to check device owner");
2279 }
2280 }
2281 return false;
2282 }
2283
Amith Yamasani3b458ad2013-04-18 18:40:07 -07002284 /**
2285 * @hide
2286 * Redirect to isDeviceOwnerApp.
2287 */
2288 public boolean isDeviceOwner(String packageName) {
2289 return isDeviceOwnerApp(packageName);
2290 }
2291
Jason Monkb0dced82014-06-06 14:36:20 -04002292 /**
2293 * Clears the current device owner. The caller must be the device owner.
2294 *
2295 * This function should be used cautiously as once it is called it cannot
2296 * be undone. The device owner can only be set as a part of device setup
2297 * before setup completes.
Jason Monk94d2cf92014-06-18 09:53:34 -04002298 *
2299 * @param packageName The package name of the device owner.
Jason Monkb0dced82014-06-06 14:36:20 -04002300 */
Jason Monk94d2cf92014-06-18 09:53:34 -04002301 public void clearDeviceOwnerApp(String packageName) {
Jason Monkb0dced82014-06-06 14:36:20 -04002302 if (mService != null) {
2303 try {
Jason Monk94d2cf92014-06-18 09:53:34 -04002304 mService.clearDeviceOwner(packageName);
Jason Monkb0dced82014-06-06 14:36:20 -04002305 } catch (RemoteException re) {
2306 Log.w(TAG, "Failed to clear device owner");
2307 }
2308 }
2309 }
2310
Amith Yamasani71e6c692013-03-24 17:39:28 -07002311 /** @hide */
Nicolas Prevot465acf32014-08-06 17:03:25 +01002312 @SystemApi
Amith Yamasani71e6c692013-03-24 17:39:28 -07002313 public String getDeviceOwner() {
2314 if (mService != null) {
2315 try {
2316 return mService.getDeviceOwner();
2317 } catch (RemoteException re) {
2318 Log.w(TAG, "Failed to get device owner");
2319 }
2320 }
2321 return null;
2322 }
Geoffrey Borggaard334c7e32013-08-08 14:31:36 -04002323
2324 /** @hide */
2325 public String getDeviceOwnerName() {
2326 if (mService != null) {
2327 try {
2328 return mService.getDeviceOwnerName();
2329 } catch (RemoteException re) {
2330 Log.w(TAG, "Failed to get device owner");
2331 }
2332 }
2333 return null;
2334 }
Adam Connors776c5552014-01-09 10:42:56 +00002335
2336 /**
2337 * @hide
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002338 * @deprecated Use #ACTION_SET_PROFILE_OWNER
Amith Yamasaniaba4f1b2014-07-01 15:36:12 +05302339 * Sets the given component as an active admin and registers the package as the profile
2340 * owner for this user. The package must already be installed and there shouldn't be
2341 * an existing profile owner registered for this user. Also, this method must be called
2342 * before the user setup has been completed.
2343 * <p>
2344 * This method can only be called by system apps that hold MANAGE_USERS permission and
2345 * MANAGE_DEVICE_ADMINS permission.
2346 * @param admin The component to register as an active admin and profile owner.
2347 * @param ownerName The user-visible name of the entity that is managing this user.
2348 * @return whether the admin was successfully registered as the profile owner.
2349 * @throws IllegalArgumentException if packageName is null, the package isn't installed, or
2350 * the user has already been set up.
2351 */
Justin Morey80440cc2014-07-24 09:16:35 -05002352 @SystemApi
Amith Yamasaniaba4f1b2014-07-01 15:36:12 +05302353 public boolean setActiveProfileOwner(ComponentName admin, String ownerName)
2354 throws IllegalArgumentException {
2355 if (mService != null) {
2356 try {
2357 final int myUserId = UserHandle.myUserId();
2358 mService.setActiveAdmin(admin, false, myUserId);
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002359 return mService.setProfileOwner(admin, ownerName, myUserId);
Amith Yamasaniaba4f1b2014-07-01 15:36:12 +05302360 } catch (RemoteException re) {
2361 Log.w(TAG, "Failed to set profile owner " + re);
2362 throw new IllegalArgumentException("Couldn't set profile owner.", re);
2363 }
2364 }
2365 return false;
2366 }
2367
2368 /**
2369 * @hide
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002370 * Clears the active profile owner and removes all user restrictions. The caller must
2371 * be from the same package as the active profile owner for this user, otherwise a
2372 * SecurityException will be thrown.
2373 *
2374 * @param admin The component to remove as the profile owner.
2375 * @return
2376 */
2377 @SystemApi
2378 public void clearProfileOwner(ComponentName admin) {
2379 if (mService != null) {
2380 try {
2381 mService.clearProfileOwner(admin);
2382 } catch (RemoteException re) {
2383 Log.w(TAG, "Failed to clear profile owner " + admin + re);
2384 }
2385 }
2386 }
2387
2388 /**
2389 * @hide
2390 * Checks if the user was already setup.
2391 */
2392 public boolean hasUserSetupCompleted() {
2393 if (mService != null) {
2394 try {
2395 return mService.hasUserSetupCompleted();
2396 } catch (RemoteException re) {
2397 Log.w(TAG, "Failed to check if user setup has completed");
2398 }
2399 }
2400 return true;
2401 }
2402
2403 /**
2404 * @deprecated Use setProfileOwner(ComponentName ...)
2405 * @hide
Adam Connors776c5552014-01-09 10:42:56 +00002406 * Sets the given package as the profile owner of the given user profile. The package must
2407 * already be installed and there shouldn't be an existing profile owner registered for this
2408 * user. Also, this method must be called before the user has been used for the first time.
2409 * @param packageName the package name of the application to be registered as profile owner.
2410 * @param ownerName the human readable name of the organisation associated with this DPM.
Adam Connors661ec472014-02-11 13:59:46 +00002411 * @param userHandle the userId to set the profile owner for.
Adam Connors776c5552014-01-09 10:42:56 +00002412 * @return whether the package was successfully registered as the profile owner.
2413 * @throws IllegalArgumentException if packageName is null, the package isn't installed, or
2414 * the user has already been set up.
2415 */
Adam Connors661ec472014-02-11 13:59:46 +00002416 public boolean setProfileOwner(String packageName, String ownerName, int userHandle)
Adam Connors776c5552014-01-09 10:42:56 +00002417 throws IllegalArgumentException {
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002418 if (packageName == null) {
2419 throw new NullPointerException("packageName cannot be null");
2420 }
2421 return setProfileOwner(new ComponentName(packageName, ""), ownerName, userHandle);
2422 }
2423
2424 /**
2425 * @hide
2426 * Sets the given component as the profile owner of the given user profile. The package must
2427 * already be installed and there shouldn't be an existing profile owner registered for this
2428 * user. Only the system can call this API if the user has already completed setup.
2429 * @param admin the component name to be registered as profile owner.
2430 * @param ownerName the human readable name of the organisation associated with this DPM.
2431 * @param userHandle the userId to set the profile owner for.
2432 * @return whether the component was successfully registered as the profile owner.
2433 * @throws IllegalArgumentException if admin is null, the package isn't installed, or
2434 * the user has already been set up.
2435 */
2436 public boolean setProfileOwner(ComponentName admin, String ownerName, int userHandle)
2437 throws IllegalArgumentException {
2438 if (admin == null) {
2439 throw new NullPointerException("admin cannot be null");
2440 }
Adam Connors776c5552014-01-09 10:42:56 +00002441 if (mService != null) {
2442 try {
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002443 if (ownerName == null) {
2444 ownerName = "";
2445 }
2446 return mService.setProfileOwner(admin, ownerName, userHandle);
Adam Connors776c5552014-01-09 10:42:56 +00002447 } catch (RemoteException re) {
2448 Log.w(TAG, "Failed to set profile owner", re);
2449 throw new IllegalArgumentException("Couldn't set profile owner.", re);
2450 }
2451 }
2452 return false;
2453 }
2454
2455 /**
Alexandra Gherghina512675b2014-04-02 11:23:54 +01002456 * Sets the enabled state of the profile. A profile should be enabled only once it is ready to
2457 * be used. Only the profile owner can call this.
2458 *
Alexandra Gherghinadf35d572014-04-09 13:54:39 +01002459 * @see #isProfileOwnerApp
Alexandra Gherghina512675b2014-04-02 11:23:54 +01002460 *
2461 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2462 */
2463 public void setProfileEnabled(ComponentName admin) {
2464 if (mService != null) {
2465 try {
2466 mService.setProfileEnabled(admin);
2467 } catch (RemoteException e) {
2468 Log.w(TAG, "Failed talking with device policy service", e);
2469 }
2470 }
2471 }
2472
2473 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002474 * Sets the name of the profile. In the device owner case it sets the name of the user
2475 * which it is called from. Only a profile owner or device owner can call this. If this is
Jessica Hummel1333ea12014-06-23 11:20:10 +01002476 * never called by the profile or device owner, the name will be set to default values.
2477 *
2478 * @see #isProfileOwnerApp
2479 * @see #isDeviceOwnerApp
2480 *
2481 * @param profileName The name of the profile.
2482 */
2483 public void setProfileName(ComponentName who, String profileName) {
2484 if (mService != null) {
2485 try {
2486 mService.setProfileName(who, profileName);
2487 } catch (RemoteException e) {
2488 Log.w(TAG, "Failed talking with device policy service", e);
2489 }
2490 }
2491}
2492
2493 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002494 * Used to determine if a particular package is registered as the profile owner for the
Alexandra Gherghina512675b2014-04-02 11:23:54 +01002495 * current user. A profile owner is a special device admin that has additional privileges
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002496 * within the profile.
Adam Connors776c5552014-01-09 10:42:56 +00002497 *
2498 * @param packageName The package name of the app to compare with the registered profile owner.
2499 * @return Whether or not the package is registered as the profile owner.
2500 */
2501 public boolean isProfileOwnerApp(String packageName) {
2502 if (mService != null) {
2503 try {
Nicolas Prevot90af6d72014-07-30 14:19:12 +01002504 ComponentName profileOwner = mService.getProfileOwner(
2505 Process.myUserHandle().getIdentifier());
2506 return profileOwner != null
2507 && profileOwner.getPackageName().equals(packageName);
Adam Connors776c5552014-01-09 10:42:56 +00002508 } catch (RemoteException re) {
2509 Log.w(TAG, "Failed to check profile owner");
2510 }
2511 }
2512 return false;
2513 }
2514
2515 /**
2516 * @hide
2517 * @return the packageName of the owner of the given user profile or null if no profile
2518 * owner has been set for that user.
2519 * @throws IllegalArgumentException if the userId is invalid.
2520 */
Nicolas Prevot465acf32014-08-06 17:03:25 +01002521 @SystemApi
Amith Yamasanibf3a9462014-07-28 14:26:42 -07002522 public ComponentName getProfileOwner() throws IllegalArgumentException {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +01002523 return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier());
2524 }
2525
2526 /**
2527 * @see #getProfileOwner()
2528 * @hide
2529 */
2530 public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException {
Adam Connors776c5552014-01-09 10:42:56 +00002531 if (mService != null) {
2532 try {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +01002533 return mService.getProfileOwner(userId);
Adam Connors776c5552014-01-09 10:42:56 +00002534 } catch (RemoteException re) {
2535 Log.w(TAG, "Failed to get profile owner");
2536 throw new IllegalArgumentException(
2537 "Requested profile owner for invalid userId", re);
2538 }
2539 }
2540 return null;
2541 }
2542
2543 /**
2544 * @hide
2545 * @return the human readable name of the organisation associated with this DPM or null if
2546 * one is not set.
2547 * @throws IllegalArgumentException if the userId is invalid.
2548 */
2549 public String getProfileOwnerName() throws IllegalArgumentException {
2550 if (mService != null) {
2551 try {
2552 return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier());
2553 } catch (RemoteException re) {
2554 Log.w(TAG, "Failed to get profile owner");
2555 throw new IllegalArgumentException(
2556 "Requested profile owner for invalid userId", re);
2557 }
2558 }
2559 return null;
2560 }
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002561
2562 /**
Amith Yamasani38f836b2014-08-20 14:51:15 -07002563 * @hide
2564 * @param user The user for whom to fetch the profile owner name, if any.
2565 * @return the human readable name of the organisation associated with this profile owner or
2566 * null if one is not set.
2567 * @throws IllegalArgumentException if the userId is invalid.
2568 */
2569 @SystemApi
Selim Cinek24ac55e2014-08-27 12:51:45 +02002570 public String getProfileOwnerNameAsUser(int userId) throws IllegalArgumentException {
Amith Yamasani38f836b2014-08-20 14:51:15 -07002571 if (mService != null) {
2572 try {
Selim Cinek24ac55e2014-08-27 12:51:45 +02002573 return mService.getProfileOwnerName(userId);
Amith Yamasani38f836b2014-08-20 14:51:15 -07002574 } catch (RemoteException re) {
2575 Log.w(TAG, "Failed to get profile owner");
2576 throw new IllegalArgumentException(
2577 "Requested profile owner for invalid userId", re);
2578 }
2579 }
2580 return null;
2581 }
2582
2583 /**
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002584 * Called by a profile owner or device owner to add a default intent handler activity for
2585 * intents that match a certain intent filter. This activity will remain the default intent
2586 * handler even if the set of potential event handlers for the intent filter changes and if
2587 * the intent preferences are reset.
2588 *
2589 * <p>The default disambiguation mechanism takes over if the activity is not installed
2590 * (anymore). When the activity is (re)installed, it is automatically reset as default
2591 * intent handler for the filter.
2592 *
2593 * <p>The calling device admin must be a profile owner or device owner. If it is not, a
2594 * security exception will be thrown.
2595 *
2596 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2597 * @param filter The IntentFilter for which a default handler is added.
2598 * @param activity The Activity that is added as default intent handler.
2599 */
2600 public void addPersistentPreferredActivity(ComponentName admin, IntentFilter filter,
2601 ComponentName activity) {
2602 if (mService != null) {
2603 try {
2604 mService.addPersistentPreferredActivity(admin, filter, activity);
2605 } catch (RemoteException e) {
2606 Log.w(TAG, "Failed talking with device policy service", e);
2607 }
2608 }
2609 }
2610
2611 /**
2612 * Called by a profile owner or device owner to remove all persistent intent handler preferences
Torne (Richard Coles)875e2102014-02-24 14:11:56 +00002613 * associated with the given package that were set by {@link #addPersistentPreferredActivity}.
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002614 *
2615 * <p>The calling device admin must be a profile owner. If it is not, a security
2616 * exception will be thrown.
2617 *
2618 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2619 * @param packageName The name of the package for which preferences are removed.
2620 */
2621 public void clearPackagePersistentPreferredActivities(ComponentName admin,
2622 String packageName) {
2623 if (mService != null) {
2624 try {
2625 mService.clearPackagePersistentPreferredActivities(admin, packageName);
2626 } catch (RemoteException e) {
2627 Log.w(TAG, "Failed talking with device policy service", e);
2628 }
2629 }
2630 }
Robin Lee66e5d962014-04-09 16:44:21 +01002631
2632 /**
2633 * Called by a profile or device owner to set the application restrictions for a given target
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002634 * application running in the profile.
Robin Lee66e5d962014-04-09 16:44:21 +01002635 *
2636 * <p>The provided {@link Bundle} consists of key-value pairs, where the types of values may be
Kenny Guyd00cfc52014-09-18 16:24:31 +01002637 * boolean, int, String, or String[].
Robin Lee66e5d962014-04-09 16:44:21 +01002638 *
2639 * <p>The application restrictions are only made visible to the target application and the
2640 * profile or device owner.
2641 *
Sander Alewijnse53d63dc2014-11-07 21:43:00 +00002642 * <p>If the restrictions are not available yet, but may be applied in the near future,
2643 * the admin can notify the target application of that by adding
2644 * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter.
2645 *
Robin Lee66e5d962014-04-09 16:44:21 +01002646 * <p>The calling device admin must be a profile or device owner; if it is not, a security
2647 * exception will be thrown.
2648 *
2649 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2650 * @param packageName The name of the package to update restricted settings for.
2651 * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new
2652 * set of active restrictions.
Sander Alewijnse53d63dc2014-11-07 21:43:00 +00002653 *
2654 * @see UserManager#KEY_RESTRICTIONS_PENDING
Robin Lee66e5d962014-04-09 16:44:21 +01002655 */
2656 public void setApplicationRestrictions(ComponentName admin, String packageName,
2657 Bundle settings) {
2658 if (mService != null) {
2659 try {
2660 mService.setApplicationRestrictions(admin, packageName, settings);
2661 } catch (RemoteException e) {
2662 Log.w(TAG, "Failed talking with device policy service", e);
2663 }
2664 }
2665 }
2666
2667 /**
Jim Millere303bf42014-08-26 17:12:29 -07002668 * Sets a list of configuration features to enable for a TrustAgent component. This is meant
2669 * to be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all
2670 * trust agents but those enabled by this function call. If flag
2671 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is not set, then this call has no effect.
Jim Miller604e7552014-07-18 19:00:02 -07002672 *
2673 * <p>The calling device admin must have requested
2674 * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call
Jim Millere303bf42014-08-26 17:12:29 -07002675 * this method; if not, a security exception will be thrown.
Jim Miller604e7552014-07-18 19:00:02 -07002676 *
2677 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Jim Millere303bf42014-08-26 17:12:29 -07002678 * @param target Component name of the agent to be enabled.
2679 * @param options TrustAgent-specific feature bundle. If null for any admin, agent
2680 * will be strictly disabled according to the state of the
2681 * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag.
2682 * <p>If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all admins,
2683 * then it's up to the TrustAgent itself to aggregate the values from all device admins.
2684 * <p>Consult documentation for the specific TrustAgent to determine legal options parameters.
Jim Miller604e7552014-07-18 19:00:02 -07002685 */
Jim Millere303bf42014-08-26 17:12:29 -07002686 public void setTrustAgentConfiguration(ComponentName admin, ComponentName target,
2687 PersistableBundle options) {
Jim Miller604e7552014-07-18 19:00:02 -07002688 if (mService != null) {
2689 try {
Jim Millere303bf42014-08-26 17:12:29 -07002690 mService.setTrustAgentConfiguration(admin, target, options, UserHandle.myUserId());
Jim Miller604e7552014-07-18 19:00:02 -07002691 } catch (RemoteException e) {
2692 Log.w(TAG, "Failed talking with device policy service", e);
2693 }
2694 }
2695 }
2696
2697 /**
Jim Millere303bf42014-08-26 17:12:29 -07002698 * Gets configuration for the given trust agent based on aggregating all calls to
2699 * {@link #setTrustAgentConfiguration(ComponentName, ComponentName, PersistableBundle)} for
2700 * all device admins.
Jim Miller604e7552014-07-18 19:00:02 -07002701 *
2702 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2703 * @param agent Which component to get enabled features for.
Jim Millere303bf42014-08-26 17:12:29 -07002704 * @return configuration for the given trust agent.
Jim Miller604e7552014-07-18 19:00:02 -07002705 */
Jim Millere303bf42014-08-26 17:12:29 -07002706 public List<PersistableBundle> getTrustAgentConfiguration(ComponentName admin,
2707 ComponentName agent) {
2708 return getTrustAgentConfiguration(admin, agent, UserHandle.myUserId());
2709 }
2710
2711 /** @hide per-user version */
2712 public List<PersistableBundle> getTrustAgentConfiguration(ComponentName admin,
2713 ComponentName agent, int userHandle) {
Jim Miller604e7552014-07-18 19:00:02 -07002714 if (mService != null) {
2715 try {
Jim Millere303bf42014-08-26 17:12:29 -07002716 return mService.getTrustAgentConfiguration(admin, agent, userHandle);
Jim Miller604e7552014-07-18 19:00:02 -07002717 } catch (RemoteException e) {
2718 Log.w(TAG, "Failed talking with device policy service", e);
2719 }
2720 }
Jim Millere303bf42014-08-26 17:12:29 -07002721 return new ArrayList<PersistableBundle>(); // empty list
Jim Miller604e7552014-07-18 19:00:02 -07002722 }
2723
2724 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002725 * Called by a profile owner of a managed profile to set whether caller-Id information from
2726 * the managed profile will be shown in the parent profile, for incoming calls.
Adam Connors210fe212014-07-17 15:41:43 +01002727 *
2728 * <p>The calling device admin must be a profile owner. If it is not, a
2729 * security exception will be thrown.
2730 *
2731 * @param who Which {@link DeviceAdminReceiver} this request is associated with.
2732 * @param disabled If true caller-Id information in the managed profile is not displayed.
2733 */
2734 public void setCrossProfileCallerIdDisabled(ComponentName who, boolean disabled) {
2735 if (mService != null) {
2736 try {
2737 mService.setCrossProfileCallerIdDisabled(who, disabled);
2738 } catch (RemoteException e) {
2739 Log.w(TAG, "Failed talking with device policy service", e);
2740 }
2741 }
2742 }
2743
2744 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002745 * Called by a profile owner of a managed profile to determine whether or not caller-Id
2746 * information has been disabled.
Adam Connors210fe212014-07-17 15:41:43 +01002747 *
2748 * <p>The calling device admin must be a profile owner. If it is not, a
2749 * security exception will be thrown.
2750 *
2751 * @param who Which {@link DeviceAdminReceiver} this request is associated with.
2752 */
2753 public boolean getCrossProfileCallerIdDisabled(ComponentName who) {
2754 if (mService != null) {
2755 try {
2756 return mService.getCrossProfileCallerIdDisabled(who);
2757 } catch (RemoteException e) {
2758 Log.w(TAG, "Failed talking with device policy service", e);
2759 }
2760 }
2761 return false;
2762 }
2763
2764 /**
Amith Yamasani570002f2014-07-18 15:48:54 -07002765 * Determine whether or not caller-Id information has been disabled.
2766 *
2767 * @param userHandle The user for whom to check the caller-id permission
2768 * @hide
2769 */
2770 public boolean getCrossProfileCallerIdDisabled(UserHandle userHandle) {
2771 if (mService != null) {
2772 try {
2773 return mService.getCrossProfileCallerIdDisabledForUser(userHandle.getIdentifier());
2774 } catch (RemoteException e) {
2775 Log.w(TAG, "Failed talking with device policy service", e);
2776 }
2777 }
2778 return false;
2779 }
2780
2781 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002782 * Called by the profile owner of a managed profile so that some intents sent in the managed
2783 * profile can also be resolved in the parent, or vice versa.
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002784 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Nicolas Prevot81948992014-05-16 18:25:26 +01002785 * @param filter The {@link IntentFilter} the intent has to match to be also resolved in the
2786 * other profile
Nicolas Prevot41d926e2014-06-09 11:48:56 +01002787 * @param flags {@link DevicePolicyManager#FLAG_MANAGED_CAN_ACCESS_PARENT} and
2788 * {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported.
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002789 */
Nicolas Prevot81948992014-05-16 18:25:26 +01002790 public void addCrossProfileIntentFilter(ComponentName admin, IntentFilter filter, int flags) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002791 if (mService != null) {
2792 try {
Nicolas Prevot81948992014-05-16 18:25:26 +01002793 mService.addCrossProfileIntentFilter(admin, filter, flags);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002794 } catch (RemoteException e) {
2795 Log.w(TAG, "Failed talking with device policy service", e);
2796 }
2797 }
2798 }
2799
2800 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07002801 * Called by a profile owner of a managed profile to remove the cross-profile intent filters
2802 * that go from the managed profile to the parent, or from the parent to the managed profile.
Nicolas Prevot3f7777f2014-07-24 15:58:39 +01002803 * Only removes those that have been set by the profile owner.
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002804 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2805 */
Nicolas Prevot81948992014-05-16 18:25:26 +01002806 public void clearCrossProfileIntentFilters(ComponentName admin) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002807 if (mService != null) {
2808 try {
Nicolas Prevot81948992014-05-16 18:25:26 +01002809 mService.clearCrossProfileIntentFilters(admin);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002810 } catch (RemoteException e) {
2811 Log.w(TAG, "Failed talking with device policy service", e);
2812 }
2813 }
2814 }
2815
2816 /**
Kenny Guyfa80a4f2014-08-20 19:40:59 +01002817 * Called by a profile or device owner to set the permitted accessibility services. When
2818 * set by a device owner or profile owner the restriction applies to all profiles of the
2819 * user the device owner or profile owner is an admin for.
Jim Millerb1474f42014-08-26 18:42:58 -07002820 *
Kenny Guyfa80a4f2014-08-20 19:40:59 +01002821 * By default the user can use any accessiblity service. When zero or more packages have
2822 * been added, accessiblity services that are not in the list and not part of the system
Jim Millerb1474f42014-08-26 18:42:58 -07002823 * can not be enabled by the user.
Kenny Guyfa80a4f2014-08-20 19:40:59 +01002824 *
2825 * <p> Calling with a null value for the list disables the restriction so that all services
2826 * can be used, calling with an empty list only allows the builtin system's services.
2827 *
2828 * <p> System accesibility services are always available to the user the list can't modify
2829 * this.
2830 *
2831 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2832 * @param packageNames List of accessibility service package names.
2833 *
2834 * @return true if setting the restriction succeeded. It fail if there is
2835 * one or more non-system accessibility services enabled, that are not in the list.
2836 */
2837 public boolean setPermittedAccessibilityServices(ComponentName admin,
2838 List<String> packageNames) {
2839 if (mService != null) {
2840 try {
2841 return mService.setPermittedAccessibilityServices(admin, packageNames);
2842 } catch (RemoteException e) {
2843 Log.w(TAG, "Failed talking with device policy service", e);
2844 }
2845 }
2846 return false;
2847 }
2848
2849 /**
2850 * Returns the list of permitted accessibility services set by this device or profile owner.
2851 *
2852 * <p>An empty list means no accessibility services except system services are allowed.
2853 * Null means all accessibility services are allowed.
2854 *
2855 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2856 * @return List of accessiblity service package names.
2857 */
2858 public List<String> getPermittedAccessibilityServices(ComponentName admin) {
2859 if (mService != null) {
2860 try {
2861 return mService.getPermittedAccessibilityServices(admin);
2862 } catch (RemoteException e) {
2863 Log.w(TAG, "Failed talking with device policy service", e);
2864 }
2865 }
2866 return null;
2867 }
2868
2869 /**
2870 * Returns the list of accessibility services permitted by the device or profiles
2871 * owners of this user.
2872 *
2873 * <p>Null means all accessibility services are allowed, if a non-null list is returned
2874 * it will contain the intersection of the permitted lists for any device or profile
2875 * owners that apply to this user. It will also include any system accessibility services.
2876 *
2877 * @param userId which user to check for.
2878 * @return List of accessiblity service package names.
2879 * @hide
2880 */
2881 @SystemApi
2882 public List<String> getPermittedAccessibilityServices(int userId) {
2883 if (mService != null) {
2884 try {
2885 return mService.getPermittedAccessibilityServicesForUser(userId);
2886 } catch (RemoteException e) {
2887 Log.w(TAG, "Failed talking with device policy service", e);
2888 }
2889 }
2890 return null;
2891 }
2892
2893 /**
2894 * Called by a profile or device owner to set the permitted input methods services. When
2895 * set by a device owner or profile owner the restriction applies to all profiles of the
2896 * user the device owner or profile owner is an admin for.
2897 *
2898 * By default the user can use any input method. When zero or more packages have
2899 * been added, input method that are not in the list and not part of the system
2900 * can not be enabled by the user.
2901 *
2902 * This method will fail if it is called for a admin that is not for the foreground user
2903 * or a profile of the foreground user.
2904 *
2905 * <p> Calling with a null value for the list disables the restriction so that all input methods
2906 * can be used, calling with an empty list disables all but the system's own input methods.
2907 *
2908 * <p> System input methods are always available to the user this method can't modify this.
2909 *
2910 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2911 * @param packageNames List of input method package names.
2912 * @return true if setting the restriction succeeded. It will fail if there is
2913 * one or more input method enabled, that are not in the list or user if the foreground
2914 * user.
2915 */
2916 public boolean setPermittedInputMethods(ComponentName admin, List<String> packageNames) {
2917 if (mService != null) {
2918 try {
2919 return mService.setPermittedInputMethods(admin, packageNames);
2920 } catch (RemoteException e) {
2921 Log.w(TAG, "Failed talking with device policy service", e);
2922 }
2923 }
2924 return false;
2925 }
2926
2927
2928 /**
2929 * Returns the list of permitted input methods set by this device or profile owner.
2930 *
2931 * <p>An empty list means no input methods except system input methods are allowed.
2932 * Null means all input methods are allowed.
2933 *
2934 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2935 * @return List of input method package names.
2936 */
2937 public List<String> getPermittedInputMethods(ComponentName admin) {
2938 if (mService != null) {
2939 try {
2940 return mService.getPermittedInputMethods(admin);
2941 } catch (RemoteException e) {
2942 Log.w(TAG, "Failed talking with device policy service", e);
2943 }
2944 }
2945 return null;
2946 }
2947
2948 /**
2949 * Returns the list of input methods permitted by the device or profiles
2950 * owners of the current user.
2951 *
2952 * <p>Null means all input methods are allowed, if a non-null list is returned
2953 * it will contain the intersection of the permitted lists for any device or profile
2954 * owners that apply to this user. It will also include any system input methods.
2955 *
2956 * @return List of input method package names.
2957 * @hide
2958 */
2959 @SystemApi
2960 public List<String> getPermittedInputMethodsForCurrentUser() {
2961 if (mService != null) {
2962 try {
2963 return mService.getPermittedInputMethodsForCurrentUser();
2964 } catch (RemoteException e) {
2965 Log.w(TAG, "Failed talking with device policy service", e);
2966 }
2967 }
2968 return null;
2969 }
2970
2971 /**
Julia Reynolds1e958392014-05-16 14:25:21 -04002972 * Called by a device owner to create a user with the specified name. The UserHandle returned
2973 * by this method should not be persisted as user handles are recycled as users are removed and
2974 * created. If you need to persist an identifier for this user, use
2975 * {@link UserManager#getSerialNumberForUser}.
2976 *
2977 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
2978 * @param name the user's name
2979 * @see UserHandle
2980 * @return the UserHandle object for the created user, or null if the user could not be created.
2981 */
2982 public UserHandle createUser(ComponentName admin, String name) {
2983 try {
2984 return mService.createUser(admin, name);
2985 } catch (RemoteException re) {
2986 Log.w(TAG, "Could not create a user", re);
2987 }
2988 return null;
2989 }
2990
2991 /**
Jason Monk03978a42014-06-10 15:05:30 -04002992 * Called by a device owner to create a user with the specified name. The UserHandle returned
2993 * by this method should not be persisted as user handles are recycled as users are removed and
2994 * created. If you need to persist an identifier for this user, use
2995 * {@link UserManager#getSerialNumberForUser}. The new user will be started in the background
2996 * immediately.
2997 *
2998 * <p> profileOwnerComponent is the {@link DeviceAdminReceiver} to be the profile owner as well
2999 * as registered as an active admin on the new user. The profile owner package will be
3000 * installed on the new user if it already is installed on the device.
3001 *
3002 * <p>If the optionalInitializeData is not null, then the extras will be passed to the
3003 * profileOwnerComponent when onEnable is called.
3004 *
3005 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3006 * @param name the user's name
3007 * @param ownerName the human readable name of the organisation associated with this DPM.
3008 * @param profileOwnerComponent The {@link DeviceAdminReceiver} that will be an active admin on
3009 * the user.
3010 * @param adminExtras Extras that will be passed to onEnable of the admin receiver
3011 * on the new user.
3012 * @see UserHandle
3013 * @return the UserHandle object for the created user, or null if the user could not be created.
3014 */
3015 public UserHandle createAndInitializeUser(ComponentName admin, String name, String ownerName,
3016 ComponentName profileOwnerComponent, Bundle adminExtras) {
3017 try {
3018 return mService.createAndInitializeUser(admin, name, ownerName, profileOwnerComponent,
3019 adminExtras);
3020 } catch (RemoteException re) {
3021 Log.w(TAG, "Could not create a user", re);
3022 }
3023 return null;
3024 }
3025
3026 /**
Julia Reynolds1e958392014-05-16 14:25:21 -04003027 * Called by a device owner to remove a user and all associated data. The primary user can
3028 * not be removed.
3029 *
3030 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3031 * @param userHandle the user to remove.
3032 * @return {@code true} if the user was removed, {@code false} otherwise.
3033 */
3034 public boolean removeUser(ComponentName admin, UserHandle userHandle) {
3035 try {
3036 return mService.removeUser(admin, userHandle);
3037 } catch (RemoteException re) {
3038 Log.w(TAG, "Could not remove user ", re);
3039 return false;
3040 }
3041 }
3042
3043 /**
Jason Monk582d9112014-07-09 19:57:08 -04003044 * Called by a device owner to switch the specified user to the foreground.
3045 *
3046 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3047 * @param userHandle the user to switch to; null will switch to primary.
3048 * @return {@code true} if the switch was successful, {@code false} otherwise.
3049 *
3050 * @see Intent#ACTION_USER_FOREGROUND
3051 */
3052 public boolean switchUser(ComponentName admin, UserHandle userHandle) {
3053 try {
3054 return mService.switchUser(admin, userHandle);
3055 } catch (RemoteException re) {
3056 Log.w(TAG, "Could not switch user ", re);
3057 return false;
3058 }
3059 }
3060
3061 /**
Robin Lee66e5d962014-04-09 16:44:21 +01003062 * Called by a profile or device owner to get the application restrictions for a given target
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003063 * application running in the profile.
Robin Lee66e5d962014-04-09 16:44:21 +01003064 *
3065 * <p>The calling device admin must be a profile or device owner; if it is not, a security
3066 * exception will be thrown.
3067 *
3068 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3069 * @param packageName The name of the package to fetch restricted settings of.
3070 * @return {@link Bundle} of settings corresponding to what was set last time
3071 * {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty {@link Bundle}
3072 * if no restrictions have been set.
3073 */
3074 public Bundle getApplicationRestrictions(ComponentName admin, String packageName) {
3075 if (mService != null) {
3076 try {
3077 return mService.getApplicationRestrictions(admin, packageName);
3078 } catch (RemoteException e) {
3079 Log.w(TAG, "Failed talking with device policy service", e);
3080 }
3081 }
3082 return null;
3083 }
Amith Yamasanibe465322014-04-24 13:45:17 -07003084
3085 /**
3086 * Called by a profile or device owner to set a user restriction specified
3087 * by the key.
3088 * <p>
3089 * The calling device admin must be a profile or device owner; if it is not,
3090 * a security exception will be thrown.
Jim Millerdf2258b2014-04-27 20:10:26 -07003091 *
Amith Yamasanibe465322014-04-24 13:45:17 -07003092 * @param admin Which {@link DeviceAdminReceiver} this request is associated
3093 * with.
3094 * @param key The key of the restriction. See the constants in
3095 * {@link android.os.UserManager} for the list of keys.
3096 */
3097 public void addUserRestriction(ComponentName admin, String key) {
3098 if (mService != null) {
3099 try {
3100 mService.setUserRestriction(admin, key, true);
3101 } catch (RemoteException e) {
3102 Log.w(TAG, "Failed talking with device policy service", e);
3103 }
3104 }
3105 }
3106
3107 /**
3108 * Called by a profile or device owner to clear a user restriction specified
3109 * by the key.
3110 * <p>
3111 * The calling device admin must be a profile or device owner; if it is not,
3112 * a security exception will be thrown.
Jim Millerdf2258b2014-04-27 20:10:26 -07003113 *
Amith Yamasanibe465322014-04-24 13:45:17 -07003114 * @param admin Which {@link DeviceAdminReceiver} this request is associated
3115 * with.
3116 * @param key The key of the restriction. See the constants in
3117 * {@link android.os.UserManager} for the list of keys.
3118 */
3119 public void clearUserRestriction(ComponentName admin, String key) {
3120 if (mService != null) {
3121 try {
3122 mService.setUserRestriction(admin, key, false);
3123 } catch (RemoteException e) {
3124 Log.w(TAG, "Failed talking with device policy service", e);
3125 }
3126 }
3127 }
Adam Connors010cfd42014-04-16 12:48:13 +01003128
3129 /**
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003130 * Called by device or profile owner to hide or unhide packages. When a package is hidden it
Julia Reynolds966881e2014-05-14 12:23:08 -04003131 * is unavailable for use, but the data and actual package file remain.
3132 *
3133 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003134 * @param packageName The name of the package to hide or unhide.
3135 * @param hidden {@code true} if the package should be hidden, {@code false} if it should be
3136 * unhidden.
3137 * @return boolean Whether the hidden setting of the package was successfully updated.
Julia Reynolds966881e2014-05-14 12:23:08 -04003138 */
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003139 public boolean setApplicationHidden(ComponentName admin, String packageName,
3140 boolean hidden) {
Julia Reynolds966881e2014-05-14 12:23:08 -04003141 if (mService != null) {
3142 try {
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003143 return mService.setApplicationHidden(admin, packageName, hidden);
Julia Reynolds966881e2014-05-14 12:23:08 -04003144 } catch (RemoteException e) {
3145 Log.w(TAG, "Failed talking with device policy service", e);
3146 }
3147 }
3148 return false;
3149 }
3150
3151 /**
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003152 * Called by device or profile owner to determine if a package is hidden.
Julia Reynolds966881e2014-05-14 12:23:08 -04003153 *
3154 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003155 * @param packageName The name of the package to retrieve the hidden status of.
3156 * @return boolean {@code true} if the package is hidden, {@code false} otherwise.
Julia Reynolds966881e2014-05-14 12:23:08 -04003157 */
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003158 public boolean isApplicationHidden(ComponentName admin, String packageName) {
Julia Reynolds966881e2014-05-14 12:23:08 -04003159 if (mService != null) {
3160 try {
Amith Yamasanie5bcff62014-07-19 15:44:09 -07003161 return mService.isApplicationHidden(admin, packageName);
Julia Reynolds966881e2014-05-14 12:23:08 -04003162 } catch (RemoteException e) {
3163 Log.w(TAG, "Failed talking with device policy service", e);
3164 }
3165 }
3166 return false;
3167 }
3168
3169 /**
Adam Connors655be2a2014-07-14 09:01:25 +00003170 * Called by profile or device owner to re-enable a system app that was disabled by default
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003171 * when the user was initialized.
Adam Connors655be2a2014-07-14 09:01:25 +00003172 *
3173 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3174 * @param packageName The package to be re-enabled in the current profile.
3175 */
3176 public void enableSystemApp(ComponentName admin, String packageName) {
3177 if (mService != null) {
3178 try {
3179 mService.enableSystemApp(admin, packageName);
3180 } catch (RemoteException e) {
3181 Log.w(TAG, "Failed to install package: " + packageName);
3182 }
3183 }
3184 }
3185
3186 /**
3187 * Called by profile or device owner to re-enable system apps by intent that were disabled
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003188 * by default when the user was initialized.
Adam Connors655be2a2014-07-14 09:01:25 +00003189 *
3190 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3191 * @param intent An intent matching the app(s) to be installed. All apps that resolve for this
3192 * intent will be re-enabled in the current profile.
3193 * @return int The number of activities that matched the intent and were installed.
3194 */
3195 public int enableSystemApp(ComponentName admin, Intent intent) {
3196 if (mService != null) {
3197 try {
3198 return mService.enableSystemAppWithIntent(admin, intent);
3199 } catch (RemoteException e) {
3200 Log.w(TAG, "Failed to install packages matching filter: " + intent);
3201 }
3202 }
3203 return 0;
3204 }
3205
3206 /**
Sander Alewijnse112e0532014-10-29 13:28:49 +00003207 * Called by a device owner or profile owner to disable account management for a specific type
3208 * of account.
Sander Alewijnse650c3342014-05-08 18:00:50 +01003209 *
Sander Alewijnse112e0532014-10-29 13:28:49 +00003210 * <p>The calling device admin must be a device owner or profile owner. If it is not, a
Sander Alewijnse650c3342014-05-08 18:00:50 +01003211 * security exception will be thrown.
3212 *
3213 * <p>When account management is disabled for an account type, adding or removing an account
3214 * of that type will not be possible.
3215 *
3216 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3217 * @param accountType For which account management is disabled or enabled.
3218 * @param disabled The boolean indicating that account management will be disabled (true) or
3219 * enabled (false).
3220 */
3221 public void setAccountManagementDisabled(ComponentName admin, String accountType,
3222 boolean disabled) {
3223 if (mService != null) {
3224 try {
3225 mService.setAccountManagementDisabled(admin, accountType, disabled);
3226 } catch (RemoteException e) {
3227 Log.w(TAG, "Failed talking with device policy service", e);
3228 }
3229 }
3230 }
3231
3232 /**
Sander Alewijnse5c02db62014-05-07 10:46:57 +01003233 * Gets the array of accounts for which account management is disabled by the profile owner.
3234 *
3235 * <p> Account management can be disabled/enabled by calling
3236 * {@link #setAccountManagementDisabled}.
3237 *
3238 * @return a list of account types for which account management has been disabled.
3239 *
3240 * @see #setAccountManagementDisabled
3241 */
3242 public String[] getAccountTypesWithManagementDisabled() {
Zoltan Szatmary-Ban3f1ddf82014-07-02 16:42:05 +01003243 return getAccountTypesWithManagementDisabledAsUser(UserHandle.myUserId());
Alexandra Gherghina999d3942014-07-03 11:40:08 +01003244 }
3245
3246 /**
3247 * @see #getAccountTypesWithManagementDisabled()
3248 * @hide
3249 */
3250 public String[] getAccountTypesWithManagementDisabledAsUser(int userId) {
Sander Alewijnse5c02db62014-05-07 10:46:57 +01003251 if (mService != null) {
3252 try {
Alexandra Gherghina999d3942014-07-03 11:40:08 +01003253 return mService.getAccountTypesWithManagementDisabledAsUser(userId);
Sander Alewijnse5c02db62014-05-07 10:46:57 +01003254 } catch (RemoteException e) {
3255 Log.w(TAG, "Failed talking with device policy service", e);
3256 }
3257 }
3258
3259 return null;
3260 }
justinzhang511e0d82014-03-24 16:09:24 -04003261
3262 /**
Jason Monkd7b86212014-06-16 13:15:38 -04003263 * Sets which packages may enter lock task mode.
3264 *
3265 * <p>Any packages that shares uid with an allowed package will also be allowed
3266 * to activate lock task.
justinzhang511e0d82014-03-24 16:09:24 -04003267 *
Jason Monkc5185f22014-06-24 11:12:42 -04003268 * This function can only be called by the device owner.
Jason Monkd7b86212014-06-16 13:15:38 -04003269 * @param packages The list of packages allowed to enter lock task mode
Jason Monk48aacba2014-08-13 16:29:08 -04003270 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Jason Monkd7b86212014-06-16 13:15:38 -04003271 *
3272 * @see Activity#startLockTask()
Jason Monk1c7c3192014-06-26 12:52:18 -04003273 * @see DeviceAdminReceiver#onLockTaskModeChanged(Context, Intent, boolean, String)
3274 * @see UserManager#DISALLOW_CREATE_WINDOWS
justinzhang511e0d82014-03-24 16:09:24 -04003275 */
Jason Monk48aacba2014-08-13 16:29:08 -04003276 public void setLockTaskPackages(ComponentName admin, String[] packages)
3277 throws SecurityException {
justinzhang511e0d82014-03-24 16:09:24 -04003278 if (mService != null) {
3279 try {
Jason Monk48aacba2014-08-13 16:29:08 -04003280 mService.setLockTaskPackages(admin, packages);
justinzhang511e0d82014-03-24 16:09:24 -04003281 } catch (RemoteException e) {
3282 Log.w(TAG, "Failed talking with device policy service", e);
3283 }
3284 }
3285 }
3286
3287 /**
Jason Monkd7b86212014-06-16 13:15:38 -04003288 * This function returns the list of packages allowed to start the lock task mode.
Jason Monk48aacba2014-08-13 16:29:08 -04003289 *
3290 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
justinzhang511e0d82014-03-24 16:09:24 -04003291 * @hide
3292 */
Jason Monk48aacba2014-08-13 16:29:08 -04003293 public String[] getLockTaskPackages(ComponentName admin) {
justinzhang511e0d82014-03-24 16:09:24 -04003294 if (mService != null) {
3295 try {
Jason Monk48aacba2014-08-13 16:29:08 -04003296 return mService.getLockTaskPackages(admin);
justinzhang511e0d82014-03-24 16:09:24 -04003297 } catch (RemoteException e) {
3298 Log.w(TAG, "Failed talking with device policy service", e);
3299 }
3300 }
3301 return null;
3302 }
3303
3304 /**
3305 * This function lets the caller know whether the given component is allowed to start the
3306 * lock task mode.
Jason Monkd7b86212014-06-16 13:15:38 -04003307 * @param pkg The package to check
justinzhang511e0d82014-03-24 16:09:24 -04003308 */
Jason Monkd7b86212014-06-16 13:15:38 -04003309 public boolean isLockTaskPermitted(String pkg) {
justinzhang511e0d82014-03-24 16:09:24 -04003310 if (mService != null) {
3311 try {
Jason Monkd7b86212014-06-16 13:15:38 -04003312 return mService.isLockTaskPermitted(pkg);
justinzhang511e0d82014-03-24 16:09:24 -04003313 } catch (RemoteException e) {
3314 Log.w(TAG, "Failed talking with device policy service", e);
3315 }
3316 }
3317 return false;
3318 }
Julia Reynoldsda551652014-05-14 17:15:16 -04003319
3320 /**
3321 * Called by device owners to update {@link Settings.Global} settings. Validation that the value
3322 * of the setting is in the correct form for the setting type should be performed by the caller.
Julia Reynolds9ed66da2014-08-26 15:42:03 -04003323 * <p>The settings that can be updated with this method are:
3324 * <ul>
3325 * <li>{@link Settings.Global#ADB_ENABLED}</li>
3326 * <li>{@link Settings.Global#AUTO_TIME}</li>
3327 * <li>{@link Settings.Global#AUTO_TIME_ZONE}</li>
3328 * <li>{@link Settings.Global#BLUETOOTH_ON}</li>
3329 * <li>{@link Settings.Global#DATA_ROAMING}</li>
3330 * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
3331 * <li>{@link Settings.Global#MODE_RINGER}</li>
3332 * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
3333 * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
3334 * <li>{@link Settings.Global#WIFI_ON}</li>
3335 * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li>
3336 * </ul>
Julia Reynoldsda551652014-05-14 17:15:16 -04003337 *
3338 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3339 * @param setting The name of the setting to update.
3340 * @param value The value to update the setting to.
3341 */
3342 public void setGlobalSetting(ComponentName admin, String setting, String value) {
3343 if (mService != null) {
3344 try {
3345 mService.setGlobalSetting(admin, setting, value);
3346 } catch (RemoteException e) {
3347 Log.w(TAG, "Failed talking with device policy service", e);
3348 }
3349 }
3350 }
3351
3352 /**
3353 * Called by profile or device owners to update {@link Settings.Secure} settings. Validation
3354 * that the value of the setting is in the correct form for the setting type should be performed
3355 * by the caller.
Julia Reynolds82735bc2014-09-04 16:43:30 -04003356 * <p>The settings that can be updated by a profile or device owner with this method are:
Julia Reynolds9ed66da2014-08-26 15:42:03 -04003357 * <ul>
3358 * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
Amith Yamasani52c39a12014-10-21 11:14:04 -07003359 * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li>
Julia Reynolds9ed66da2014-08-26 15:42:03 -04003360 * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
3361 * </ul>
Julia Reynolds82735bc2014-09-04 16:43:30 -04003362 * <p>A device owner can additionally update the following settings:
3363 * <ul>
3364 * <li>{@link Settings.Secure#LOCATION_MODE}</li>
3365 * </ul>
Julia Reynoldsda551652014-05-14 17:15:16 -04003366 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3367 * @param setting The name of the setting to update.
3368 * @param value The value to update the setting to.
3369 */
3370 public void setSecureSetting(ComponentName admin, String setting, String value) {
3371 if (mService != null) {
3372 try {
3373 mService.setSecureSetting(admin, setting, value);
3374 } catch (RemoteException e) {
3375 Log.w(TAG, "Failed talking with device policy service", e);
3376 }
3377 }
3378 }
3379
Amith Yamasanif20d6402014-05-24 15:34:37 -07003380 /**
Amith Yamasanif6e2fcc2014-07-10 13:41:55 -07003381 * Designates a specific service component as the provider for
Amith Yamasanif20d6402014-05-24 15:34:37 -07003382 * making permission requests of a local or remote administrator of the user.
3383 * <p/>
3384 * Only a profile owner can designate the restrictions provider.
3385 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
Amith Yamasanif6e2fcc2014-07-10 13:41:55 -07003386 * @param provider The component name of the service that implements
Amith Yamasanid1d7c022014-08-19 17:03:41 -07003387 * {@link RestrictionsReceiver}. If this param is null,
Amith Yamasanif20d6402014-05-24 15:34:37 -07003388 * it removes the restrictions provider previously assigned.
3389 */
Amith Yamasanif6e2fcc2014-07-10 13:41:55 -07003390 public void setRestrictionsProvider(ComponentName admin, ComponentName provider) {
Amith Yamasanif20d6402014-05-24 15:34:37 -07003391 if (mService != null) {
3392 try {
Amith Yamasanif6e2fcc2014-07-10 13:41:55 -07003393 mService.setRestrictionsProvider(admin, provider);
Amith Yamasanif20d6402014-05-24 15:34:37 -07003394 } catch (RemoteException re) {
3395 Log.w(TAG, "Failed to set permission provider on device policy service");
3396 }
3397 }
3398 }
Julia Reynolds4a21b252014-06-04 11:11:43 -04003399
3400 /**
3401 * Called by profile or device owners to set the master volume mute on or off.
3402 *
3403 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3404 * @param on {@code true} to mute master volume, {@code false} to turn mute off.
3405 */
3406 public void setMasterVolumeMuted(ComponentName admin, boolean on) {
3407 if (mService != null) {
3408 try {
3409 mService.setMasterVolumeMuted(admin, on);
3410 } catch (RemoteException re) {
3411 Log.w(TAG, "Failed to setMasterMute on device policy service");
3412 }
3413 }
3414 }
3415
3416 /**
3417 * Called by profile or device owners to check whether the master volume mute is on or off.
3418 *
3419 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3420 * @return {@code true} if master volume is muted, {@code false} if it's not.
3421 */
3422 public boolean isMasterVolumeMuted(ComponentName admin) {
3423 if (mService != null) {
3424 try {
3425 return mService.isMasterVolumeMuted(admin);
3426 } catch (RemoteException re) {
3427 Log.w(TAG, "Failed to get isMasterMute on device policy service");
3428 }
3429 }
3430 return false;
3431 }
Kenny Guyc13053b2014-05-29 14:17:17 +01003432
3433 /**
3434 * Called by profile or device owners to change whether a user can uninstall
3435 * a package.
3436 *
3437 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3438 * @param packageName package to change.
Esteban Talaverad5c5c132014-08-20 11:35:57 +01003439 * @param uninstallBlocked true if the user shouldn't be able to uninstall the package.
Kenny Guyc13053b2014-05-29 14:17:17 +01003440 */
Esteban Talaverad5c5c132014-08-20 11:35:57 +01003441 public void setUninstallBlocked(ComponentName admin, String packageName,
3442 boolean uninstallBlocked) {
Kenny Guyc13053b2014-05-29 14:17:17 +01003443 if (mService != null) {
3444 try {
Esteban Talaverad5c5c132014-08-20 11:35:57 +01003445 mService.setUninstallBlocked(admin, packageName, uninstallBlocked);
Kenny Guyc13053b2014-05-29 14:17:17 +01003446 } catch (RemoteException re) {
3447 Log.w(TAG, "Failed to call block uninstall on device policy service");
3448 }
3449 }
3450 }
3451
3452 /**
Rubin Xua97855b2014-11-07 05:41:00 +00003453 * Check whether the current user has been blocked by device policy from uninstalling a package.
3454 * Requires the caller to be the profile owner if checking a specific admin's policy.
Kenny Guyc13053b2014-05-29 14:17:17 +01003455 *
Rubin Xua97855b2014-11-07 05:41:00 +00003456 * @param admin The name of the admin component whose blocking policy will be checked, or null
3457 * to check if any admin has blocked the uninstallation.
Kenny Guyc13053b2014-05-29 14:17:17 +01003458 * @param packageName package to check.
Rubin Xua97855b2014-11-07 05:41:00 +00003459 * @return true if uninstallation is blocked.
Kenny Guyc13053b2014-05-29 14:17:17 +01003460 */
Esteban Talavera729b2a62014-08-27 18:01:58 +01003461 public boolean isUninstallBlocked(ComponentName admin, String packageName) {
Kenny Guyc13053b2014-05-29 14:17:17 +01003462 if (mService != null) {
3463 try {
Esteban Talavera729b2a62014-08-27 18:01:58 +01003464 return mService.isUninstallBlocked(admin, packageName);
Kenny Guyc13053b2014-05-29 14:17:17 +01003465 } catch (RemoteException re) {
3466 Log.w(TAG, "Failed to call block uninstall on device policy service");
3467 }
3468 }
3469 return false;
3470 }
Svetoslav976e8bd2014-07-16 15:12:03 -07003471
3472 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003473 * Called by the profile owner of a managed profile to enable widget providers from a
3474 * given package to be available in the parent profile. As a result the user will be able to
Svetoslav976e8bd2014-07-16 15:12:03 -07003475 * add widgets from the white-listed package running under the profile to a widget
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003476 * host which runs under the parent profile, for example the home screen. Note that
Svetoslav976e8bd2014-07-16 15:12:03 -07003477 * a package may have zero or more provider components, where each component
3478 * provides a different widget type.
3479 * <p>
3480 * <strong>Note:</strong> By default no widget provider package is white-listed.
3481 * </p>
3482 *
3483 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3484 * @param packageName The package from which widget providers are white-listed.
3485 * @return Whether the package was added.
3486 *
3487 * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
3488 * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
3489 */
3490 public boolean addCrossProfileWidgetProvider(ComponentName admin, String packageName) {
3491 if (mService != null) {
3492 try {
3493 return mService.addCrossProfileWidgetProvider(admin, packageName);
3494 } catch (RemoteException re) {
3495 Log.w(TAG, "Error calling addCrossProfileWidgetProvider", re);
3496 }
3497 }
3498 return false;
3499 }
3500
3501 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003502 * Called by the profile owner of a managed profile to disable widget providers from a given
3503 * package to be available in the parent profile. For this method to take effect the
Svetoslav976e8bd2014-07-16 15:12:03 -07003504 * package should have been added via {@link #addCrossProfileWidgetProvider(
3505 * android.content.ComponentName, String)}.
3506 * <p>
3507 * <strong>Note:</strong> By default no widget provider package is white-listed.
3508 * </p>
3509 *
3510 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3511 * @param packageName The package from which widget providers are no longer
3512 * white-listed.
3513 * @return Whether the package was removed.
3514 *
3515 * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
3516 * @see #getCrossProfileWidgetProviders(android.content.ComponentName)
3517 */
3518 public boolean removeCrossProfileWidgetProvider(ComponentName admin, String packageName) {
3519 if (mService != null) {
3520 try {
3521 return mService.removeCrossProfileWidgetProvider(admin, packageName);
3522 } catch (RemoteException re) {
3523 Log.w(TAG, "Error calling removeCrossProfileWidgetProvider", re);
3524 }
3525 }
3526 return false;
3527 }
3528
3529 /**
Amith Yamasanic34dc7c2014-09-18 09:42:42 -07003530 * Called by the profile owner of a managed profile to query providers from which packages are
Svetoslav976e8bd2014-07-16 15:12:03 -07003531 * available in the parent profile.
3532 *
3533 * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
3534 * @return The white-listed package list.
3535 *
3536 * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
3537 * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
3538 */
3539 public List<String> getCrossProfileWidgetProviders(ComponentName admin) {
3540 if (mService != null) {
3541 try {
3542 List<String> providers = mService.getCrossProfileWidgetProviders(admin);
3543 if (providers != null) {
3544 return providers;
3545 }
3546 } catch (RemoteException re) {
3547 Log.w(TAG, "Error calling getCrossProfileWidgetProviders", re);
3548 }
3549 }
3550 return Collections.emptyList();
3551 }
Dianne Hackbornd6847842010-01-12 18:14:19 -08003552}