DevicePolicyManager.java revision 599dd7ce9adf8ca067cefb0b191a5ac20ec35a79
1d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/* 2d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * 4d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * you may not use this file except in compliance with the License. 6d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * You may obtain a copy of the License at 7d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * 8d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * 10d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * See the License for the specific language governing permissions and 14d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * limitations under the License. 15d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 16d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 1787bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornpackage android.app.admin; 18d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 19d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport org.xmlpull.v1.XmlPullParserException; 20d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 21d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant; 22d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant.SdkConstantType; 23d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.ComponentName; 24d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.Context; 25d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ActivityInfo; 26d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.PackageManager; 27d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.content.pm.ResolveInfo; 28d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.Handler; 298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackbornimport android.os.RemoteCallback; 30d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.RemoteException; 31d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.os.ServiceManager; 32599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasaniimport android.os.UserHandle; 33d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Log; 34d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 35d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport java.io.IOException; 3669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayorimport java.net.InetSocketAddress; 3769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayorimport java.net.Proxy; 38d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackbornimport java.util.List; 39d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 40d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/** 41d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Public interface for managing policies enforced on a device. Most clients 42ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * of this class must have published a {@link DeviceAdminReceiver} that the user 43d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * has currently enabled. 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 453aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 473aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about managing policies for device adminstration, read the 483aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> 493aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p> 503aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 51d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 52d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornpublic class DevicePolicyManager { 53d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private static String TAG = "DevicePolicyManager"; 54d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 55d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private final Context mContext; 56d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private final IDevicePolicyManager mService; 573255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn private DevicePolicyManager(Context context, Handler handler) { 59d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mContext = context; 60d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService = IDevicePolicyManager.Stub.asInterface( 61d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); 62d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 63d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 6487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** @hide */ 6587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public static DevicePolicyManager create(Context context, Handler handler) { 6621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn DevicePolicyManager me = new DevicePolicyManager(context, handler); 6721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return me.mService != null ? me : null; 6821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 693255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 70d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 71d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Activity action: ask the user to add a new device administrator to the system. 72d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * The desired policy is the ComponentName of the policy in the 73d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #EXTRA_DEVICE_ADMIN} extra field. This will invoke a UI to 74d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * bring the user through adding the device administrator to the system (or 75d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * allowing them to reject it). 763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION} 788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * field to provide the user with additional explanation (in addition 798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * to your component's description) about what is being added. 80c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * 81c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * <p>If your administrator is already active, this will ordinarily return immediately (without 82c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * user intervention). However, if your administrator has been updated and is requesting 83c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * additional uses-policy flags, the user will be presented with the new list. New policies 84c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * will not be available to the updated administrator until the user has accepted the new list. 85d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 86d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 87d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_ADD_DEVICE_ADMIN 88d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.ADD_DEVICE_ADMIN"; 893255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 90d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 91284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * Activity action: send when any policy admin changes a policy. 92284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * This is generally used to find out when a new policy is in effect. 933e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller * 94284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * @hide 95284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller */ 96284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED 97284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED"; 98284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 99284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller /** 100d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * The ComponentName of the administrator component. 101d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * 102d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @see #ACTION_ADD_DEVICE_ADMIN 103d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 104d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN"; 1053255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 106d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * An optional CharSequence providing additional explanation for why the 1088ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * admin is being added. 1098ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 1108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @see #ACTION_ADD_DEVICE_ADMIN 1118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 1128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION"; 1133255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1143255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 1153255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Activity action: have the user enter a new password. This activity should 1163255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * be launched after using {@link #setPasswordQuality(ComponentName, int)}, 1173255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user 1183255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * enter a new password that meets the current requirements. You can use 1193255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #isActivePasswordSufficient()} to determine whether you need to 1203255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * have the user select a new password in order to meet the current 1213255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * constraints. Upon being resumed from this activity, you can check the new 1223255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * password characteristics to see if they are sufficient. 123d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 124d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 125d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_SET_NEW_PASSWORD 126d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.SET_NEW_PASSWORD"; 1273255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 128d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 129d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return true if the given administrator component is currently 130d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * active (enabled) in the system. 131d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 132d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public boolean isAdminActive(ComponentName who) { 133d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 134d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 135599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.isAdminActive(who, UserHandle.myUserId()); 136d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 137d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 138d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 139d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 140d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return false; 141d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1423255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 143d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 144d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * Return a list of all currently active device administrator's component 145d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * names. Note that if there are no administrators than null may be 146d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * returned. 147d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn */ 148d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn public List<ComponentName> getActiveAdmins() { 149d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn if (mService != null) { 150d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn try { 151599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getActiveAdmins(UserHandle.myUserId()); 152d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } catch (RemoteException e) { 153d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 154d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 155d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 156d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn return null; 157d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 1583255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 159d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn /** 160599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani * Used by package administration code to determine if a package can be stopped 161599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani * or uninstalled. 16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @hide 16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public boolean packageHasActiveAdmins(String packageName) { 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (mService != null) { 16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn try { 167599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.packageHasActiveAdmins(packageName, UserHandle.myUserId()); 16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } catch (RemoteException e) { 16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return false; 17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 1743255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 176d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Remove a current administration component. This can only be called 177d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * by the application that owns the administration component; if you 178d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * try to remove someone else's component, a security exception will be 179d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * thrown. 180d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 181d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void removeActiveAdmin(ComponentName who) { 182d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 183d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 184599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.removeActiveAdmin(who, UserHandle.myUserId()); 185d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 186d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 187d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 188d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 189d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1903255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 191d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 192c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * Returns true if an administrator has been granted a particular device policy. This can 193c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * be used to check if the administrator was activated under an earlier set of policies, 194c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * but requires additional policies after an upgrade. 195c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * 196c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be 197c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * an active administrator, or an exception will be thrown. 198c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}. 199c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler */ 200c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler public boolean hasGrantedPolicy(ComponentName admin, int usesPolicy) { 201c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler if (mService != null) { 202c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler try { 203599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.hasGrantedPolicy(admin, usesPolicy, UserHandle.myUserId()); 204c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } catch (RemoteException e) { 205c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler Log.w(TAG, "Failed talking with device policy service", e); 206c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 207c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 208c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler return false; 209c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 210c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler 211c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler /** 2129327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the policy has no requirements 2139327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * for the password. Note that quality constants are ordered so that higher 214df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * values are more restrictive. 215d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2169327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_UNSPECIFIED = 0; 2173255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 218d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2193e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller * Constant for {@link #setPasswordQuality}: the policy allows for low-security biometric 2203e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller * recognition technology. This implies technologies that can recognize the identity of 2213e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller * an individual to about a 3 digit PIN (false detection is less than 1 in 1,000). 2223e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller * Note that quality constants are ordered so that higher values are more restrictive. 2233e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller */ 2243e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 0x8000; 2253e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller 2263e5d3fd7e172ee85a7bb67baa01acbc3549dfdb6Jim Miller /** 2279327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the policy requires some kind 2289327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * of password, but doesn't care what it is. Note that quality constants 229df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * are ordered so that higher values are more restrictive. 230df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn */ 2319327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_SOMETHING = 0x10000; 2323255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 233df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn /** 2349327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 2359327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * password containing at least numeric characters. Note that quality 2369327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * constants are ordered so that higher values are more restrictive. 237d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2389327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_NUMERIC = 0x20000; 2393255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 240d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2419327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 24285f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * password containing at least alphabetic (or other symbol) characters. 24385f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * Note that quality constants are ordered so that higher values are more 24485f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * restrictive. 24585f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn */ 24685f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000; 2473255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 24885f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn /** 24985f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 2509327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * password containing at least <em>both></em> numeric <em>and</em> 25185f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * alphabetic (or other symbol) characters. Note that quality constants are 2529327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * ordered so that higher values are more restrictive. 253d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 25485f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000; 2553255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 257a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Constant for {@link #setPasswordQuality}: the user must have entered a 258c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password containing at least a letter, a numerical digit and a special 259c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * symbol, by default. With this password quality, passwords can be 260c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * restricted to contain various sets of characters, like at least an 261c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * uppercase letter, etc. These are specified using various methods, 262c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note 263c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * that quality constants are ordered so that higher values are more 264c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * restrictive. 265a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 266a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public static final int PASSWORD_QUALITY_COMPLEX = 0x60000; 267a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 268a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 269d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 270d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password restrictions it is imposing. After setting this, the user 271d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will not be able to enter a new password that is not at least as 272d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * restrictive as what has been set. Note that the current password 273d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will remain until the user has set a new one, so the change does not 274d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * take place immediately. To prompt the user for a new password, use 275d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. 2763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 2779327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * <p>Quality constants are ordered so that higher values are more restrictive; 2789327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * thus the highest requested quality constant (between the policy set here, 279df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * the user's preference, and any other considerations) is the one that 280df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * is in effect. 2813255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 2828aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 2838aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 2848aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 2853255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 286ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2879327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * @param quality The new desired quality. One of 2889327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #PASSWORD_QUALITY_UNSPECIFIED}, {@link #PASSWORD_QUALITY_SOMETHING}, 28985f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_ALPHABETIC}, 290a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. 291d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2929327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public void setPasswordQuality(ComponentName admin, int quality) { 293d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 294d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 295599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordQuality(admin, quality, UserHandle.myUserId()); 296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 298d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3013255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 3039327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Retrieve the current minimum password quality for all admins 304254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 305254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 306254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 3089327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public int getPasswordQuality(ComponentName admin) { 309599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordQuality(admin, UserHandle.myUserId()); 310599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 311599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 312599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 313599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordQuality(ComponentName admin, int userHandle) { 314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 315d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 316599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordQuality(admin, userHandle); 317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 318d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3219327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn return PASSWORD_QUALITY_UNSPECIFIED; 322d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3233255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 324d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 325d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 326d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * minimum allowed password length. After setting this, the user 327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will not be able to enter a new password that is not at least as 328d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * restrictive as what has been set. Note that the current password 329d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will remain until the user has set a new one, so the change does not 330d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * take place immediately. To prompt the user for a new password, use 331d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 332d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * constraint is only imposed if the administrator has also requested either 333a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_ALPHABETIC} 334a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} 3359327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * with {@link #setPasswordQuality}. 3363255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 3378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 3388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 3398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 3403255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 341ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 342d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param length The new desired minimum password length. A value of 0 343d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * means there is no restriction. 344d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 345254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public void setPasswordMinimumLength(ComponentName admin, int length) { 346d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 347d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 348599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumLength(admin, length, UserHandle.myUserId()); 349d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 350d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 351d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 352d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 353d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3543255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 355d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 356254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current minimum password length for all admins 357254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 358254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 359254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 360d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 361254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public int getPasswordMinimumLength(ComponentName admin) { 362599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumLength(admin, UserHandle.myUserId()); 363599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 364599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 365599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 366599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumLength(ComponentName admin, int userHandle) { 367d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 368d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 369599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumLength(admin, userHandle); 370d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 371d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 372d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 373d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 374d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return 0; 375d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 377a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 378a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 379a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of upper case letters required in the password. After 380a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 381a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 382a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 383a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 384a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 385a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 386c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 387c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 0. 388a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 389a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 390a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 391a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 392a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 393a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 394a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 395a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of upper case letters 396a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * required in the password. A value of 0 means there is no 397a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restriction. 398a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 399a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumUpperCase(ComponentName admin, int length) { 400a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 401a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 402599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumUpperCase(admin, length, UserHandle.myUserId()); 403a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 404a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 405a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 406a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 407a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 408a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 409a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 410a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of upper case letters required in the 411c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 412c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumUpperCase(ComponentName, int)} 413c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 414c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 415a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 416a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 417a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 418a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of upper case letters required in the 419a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. 420a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 421a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumUpperCase(ComponentName admin) { 422599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumUpperCase(admin, UserHandle.myUserId()); 423599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 424599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 425599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 426599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumUpperCase(ComponentName admin, int userHandle) { 427a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 428a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 429599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumUpperCase(admin, userHandle); 430a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 431a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 432a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 433a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 434a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 435a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 436a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 437a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 438a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 439a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of lower case letters required in the password. After 440a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 441a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 442a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 443a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 444a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 445a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 446c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 447c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 0. 448a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 449a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 450a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 451a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 452a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 453a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 454a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 455a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of lower case letters 456a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * required in the password. A value of 0 means there is no 457a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restriction. 458a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 459a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumLowerCase(ComponentName admin, int length) { 460a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 461a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 462599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumLowerCase(admin, length, UserHandle.myUserId()); 463a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 464a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 465a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 466a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 467a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 468a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 469a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 470a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of lower case letters required in the 471c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 472c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumLowerCase(ComponentName, int)} 473c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 474c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 475a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 476a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 477a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 478a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of lower case letters required in the 479a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. 480a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 481a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumLowerCase(ComponentName admin) { 482599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumLowerCase(admin, UserHandle.myUserId()); 483599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 484599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 485599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 486599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumLowerCase(ComponentName admin, int userHandle) { 487a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 488a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 489599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumLowerCase(admin, userHandle); 490a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 491a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 492a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 493a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 494a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 495a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 496a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 497a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 498a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 499a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of letters required in the password. After setting this, 500a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * the user will not be able to enter a new password that is not at least as 501a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restrictive as what has been set. Note that the current password will 502a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * remain until the user has set a new one, so the change does not take 503a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * place immediately. To prompt the user for a new password, use 504a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 505a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 506c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 507c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 508a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 509a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 510a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 511a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 512a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 513a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 514a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 515a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of letters required in the 516a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. A value of 0 means there is no restriction. 517a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 518a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumLetters(ComponentName admin, int length) { 519a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 520a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 521599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumLetters(admin, length, UserHandle.myUserId()); 522a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 523a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 524a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 525a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 526a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 527a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 528a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 529a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of letters required in the password for all 530c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * admins or a particular one. This is the same value as 531c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumLetters(ComponentName, int)} 532c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 533c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 534a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 535a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 536a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 537a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of letters required in the password. 538a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 539a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumLetters(ComponentName admin) { 540599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumLetters(admin, UserHandle.myUserId()); 541599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 542599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 543599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 544599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumLetters(ComponentName admin, int userHandle) { 545a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 546a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 547599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumLetters(admin, userHandle); 548a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 549a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 550a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 551a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 552a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 553a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 554a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 555a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 556a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 557a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of numerical digits required in the password. After 558a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 559a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 560a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 561a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 562a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 563a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 564c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 565c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 566a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 567a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 568a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 569a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 570a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 571a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 572a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 573a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of numerical digits required 574a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * in the password. A value of 0 means there is no restriction. 575a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 576a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumNumeric(ComponentName admin, int length) { 577a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 578a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 579599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumNumeric(admin, length, UserHandle.myUserId()); 580a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 581a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 582a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 583a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 584a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 585a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 586a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 587a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of numerical digits required in the password 588c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * for all admins or a particular one. This is the same value as 589c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumNumeric(ComponentName, int)} 590c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 591c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 592a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 593a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 594a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 595a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of numerical digits required in the password. 596a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 597a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumNumeric(ComponentName admin) { 598599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumNumeric(admin, UserHandle.myUserId()); 599599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 600599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 601599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 602599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumNumeric(ComponentName admin, int userHandle) { 603a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 604a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 605599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumNumeric(admin, userHandle); 606a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 607a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 608a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 609a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 610a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 611a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 612a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 613a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 614a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 615a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of symbols required in the password. After setting this, 616a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * the user will not be able to enter a new password that is not at least as 617a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restrictive as what has been set. Note that the current password will 618a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * remain until the user has set a new one, so the change does not take 619a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * place immediately. To prompt the user for a new password, use 620a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 621a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 622c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 623c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 624a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 625a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 626a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 627a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 628a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 629a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 630a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 631a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of symbols required in the 632a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. A value of 0 means there is no restriction. 633a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 634a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumSymbols(ComponentName admin, int length) { 635a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 636a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 637599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumSymbols(admin, length, UserHandle.myUserId()); 638a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 639a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 640a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 641a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 642a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 643a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 644a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 645a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of symbols required in the password for all 646c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * admins or a particular one. This is the same value as 647c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumSymbols(ComponentName, int)} 648c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 649c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 650a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 651a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 652a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 653a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of symbols required in the password. 654a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 655a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumSymbols(ComponentName admin) { 656599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumSymbols(admin, UserHandle.myUserId()); 657599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 658599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 659599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 660599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumSymbols(ComponentName admin, int userHandle) { 661a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 662a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 663599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumSymbols(admin, userHandle); 664a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 665a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 666a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 667a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 668a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 669a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 670a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 671c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev /** 672c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * Called by an application that is administering the device to set the 673c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * minimum number of non-letter characters (numerical digits or symbols) 674c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * required in the password. After setting this, the user will not be able 675c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * to enter a new password that is not at least as restrictive as what has 676c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * been set. Note that the current password will remain until the user has 677c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set a new one, so the change does not take place immediately. To prompt 678c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} after 679c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * setting this value. This constraint is only imposed if the administrator 680c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * has also requested {@link #PASSWORD_QUALITY_COMPLEX} with 681c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #setPasswordQuality}. The default value is 0. 682c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * <p> 683c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * The calling device admin must have requested 684c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 685c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 686c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * 687c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 688c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * with. 689c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param length The new desired minimum number of letters required in the 690c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password. A value of 0 means there is no restriction. 691c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev */ 692c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev public void setPasswordMinimumNonLetter(ComponentName admin, int length) { 693c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev if (mService != null) { 694c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev try { 695599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordMinimumNonLetter(admin, length, UserHandle.myUserId()); 696c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } catch (RemoteException e) { 697c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 698c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 699c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 700c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 701c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev 702c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev /** 703c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * Retrieve the current number of non-letter characters required in the 704c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 705c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumNonLetter(ComponentName, int)} 706c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 707c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 708c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * 709c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 710c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * aggregate all admins. 711c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @return The minimum number of letters required in the password. 712c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev */ 713c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev public int getPasswordMinimumNonLetter(ComponentName admin) { 714599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordMinimumNonLetter(admin, UserHandle.myUserId()); 715599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 716599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 717599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 718599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordMinimumNonLetter(ComponentName admin, int userHandle) { 719c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev if (mService != null) { 720c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev try { 721599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordMinimumNonLetter(admin, userHandle); 722c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } catch (RemoteException e) { 723c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 724c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 725c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 726c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev return 0; 727c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 728c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev 7293255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 7303255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Called by an application that is administering the device to set the length 7313255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * of the password history. After setting this, the user will not be able to 7323255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * enter a new password that is the same as any password in the history. Note 7333255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * that the current password will remain until the user has set a new one, so 7343255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * the change does not take place immediately. To prompt the user for a new 7353255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * password, use {@link #ACTION_SET_NEW_PASSWORD} after setting this value. 7363255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * This constraint is only imposed if the administrator has also requested 7373255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * either {@link #PASSWORD_QUALITY_NUMERIC}, 7383255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHABETIC}, or 7393255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}. 7403255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 7413255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * <p> 7423255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * The calling device admin must have requested 7433255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this 7443255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * method; if it has not, a security exception will be thrown. 7453255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 7463255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 7473255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * with. 7483255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param length The new desired length of password history. A value of 0 7493255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * means there is no restriction. 7503255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev */ 7513255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev public void setPasswordHistoryLength(ComponentName admin, int length) { 7523255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev if (mService != null) { 7533255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev try { 754599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordHistoryLength(admin, length, UserHandle.myUserId()); 7553255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } catch (RemoteException e) { 7563255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 7573255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7583255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7593255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7603255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 7613255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 762a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Called by a device admin to set the password expiration timeout. Calling this method 763a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * will restart the countdown for password expiration for the given admin, as will changing 764a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * the device password (for all admins). 765a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 766a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The provided timeout is the time delta in ms and will be added to the current time. 767a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * For example, to have the password expire 5 days from now, timeout would be 768a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 5 * 86400 * 1000 = 432000000 ms for timeout. 769a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 770a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>To disable password expiration, a value of 0 may be used for timeout. 771a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 772a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The calling device admin must have requested 773a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this 774a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * method; if it has not, a security exception will be thrown. 775a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 776a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 777a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 778a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * means there is no restriction (unlimited). 779a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 780a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public void setPasswordExpirationTimeout(ComponentName admin, long timeout) { 781a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 782a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 783599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setPasswordExpirationTimeout(admin, timeout, UserHandle.myUserId()); 784a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 785a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 786a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 787a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 788a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 789a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 790a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 7916b85768058b065cc682757a366abc828c9ca727aJim Miller * Get the password expiration timeout for the given admin. The expiration timeout is the 7926b85768058b065cc682757a366abc828c9ca727aJim Miller * recurring expiration timeout provided in the call to 7936b85768058b065cc682757a366abc828c9ca727aJim Miller * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the 7946b85768058b065cc682757a366abc828c9ca727aJim Miller * aggregate of all policy administrators if admin is null. 795a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 796a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin The name of the admin component to check, or null to aggregate all admins. 797a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @return The timeout for the given admin or the minimum of all timeouts 798a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 799a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public long getPasswordExpirationTimeout(ComponentName admin) { 800a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 801a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 802599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordExpirationTimeout(admin, UserHandle.myUserId()); 803a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 804a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 805a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 806a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 807a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return 0; 808a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 809a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 810a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 811a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Get the current password expiration time for the given admin or an aggregate of 8126b85768058b065cc682757a366abc828c9ca727aJim Miller * all admins if admin is null. If the password is expired, this will return the time since 8136b85768058b065cc682757a366abc828c9ca727aJim Miller * the password expired as a negative number. If admin is null, then a composite of all 8146b85768058b065cc682757a366abc828c9ca727aJim Miller * expiration timeouts is returned - which will be the minimum of all timeouts. 815a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 816a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin The name of the admin component to check, or null to aggregate all admins. 817a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @return The password expiration time, in ms. 818a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 819a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public long getPasswordExpiration(ComponentName admin) { 820a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 821a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 822599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordExpiration(admin, UserHandle.myUserId()); 823a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 824a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 825a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 826a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 827a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return 0; 828a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 829a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 830a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 8313255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Retrieve the current password history length for all admins 8323255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * or a particular one. 8333255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param admin The name of the admin component to check, or null to aggregate 8343255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * all admins. 8353255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @return The length of the password history 8363255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev */ 8373255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev public int getPasswordHistoryLength(ComponentName admin) { 838599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getPasswordHistoryLength(admin, UserHandle.myUserId()); 839599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 840599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 841599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 842599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getPasswordHistoryLength(ComponentName admin, int userHandle) { 8433255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev if (mService != null) { 8443255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev try { 845599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getPasswordHistoryLength(admin, userHandle); 8463255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } catch (RemoteException e) { 8473255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 8483255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 8493255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 8503255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev return 0; 8513255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 8523255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 853d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 854254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Return the maximum password length that the device supports for a 8559327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * particular password quality. 856364f6e3d44c27cd17fe0f3fca844465e9a502636Dianne Hackborn * @param quality The quality being interrogated. 857254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @return Returns the maximum length that the user can enter. 858254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn */ 8599327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public int getPasswordMaximumLength(int quality) { 860254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn // Kind-of arbitrary. 861254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return 16; 862254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 8633255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 864254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn /** 865df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * Determine whether the current password the user has set is sufficient 8669327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * to meet the policy requirements (quality, minimum length) that have been 867df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * requested. 8683255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 8698aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 8708aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 8718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 8723255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 873df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @return Returns true if the password meets the current requirements, 874df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * else false. 875d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 876df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn public boolean isActivePasswordSufficient() { 877d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 878d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 879599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.isActivePasswordSufficient(UserHandle.myUserId()); 880d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 881d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 882d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 883d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 884df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn return false; 885d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 8863255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 887d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 888d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the number of times the user has failed at entering a 889d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password since that last successful password entry. 8903255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 8918aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 8928aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call 8938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 894d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 895d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public int getCurrentFailedPasswordAttempts() { 896d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 897d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 898599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getCurrentFailedPasswordAttempts(UserHandle.myUserId()); 899d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 900d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 901d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 902d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 903d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return -1; 904d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 905df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn 906df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn /** 90788209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * Setting this to a value greater than zero enables a built-in policy 90888209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * that will perform a device wipe after too many incorrect 90988209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * device-unlock passwords have been entered. This built-in policy combines 91088209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * watching for failed passwords and wiping the device, and requires 91188209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and 9128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}. 9133255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 91488209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * <p>To implement any other policy (e.g. wiping data for a particular 91588209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * application only, erasing or revoking credentials, or reporting the 91688209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * failure to a server), you should implement 917ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} 91888209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * instead. Do not use this API, because if the maximum count is reached, 91988209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * the device will be wiped immediately, and your callback will not be invoked. 9203255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 921ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 9228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param num The number of failed password attempts at which point the 9238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * device will wipe its data. 9248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 9258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void setMaximumFailedPasswordsForWipe(ComponentName admin, int num) { 9268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (mService != null) { 9278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn try { 928599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setMaximumFailedPasswordsForWipe(admin, num, UserHandle.myUserId()); 9298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } catch (RemoteException e) { 9308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 9318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 9328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 9338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 9343255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 9358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 936254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current maximum number of login attempts that are allowed 937254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * before the device wipes itself, for all admins 938254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 939254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 940254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 941254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn */ 942254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public int getMaximumFailedPasswordsForWipe(ComponentName admin) { 943599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getMaximumFailedPasswordsForWipe(admin, UserHandle.myUserId()); 944599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 945599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 946599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 947599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getMaximumFailedPasswordsForWipe(ComponentName admin, int userHandle) { 948254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn if (mService != null) { 949254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn try { 950599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getMaximumFailedPasswordsForWipe(admin, userHandle); 951254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } catch (RemoteException e) { 952254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 953254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 954254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 955254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return 0; 956254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 9573255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 958254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn /** 95987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * Flag for {@link #resetPassword}: don't allow other admins to change 96087bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * the password again until the user has entered it. 96187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn */ 96287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001; 9633255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 96487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** 965ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * Force a new device unlock password (the password needed to access the 966ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * entire device, not for individual accounts) on the user. This takes 967ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * effect immediately. 9689327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * The given password must be sufficient for the 9699327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * current password quality and length constraints as returned by 9709327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #getPasswordQuality(ComponentName)} and 9719327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet 9729327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * these constraints, then it will be rejected and false returned. Note 9739327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * that the password may be a stronger quality (containing alphanumeric 9749327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * characters when the requested quality is only numeric), in which case 9759327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * the currently active quality will be increased to match. 9763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 9778aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 9788aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call 9798aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 9803255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 981df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @param password The new password for the user. 98287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * @param flags May be 0 or {@link #RESET_PASSWORD_REQUIRE_ENTRY}. 983df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @return Returns true if the password was applied, or false if it is 984df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * not acceptable for the current constraints. 985df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn */ 98687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public boolean resetPassword(String password, int flags) { 987df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn if (mService != null) { 988df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn try { 989599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.resetPassword(password, flags, UserHandle.myUserId()); 990df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } catch (RemoteException e) { 991df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 992df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 993df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 994df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn return false; 995df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 9963255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 997d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 998d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 999d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * maximum time for user activity until the device will lock. This limits 1000d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * the length that the user can set. It takes effect immediately. 10013255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 10028aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 1003315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call 10048aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 10053255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 1006ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1007d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param timeMs The new desired maximum time to lock in milliseconds. 1008d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * A value of 0 means there is no restriction. 1009d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1010d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void setMaximumTimeToLock(ComponentName admin, long timeMs) { 1011d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1012d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1013599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setMaximumTimeToLock(admin, timeMs, UserHandle.myUserId()); 1014d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1015d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1016d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1017d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1018d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 10193255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1020d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1021254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current maximum time to unlock for all admins 1022254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 1023254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 1024254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 1025d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1026254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public long getMaximumTimeToLock(ComponentName admin) { 1027599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getMaximumTimeToLock(admin, UserHandle.myUserId()); 1028599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 1029599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 1030599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 1031599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public long getMaximumTimeToLock(ComponentName admin, int userHandle) { 1032d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1033d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1034599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getMaximumTimeToLock(admin, userHandle); 1035d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1036d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1037d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1038d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1039d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return 0; 1040d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 10413255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1042d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1043df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * Make the device lock immediately, as if the lock screen timeout has 1044df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * expired at the point of this call. 10453255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 10468aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 10478aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call 10488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 1049d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1050df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn public void lockNow() { 1051df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn if (mService != null) { 1052df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn try { 1053df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn mService.lockNow(); 1054df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } catch (RemoteException e) { 1055df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1056df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 1057df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 1058df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 10593255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1060d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1061424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn * Flag for {@link #wipeData(int)}: also erase the device's external 1062424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn * storage. 1063424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn */ 1064424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn public static final int WIPE_EXTERNAL_STORAGE = 0x0001; 1065424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn 1066424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn /** 1067d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Ask the user date be wiped. This will cause the device to reboot, 1068df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * erasing all user data while next booting up. External storage such 1069f535cb04f08575d29118fab0342b1e6274091734Masanori Ogino * as SD cards will be also erased if the flag {@link #WIPE_EXTERNAL_STORAGE} 1070f535cb04f08575d29118fab0342b1e6274091734Masanori Ogino * is set. 10713255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 10728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 10738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to be able to call 10748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 10753255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 1076f535cb04f08575d29118fab0342b1e6274091734Masanori Ogino * @param flags Bit mask of additional options: currently 0 and 1077f535cb04f08575d29118fab0342b1e6274091734Masanori Ogino * {@link #WIPE_EXTERNAL_STORAGE} are supported. 1078d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1079d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void wipeData(int flags) { 1080d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1081d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1082599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.wipeData(flags, UserHandle.myUserId()); 1083d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1084d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1085d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1086d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1087d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 10883255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1089d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 109069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Called by an application that is administering the device to set the 109169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * global proxy and exclusion list. 109269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * <p> 109369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * The calling device admin must have requested 109469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call 109569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * this method; if it has not, a security exception will be thrown. 109669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Only the first device admin can set the proxy. If a second admin attempts 109769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * to set the proxy, the {@link ComponentName} of the admin originally setting the 109869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * proxy will be returned. If successful in setting the proxy, null will 109969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * be returned. 110069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * The method can be called repeatedly by the device admin alrady setting the 110169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * proxy to update the proxy and exclusion list. 110269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * 110369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param admin Which {@link DeviceAdminReceiver} this request is associated 110469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * with. 110569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param proxySpec the global proxy desired. Must be an HTTP Proxy. 110669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Pass Proxy.NO_PROXY to reset the proxy. 110769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param exclusionList a list of domains to be excluded from the global proxy. 110869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @return returns null if the proxy was successfully set, or a {@link ComponentName} 110969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * of the device admin that sets thew proxy otherwise. 1110d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler * @hide 111169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor */ 111269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor public ComponentName setGlobalProxy(ComponentName admin, Proxy proxySpec, 111369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor List<String> exclusionList ) { 111469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (proxySpec == null) { 111569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor throw new NullPointerException(); 111669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 111769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (mService != null) { 111869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor try { 111969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String hostSpec; 112069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String exclSpec; 112169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (proxySpec.equals(Proxy.NO_PROXY)) { 112269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor hostSpec = null; 112369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = null; 112469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 112569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (!proxySpec.type().equals(Proxy.Type.HTTP)) { 112669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor throw new IllegalArgumentException(); 112769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 112869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor InetSocketAddress sa = (InetSocketAddress)proxySpec.address(); 112969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String hostName = sa.getHostName(); 113069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor int port = sa.getPort(); 113169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor StringBuilder hostBuilder = new StringBuilder(); 113269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor hostSpec = hostBuilder.append(hostName) 113369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor .append(":").append(Integer.toString(port)).toString(); 113469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (exclusionList == null) { 113569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = ""; 113669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 113769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor StringBuilder listBuilder = new StringBuilder(); 113869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor boolean firstDomain = true; 113969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor for (String exclDomain : exclusionList) { 114069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (!firstDomain) { 114169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor listBuilder = listBuilder.append(","); 114269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 114369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor firstDomain = false; 114469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 114569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor listBuilder = listBuilder.append(exclDomain.trim()); 114669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 114769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = listBuilder.toString(); 114869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 114969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec); 115069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 1151599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.setGlobalProxy(admin, hostSpec, exclSpec, UserHandle.myUserId()); 115269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } catch (RemoteException e) { 115369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor Log.w(TAG, "Failed talking with device policy service", e); 115469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 115569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 115669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return null; 115769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 115869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 115969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor /** 116069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Returns the component name setting the global proxy. 116169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @return ComponentName object of the device admin that set the global proxy, or 116269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * null if no admin has set the proxy. 1163d26727273d16745ceddc2203121d29c3a9e7733cAndy Stadler * @hide 116469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor */ 116569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor public ComponentName getGlobalProxyAdmin() { 116669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (mService != null) { 116769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor try { 1168599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getGlobalProxyAdmin(UserHandle.myUserId()); 116969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } catch (RemoteException e) { 117069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor Log.w(TAG, "Failed talking with device policy service", e); 117169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 117269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 117369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return null; 117469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 117569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 117669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor /** 117722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11787b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is not supported. 11797b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11807b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0; 11817b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11827b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 118322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11847b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is supported, but is not currently active. 11857b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11867b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final int ENCRYPTION_STATUS_INACTIVE = 1; 11877b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11887b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 118922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11907b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is not currently active, but is currently 11917b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * being activated. This is only reported by devices that support 11927b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * encryption of data and only when the storage is currently 11937b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * undergoing a process of becoming encrypted. A device that must reboot and/or wipe data 11947b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * to become encrypted will never return this value. 11957b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 119622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public static final int ENCRYPTION_STATUS_ACTIVATING = 2; 11977b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11987b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 119922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 12007b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is active. 12017b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 120222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public static final int ENCRYPTION_STATUS_ACTIVE = 3; 12037b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 12047b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 12057b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Activity action: begin the process of encrypting data on the device. This activity should 12067b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * be launched after using {@link #setStorageEncryption} to request encryption be activated. 12077b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * After resuming from this activity, use {@link #getStorageEncryption} 12087b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * to check encryption status. However, on some devices this activity may never return, as 12097b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * it may trigger a reboot and in some cases a complete data wipe of the device. 12107b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 12117b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 12127b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final String ACTION_START_ENCRYPTION 12137b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler = "android.app.action.START_ENCRYPTION"; 12147b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 12157b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 1216b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * Widgets are enabled in keyguard 1217b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller */ 1218b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller public static final int KEYGUARD_DISABLE_WIDGETS_NONE = 0; 1219b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1220b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller /** 1221b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * Disable all keyguard widgets 1222b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller */ 1223b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 0x7fffffff; 1224b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1225b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller /** 12267b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Called by an application that is administering the device to 122722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * request that the storage system be encrypted. 12287b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 12297b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>When multiple device administrators attempt to control device 12307b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * encryption, the most secure, supported setting will always be 12317b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * used. If any device administrator requests device encryption, 12327b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * it will be enabled; Conversely, if a device administrator 12337b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * attempts to disable device encryption while another 12347b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * device administrator has enabled it, the call to disable will 12357b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}). 12367b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 12377b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>This policy controls encryption of the secure (application data) storage area. Data 123850c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * written to other storage areas may or may not be encrypted, and this policy does not require 123950c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * or control the encryption of any other storage areas. 124050c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * There is one exception: If {@link android.os.Environment#isExternalStorageEmulated()} is 124150c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * {@code true}, then the directory returned by 124250c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * {@link android.os.Environment#getExternalStorageDirectory()} must be written to disk 124350c294f21b3348010c3f91c5a998d54e1e45d2e4Andy Stadler * within the encrypted storage area. 12447b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 12457b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>Important Note: On some devices, it is possible to encrypt storage without requiring 12467b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * the user to create a device PIN or Password. In this case, the storage is encrypted, but 12477b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * the encryption key may not be fully secured. For maximum security, the administrator should 12487b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * also require (and check for) a pattern, PIN, or password. 12497b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 12507b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 12517b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * @param encrypt true to request encryption, false to release any previous request 125222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return the new request status (for all active admins) - will be one of 125322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or 125422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use 125522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #getStorageEncryptionStatus()} to query the actual device state. 12567b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 12577b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public int setStorageEncryption(ComponentName admin, boolean encrypt) { 12587b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler if (mService != null) { 12597b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler try { 1260599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.setStorageEncryption(admin, encrypt, UserHandle.myUserId()); 12617b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } catch (RemoteException e) { 12627b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler Log.w(TAG, "Failed talking with device policy service", e); 12637b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12647b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12657b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return ENCRYPTION_STATUS_UNSUPPORTED; 12667b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12677b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 12687b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 12697b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Called by an application that is administering the device to 127022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * determine the requested setting for secure storage. 12717b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 127222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null, 127322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * this will return the requested encryption setting as an aggregate of all active 127422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * administrators. 127522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return true if the admin(s) are requesting encryption, false if not. 12767b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 127722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public boolean getStorageEncryption(ComponentName admin) { 12787b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler if (mService != null) { 12797b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler try { 1280599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getStorageEncryption(admin, UserHandle.myUserId()); 12817b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } catch (RemoteException e) { 128222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler Log.w(TAG, "Failed talking with device policy service", e); 128322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 128422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 128522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler return false; 128622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 128722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler 128822dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler /** 128922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Called by an application that is administering the device to 129022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * determine the current encryption status of the device. 129122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * 129222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Depending on the returned status code, the caller may proceed in different 129322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * ways. If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the 129422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * storage system does not support encryption. If the 129522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link 129622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the 129722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * storage. If the result is {@link #ENCRYPTION_STATUS_ACTIVATING} or 129822dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVE}, no further action is required. 129922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * 130022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return current status of encryption. The value will be one of 130122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, 130222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVATING}, or{@link #ENCRYPTION_STATUS_ACTIVE}. 130322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler */ 130422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public int getStorageEncryptionStatus() { 1305599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getStorageEncryptionStatus(UserHandle.myUserId()); 1306599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 1307599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 1308599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 1309599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getStorageEncryptionStatus(int userHandle) { 131022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler if (mService != null) { 131122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler try { 1312599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getStorageEncryptionStatus(userHandle); 131322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } catch (RemoteException e) { 13147b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler Log.w(TAG, "Failed talking with device policy service", e); 13157b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 13167b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 13177b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return ENCRYPTION_STATUS_UNSUPPORTED; 13187b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 13197b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 13207b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 13212447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * Called by an application that is administering the device to disable all cameras 13222447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * on the device. After setting this, no applications will be able to access any cameras 13232447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * on the device. 13242447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * 13252447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * <p>The calling device admin must have requested 13262447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call 13272447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * this method; if it has not, a security exception will be thrown. 13282447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * 13292447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 13302447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * @param disabled Whether or not the camera should be disabled. 13312447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo */ 13322447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo public void setCameraDisabled(ComponentName admin, boolean disabled) { 13332447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo if (mService != null) { 13342447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo try { 1335599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setCameraDisabled(admin, disabled, UserHandle.myUserId()); 13362447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } catch (RemoteException e) { 13372447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo Log.w(TAG, "Failed talking with device policy service", e); 13382447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13392447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13402447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13412447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo 13422447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo /** 13432447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * Determine whether or not the device's cameras have been disabled either by the current 13442447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * admin, if specified, or all admins. 13452447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * @param admin The name of the admin component to check, or null to check if any admins 13462447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo * have disabled the camera 13472447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo */ 13482447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo public boolean getCameraDisabled(ComponentName admin) { 1349599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getCameraDisabled(admin, UserHandle.myUserId()); 1350599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 1351599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 1352599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 1353599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public boolean getCameraDisabled(ComponentName admin, int userHandle) { 13542447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo if (mService != null) { 13552447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo try { 1356599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getCameraDisabled(admin, userHandle); 13572447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } catch (RemoteException e) { 13582447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo Log.w(TAG, "Failed talking with device policy service", e); 13592447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13602447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13612447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo return false; 13622447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo } 13632447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo 13642447edd85baac3225a12b868ef40f76cfdc6ec11Ben Komalo /** 1365b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * Called by an application that is administering the device to disable adding widgets to 1366b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * keyguard. After setting this, keyguard widgets will be disabled according to the state 1367b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * provided. 1368b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 1369b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * <p>The calling device admin must have requested 1370b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_WIDGETS} to be able to call 1371b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * this method; if it has not, a security exception will be thrown. 1372b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * 1373b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 1374b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * @param which {@link DevicePolicyManager#KEYGUARD_DISABLE_WIDGETS_ALL} or 1375b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * {@link DevicePolicyManager#KEYGUARD_DISABLE_WIDGETS_NONE} (the default). 1376b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller */ 1377b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller public void setKeyguardWidgetsDisabled(ComponentName admin, int which) { 1378b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller if (mService != null) { 1379b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller try { 1380599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setKeyguardWidgetsDisabled(admin, which, UserHandle.myUserId()); 1381b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } catch (RemoteException e) { 1382b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 1383b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1384b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1385b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1386b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1387b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller /** 1388b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * Determine whether or not widgets have been disabled in keyguard either by the current 1389b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * admin, if specified, or all admins. 1390b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * @param admin The name of the admin component to check, or null to check if any admins 1391b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller * have disabled widgets in keyguard. 1392b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller */ 1393b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller public int getKeyguardWidgetsDisabled(ComponentName admin) { 1394599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return getKeyguardWidgetsDisabled(admin, UserHandle.myUserId()); 1395599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani } 1396599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani 1397599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani /** @hide per-user version */ 1398599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public int getKeyguardWidgetsDisabled(ComponentName admin, int userHandle) { 1399b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller if (mService != null) { 1400b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller try { 1401599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani return mService.getKeyguardWidgetsDisabled(admin, userHandle); 1402b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } catch (RemoteException e) { 1403b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 1404b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1405b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1406b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller return KEYGUARD_DISABLE_WIDGETS_NONE; 1407b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller } 1408b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller 1409b8ec470617590fa2025db869e8e80dcce8eaec23Jim Miller /** 1410d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1411d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1412c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler public void setActiveAdmin(ComponentName policyReceiver, boolean refreshing) { 1413d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1414d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1415599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.setActiveAdmin(policyReceiver, refreshing, UserHandle.myUserId()); 1416d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1417d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1418d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1419d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1420d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 14213255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1422d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1423c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * Returns the DeviceAdminInfo as defined by the administrator's package info & meta-data 1424d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1425d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1426d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn public DeviceAdminInfo getAdminInfo(ComponentName cn) { 1427d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ActivityInfo ai; 1428d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1429d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ai = mContext.getPackageManager().getReceiverInfo(cn, 1430d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn PackageManager.GET_META_DATA); 1431d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1432d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to retrieve device policy " + cn, e); 1433d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1434d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 14353255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1436d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ResolveInfo ri = new ResolveInfo(); 1437d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ri.activityInfo = ai; 14383255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1439d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1440d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return new DeviceAdminInfo(mContext, ri); 1441d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (XmlPullParserException e) { 1442d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to parse device policy " + cn, e); 1443d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1444d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (IOException e) { 1445d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to parse device policy " + cn, e); 1446d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1447d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1448d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 14493255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1450d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1451d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 14528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 14538ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void getRemoveWarning(ComponentName admin, RemoteCallback result) { 14548ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (mService != null) { 14558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn try { 1456599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.getRemoveWarning(admin, result, UserHandle.myUserId()); 14578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } catch (RemoteException e) { 14588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 14598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 14608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 14618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 14628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 14638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 14648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @hide 1465d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1466a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setActivePasswordState(int quality, int length, int letters, int uppercase, 1467599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani int lowercase, int numbers, int symbols, int nonletter, int userHandle) { 1468d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1469d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1470a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setActivePasswordState(quality, length, letters, uppercase, lowercase, 1471599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani numbers, symbols, nonletter, userHandle); 1472d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1473d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1474d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1475d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1476d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 14773255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1478d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1479d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1480d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1481599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public void reportFailedPasswordAttempt(int userHandle) { 1482d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1483d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1484599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.reportFailedPasswordAttempt(userHandle); 1485d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1486d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1487d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1488d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1489d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 14903255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1491d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1492d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1493d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1494599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani public void reportSuccessfulPasswordAttempt(int userHandle) { 1495d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1496d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1497599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani mService.reportSuccessfulPasswordAttempt(userHandle); 1498d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1499d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1500d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1501d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1502d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1503d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn} 1504