DevicePolicyManager.java revision 6b85768058b065cc682757a366abc828c9ca727a
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; 32d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.util.Log; 33d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 34d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport java.io.IOException; 3569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayorimport java.net.InetSocketAddress; 3669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayorimport java.net.Proxy; 37d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackbornimport java.util.List; 38d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 39d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn/** 40d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Public interface for managing policies enforced on a device. Most clients 41ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * of this class must have published a {@link DeviceAdminReceiver} that the user 42d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * has currently enabled. 43d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 44d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornpublic class DevicePolicyManager { 45d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private static String TAG = "DevicePolicyManager"; 46d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 47d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private final Context mContext; 48d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private final IDevicePolicyManager mService; 493255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 5021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn private DevicePolicyManager(Context context, Handler handler) { 51d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mContext = context; 52d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService = IDevicePolicyManager.Stub.asInterface( 53d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); 54d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 55d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 5687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** @hide */ 5787bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public static DevicePolicyManager create(Context context, Handler handler) { 5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn DevicePolicyManager me = new DevicePolicyManager(context, handler); 5921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return me.mService != null ? me : null; 6021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 613255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 62d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 63d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Activity action: ask the user to add a new device administrator to the system. 64d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * The desired policy is the ComponentName of the policy in the 65d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #EXTRA_DEVICE_ADMIN} extra field. This will invoke a UI to 66d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * bring the user through adding the device administrator to the system (or 67d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * allowing them to reject it). 683255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * <p>You can optionally include the {@link #EXTRA_ADD_EXPLANATION} 708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * field to provide the user with additional explanation (in addition 718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * to your component's description) about what is being added. 72c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * 73c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * <p>If your administrator is already active, this will ordinarily return immediately (without 74c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * user intervention). However, if your administrator has been updated and is requesting 75c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * additional uses-policy flags, the user will be presented with the new list. New policies 76c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * will not be available to the updated administrator until the user has accepted the new list. 77d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 78d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 79d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_ADD_DEVICE_ADMIN 80d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.ADD_DEVICE_ADMIN"; 813255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 82d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 83284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * Activity action: send when any policy admin changes a policy. 84284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * This is generally used to find out when a new policy is in effect. 85284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * 86284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller * @hide 87284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller */ 88284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller public static final String ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED 89284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED"; 90284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 91284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller /** 92d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * The ComponentName of the administrator component. 93d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * 94d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @see #ACTION_ADD_DEVICE_ADMIN 95d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 96d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN"; 973255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 98d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * An optional CharSequence providing additional explanation for why the 1008ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * admin is being added. 1018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 1028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @see #ACTION_ADD_DEVICE_ADMIN 1038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 1048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public static final String EXTRA_ADD_EXPLANATION = "android.app.extra.ADD_EXPLANATION"; 1053255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1063255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 1073255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Activity action: have the user enter a new password. This activity should 1083255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * be launched after using {@link #setPasswordQuality(ComponentName, int)}, 1093255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * or {@link #setPasswordMinimumLength(ComponentName, int)} to have the user 1103255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * enter a new password that meets the current requirements. You can use 1113255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #isActivePasswordSufficient()} to determine whether you need to 1123255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * have the user select a new password in order to meet the current 1133255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * constraints. Upon being resumed from this activity, you can check the new 1143255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * password characteristics to see if they are sufficient. 115d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 116d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 117d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public static final String ACTION_SET_NEW_PASSWORD 118d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn = "android.app.action.SET_NEW_PASSWORD"; 1193255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 120d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 121d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Return true if the given administrator component is currently 122d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * active (enabled) in the system. 123d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 124d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public boolean isAdminActive(ComponentName who) { 125d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 126d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 127d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn return mService.isAdminActive(who); 128d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 129d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 130d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 131d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 132d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return false; 133d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1343255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 135d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 136d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * Return a list of all currently active device administrator's component 137d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * names. Note that if there are no administrators than null may be 138d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn * returned. 139d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn */ 140d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn public List<ComponentName> getActiveAdmins() { 141d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn if (mService != null) { 142d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn try { 143d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn return mService.getActiveAdmins(); 144d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } catch (RemoteException e) { 145d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 146d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 147d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 148d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn return null; 149d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn } 1503255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 151d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn /** 15221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @hide 15321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 15421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public boolean packageHasActiveAdmins(String packageName) { 15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (mService != null) { 15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn try { 15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return mService.packageHasActiveAdmins(packageName); 15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } catch (RemoteException e) { 15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return false; 16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 1643255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 166d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Remove a current administration component. This can only be called 167d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * by the application that owns the administration component; if you 168d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * try to remove someone else's component, a security exception will be 169d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * thrown. 170d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 171d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void removeActiveAdmin(ComponentName who) { 172d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 173d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 174d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService.removeActiveAdmin(who); 175d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 176d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 177d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 178d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 179d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1803255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 181d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 182c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * Returns true if an administrator has been granted a particular device policy. This can 183c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * be used to check if the administrator was activated under an earlier set of policies, 184c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * but requires additional policies after an upgrade. 185c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * 186c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be 187c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * an active administrator, or an exception will be thrown. 188c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}. 189c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler */ 190c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler public boolean hasGrantedPolicy(ComponentName admin, int usesPolicy) { 191c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler if (mService != null) { 192c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler try { 193c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler return mService.hasGrantedPolicy(admin, usesPolicy); 194c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } catch (RemoteException e) { 195c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler Log.w(TAG, "Failed talking with device policy service", e); 196c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 197c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 198c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler return false; 199c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler } 200c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler 201c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler /** 2029327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the policy has no requirements 2039327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * for the password. Note that quality constants are ordered so that higher 204df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * values are more restrictive. 205d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2069327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_UNSPECIFIED = 0; 2073255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 208d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2099327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the policy requires some kind 2109327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * of password, but doesn't care what it is. Note that quality constants 211df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * are ordered so that higher values are more restrictive. 212df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn */ 2139327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_SOMETHING = 0x10000; 2143255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 215df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn /** 2169327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 2179327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * password containing at least numeric characters. Note that quality 2189327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * constants are ordered so that higher values are more restrictive. 219d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2209327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public static final int PASSWORD_QUALITY_NUMERIC = 0x20000; 2213255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 222d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2239327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 22485f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * password containing at least alphabetic (or other symbol) characters. 22585f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * Note that quality constants are ordered so that higher values are more 22685f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * restrictive. 22785f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn */ 22885f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn public static final int PASSWORD_QUALITY_ALPHABETIC = 0x40000; 2293255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 23085f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn /** 23185f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * Constant for {@link #setPasswordQuality}: the user must have entered a 2329327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * password containing at least <em>both></em> numeric <em>and</em> 23385f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * alphabetic (or other symbol) characters. Note that quality constants are 2349327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * ordered so that higher values are more restrictive. 235d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 23685f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn public static final int PASSWORD_QUALITY_ALPHANUMERIC = 0x50000; 2373255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 238d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 239a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Constant for {@link #setPasswordQuality}: the user must have entered a 240c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password containing at least a letter, a numerical digit and a special 241c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * symbol, by default. With this password quality, passwords can be 242c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * restricted to contain various sets of characters, like at least an 243c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * uppercase letter, etc. These are specified using various methods, 244c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * like {@link #setPasswordMinimumLowerCase(ComponentName, int)}. Note 245c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * that quality constants are ordered so that higher values are more 246c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * restrictive. 247a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 248a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public static final int PASSWORD_QUALITY_COMPLEX = 0x60000; 249a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 250a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 251d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 252d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password restrictions it is imposing. After setting this, the user 253d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will not be able to enter a new password that is not at least as 254d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * restrictive as what has been set. Note that the current password 255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will remain until the user has set a new one, so the change does not 256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * take place immediately. To prompt the user for a new password, use 257d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. 2583255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 2599327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * <p>Quality constants are ordered so that higher values are more restrictive; 2609327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * thus the highest requested quality constant (between the policy set here, 261df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * the user's preference, and any other considerations) is the one that 262df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * is in effect. 2633255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 2648aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 2658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 2668aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 2673255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 268ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 2699327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * @param quality The new desired quality. One of 2709327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #PASSWORD_QUALITY_UNSPECIFIED}, {@link #PASSWORD_QUALITY_SOMETHING}, 27185f2c9ce5a0e074df2429a5d66e1754e368a0430Dianne Hackborn * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_ALPHABETIC}, 272a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. 273d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2749327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public void setPasswordQuality(ComponentName admin, int quality) { 275d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 276d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 2779327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn mService.setPasswordQuality(admin, quality); 278d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 279d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 280d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 281d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 282d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2833255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 284d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 2859327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * Retrieve the current minimum password quality for all admins 286254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 287254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 288254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 289d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 2909327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public int getPasswordQuality(ComponentName admin) { 291d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 292d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 2939327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn return mService.getPasswordQuality(admin); 294d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 295d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 2989327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn return PASSWORD_QUALITY_UNSPECIFIED; 299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3003255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 303d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * minimum allowed password length. After setting this, the user 304d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will not be able to enter a new password that is not at least as 305d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * restrictive as what has been set. Note that the current password 306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * will remain until the user has set a new one, so the change does not 307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * take place immediately. To prompt the user for a new password, use 308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 309d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * constraint is only imposed if the administrator has also requested either 310a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_ALPHABETIC} 311a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} 3129327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * with {@link #setPasswordQuality}. 3133255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 3148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 3158aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 3168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 3173255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 318ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param length The new desired minimum password length. A value of 0 320d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * means there is no restriction. 321d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 322254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public void setPasswordMinimumLength(ComponentName admin, int length) { 323d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 324d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 325254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn mService.setPasswordMinimumLength(admin, length); 326d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 327d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 328d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 329d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 330d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3313255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 332d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 333254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current minimum password length for all admins 334254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 335254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 336254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 337d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 338254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public int getPasswordMinimumLength(ComponentName admin) { 339d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 340d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 341254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return mService.getPasswordMinimumLength(admin); 342d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 343d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 344d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 345d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 346d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return 0; 347d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 3483255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 349a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 350a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 351a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of upper case letters required in the password. After 352a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 353a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 354a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 355a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 356a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 357a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 358c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 359c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 0. 360a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 361a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 362a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 363a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 364a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 365a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 366a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 367a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of upper case letters 368a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * required in the password. A value of 0 means there is no 369a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restriction. 370a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 371a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumUpperCase(ComponentName admin, int length) { 372a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 373a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 374a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setPasswordMinimumUpperCase(admin, length); 375a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 376a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 377a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 378a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 379a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 380a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 381a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 382a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of upper case letters required in the 383c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 384c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumUpperCase(ComponentName, int)} 385c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 386c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 387a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 388a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 389a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 390a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of upper case letters required in the 391a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. 392a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 393a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumUpperCase(ComponentName admin) { 394a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 395a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 396a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return mService.getPasswordMinimumUpperCase(admin); 397a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 398a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 399a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 400a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 401a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 402a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 403a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 404a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 405a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 406a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of lower case letters required in the password. After 407a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 408a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 409a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 410a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 411a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 412a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 413c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 414c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 0. 415a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 416a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 417a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 418a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 419a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 420a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 421a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 422a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of lower case letters 423a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * required in the password. A value of 0 means there is no 424a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restriction. 425a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 426a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumLowerCase(ComponentName admin, int length) { 427a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 428a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 429a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setPasswordMinimumLowerCase(admin, length); 430a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 431a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 432a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 433a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 434a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 435a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 436a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 437a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of lower case letters required in the 438c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 439c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumLowerCase(ComponentName, int)} 440c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 441c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 442a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 443a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 444a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 445a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of lower case letters required in the 446a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. 447a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 448a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumLowerCase(ComponentName admin) { 449a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 450a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 451a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return mService.getPasswordMinimumLowerCase(admin); 452a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 453a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 454a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 455a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 456a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 457a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 458a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 459a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 460a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 461a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of letters required in the password. After setting this, 462a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * the user will not be able to enter a new password that is not at least as 463a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restrictive as what has been set. Note that the current password will 464a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * remain until the user has set a new one, so the change does not take 465a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * place immediately. To prompt the user for a new password, use 466a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 467a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 468c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 469c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 470a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 471a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 472a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 473a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 474a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 475a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 476a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 477a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of letters required in the 478a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. A value of 0 means there is no restriction. 479a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 480a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumLetters(ComponentName admin, int length) { 481a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 482a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 483a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setPasswordMinimumLetters(admin, length); 484a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 485a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 486a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 487a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 488a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 489a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 490a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 491a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of letters required in the password for all 492c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * admins or a particular one. This is the same value as 493c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumLetters(ComponentName, int)} 494c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 495c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 496a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 497a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 498a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 499a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of letters required in the password. 500a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 501a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumLetters(ComponentName admin) { 502a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 503a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 504a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return mService.getPasswordMinimumLetters(admin); 505a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 506a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 507a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 508a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 509a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 510a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 511a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 512a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 513a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 514a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of numerical digits required in the password. After 515a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * setting this, the user will not be able to enter a new password that is 516a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not at least as restrictive as what has been set. Note that the current 517a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password will remain until the user has set a new one, so the change does 518a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * not take place immediately. To prompt the user for a new password, use 519a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 520a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 521c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 522c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 523a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 524a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 525a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 526a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 527a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 528a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 529a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 530a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of numerical digits required 531a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * in the password. A value of 0 means there is no restriction. 532a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 533a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumNumeric(ComponentName admin, int length) { 534a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 535a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 536a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setPasswordMinimumNumeric(admin, length); 537a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 538a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 539a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 540a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 541a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 542a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 543a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 544a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of numerical digits required in the password 545c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * for all admins or a particular one. This is the same value as 546c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumNumeric(ComponentName, int)} 547c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 548c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 549a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 550a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 551a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 552a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of numerical digits required in the password. 553a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 554a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumNumeric(ComponentName admin) { 555a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 556a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 557a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return mService.getPasswordMinimumNumeric(admin); 558a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 559a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 560a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 561a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 562a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 563a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 564a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 565a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 566a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Called by an application that is administering the device to set the 567a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * minimum number of symbols required in the password. After setting this, 568a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * the user will not be able to enter a new password that is not at least as 569a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * restrictive as what has been set. Note that the current password will 570a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * remain until the user has set a new one, so the change does not take 571a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * place immediately. To prompt the user for a new password, use 572a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link #ACTION_SET_NEW_PASSWORD} after setting this value. This 573a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * constraint is only imposed if the administrator has also requested 574c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The 575c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * default value is 1. 576a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * <p> 577a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * The calling device admin must have requested 578a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 579a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 580a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 581a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 582a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * with. 583a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param length The new desired minimum number of symbols required in the 584a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * password. A value of 0 means there is no restriction. 585a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 586a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setPasswordMinimumSymbols(ComponentName admin, int length) { 587a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 588a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 589a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setPasswordMinimumSymbols(admin, length); 590a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 591a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 592a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 593a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 594a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 595a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 596a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev /** 597a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * Retrieve the current number of symbols required in the password for all 598c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * admins or a particular one. This is the same value as 599c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumSymbols(ComponentName, int)} 600c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 601c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 602a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * 603a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 604a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * aggregate all admins. 605a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev * @return The minimum number of symbols required in the password. 606a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev */ 607a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public int getPasswordMinimumSymbols(ComponentName admin) { 608a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev if (mService != null) { 609a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev try { 610a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return mService.getPasswordMinimumSymbols(admin); 611a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } catch (RemoteException e) { 612a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 613a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 614a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 615a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev return 0; 616a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev } 617a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev 618c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev /** 619c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * Called by an application that is administering the device to set the 620c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * minimum number of non-letter characters (numerical digits or symbols) 621c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * required in the password. After setting this, the user will not be able 622c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * to enter a new password that is not at least as restrictive as what has 623c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * been set. Note that the current password will remain until the user has 624c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set a new one, so the change does not take place immediately. To prompt 625c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} after 626c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * setting this value. This constraint is only imposed if the administrator 627c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * has also requested {@link #PASSWORD_QUALITY_COMPLEX} with 628c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #setPasswordQuality}. The default value is 0. 629c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * <p> 630c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * The calling device admin must have requested 631c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 632c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * this method; if it has not, a security exception will be thrown. 633c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * 634c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 635c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * with. 636c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param length The new desired minimum number of letters required in the 637c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password. A value of 0 means there is no restriction. 638c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev */ 639c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev public void setPasswordMinimumNonLetter(ComponentName admin, int length) { 640c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev if (mService != null) { 641c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev try { 642c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev mService.setPasswordMinimumNonLetter(admin, length); 643c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } catch (RemoteException e) { 644c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 645c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 646c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 647c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 648c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev 649c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev /** 650c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * Retrieve the current number of non-letter characters required in the 651c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * password for all admins or a particular one. This is the same value as 652c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * set by {#link {@link #setPasswordMinimumNonLetter(ComponentName, int)} 653c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * and only applies when the password quality is 654c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * {@link #PASSWORD_QUALITY_COMPLEX}. 655c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * 656c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @param admin The name of the admin component to check, or null to 657c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * aggregate all admins. 658c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev * @return The minimum number of letters required in the password. 659c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev */ 660c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev public int getPasswordMinimumNonLetter(ComponentName admin) { 661c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev if (mService != null) { 662c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev try { 663c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev return mService.getPasswordMinimumNonLetter(admin); 664c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } catch (RemoteException e) { 665c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 666c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 667c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 668c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev return 0; 669c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev } 670c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev 6713255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 6723255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Called by an application that is administering the device to set the length 6733255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * of the password history. After setting this, the user will not be able to 6743255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * enter a new password that is the same as any password in the history. Note 6753255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * that the current password will remain until the user has set a new one, so 6763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * the change does not take place immediately. To prompt the user for a new 6773255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * password, use {@link #ACTION_SET_NEW_PASSWORD} after setting this value. 6783255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * This constraint is only imposed if the administrator has also requested 6793255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * either {@link #PASSWORD_QUALITY_NUMERIC}, 6803255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHABETIC}, or 6813255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}. 6823255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 6833255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * <p> 6843255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * The calling device admin must have requested 6853255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this 6863255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * method; if it has not, a security exception will be thrown. 6873255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 6883255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param admin Which {@link DeviceAdminReceiver} this request is associated 6893255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * with. 6903255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param length The new desired length of password history. A value of 0 6913255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * means there is no restriction. 6923255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev */ 6933255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev public void setPasswordHistoryLength(ComponentName admin, int length) { 6943255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev if (mService != null) { 6953255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev try { 6963255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev mService.setPasswordHistoryLength(admin, length); 6973255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } catch (RemoteException e) { 6983255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 6993255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7003255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7013255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7023255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 7033255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev /** 704a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Called by a device admin to set the password expiration timeout. Calling this method 705a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * will restart the countdown for password expiration for the given admin, as will changing 706a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * the device password (for all admins). 707a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 708a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The provided timeout is the time delta in ms and will be added to the current time. 709a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * For example, to have the password expire 5 days from now, timeout would be 710a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 5 * 86400 * 1000 = 432000000 ms for timeout. 711a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 712a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>To disable password expiration, a value of 0 may be used for timeout. 713a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 714a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * <p>The calling device admin must have requested 715a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this 716a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * method; if it has not, a security exception will be thrown. 717a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 718a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 719a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 720a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * means there is no restriction (unlimited). 721a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 722a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public void setPasswordExpirationTimeout(ComponentName admin, long timeout) { 723a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 724a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 725a4e28d181942018ba8759989799a28fa88764ce3Jim Miller mService.setPasswordExpirationTimeout(admin, timeout); 726a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 727a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 728a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 729a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 730a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 731a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 732a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 7336b85768058b065cc682757a366abc828c9ca727aJim Miller * Get the password expiration timeout for the given admin. The expiration timeout is the 7346b85768058b065cc682757a366abc828c9ca727aJim Miller * recurring expiration timeout provided in the call to 7356b85768058b065cc682757a366abc828c9ca727aJim Miller * {@link #setPasswordExpirationTimeout(ComponentName, long)} for the given admin or the 7366b85768058b065cc682757a366abc828c9ca727aJim Miller * aggregate of all policy administrators if admin is null. 737a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 738a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin The name of the admin component to check, or null to aggregate all admins. 739a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @return The timeout for the given admin or the minimum of all timeouts 740a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 741a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public long getPasswordExpirationTimeout(ComponentName admin) { 742a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 743a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 744a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return mService.getPasswordExpirationTimeout(admin); 745a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 746a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 747a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 748a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 749a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return 0; 750a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 751a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 752a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 753a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * Get the current password expiration time for the given admin or an aggregate of 7546b85768058b065cc682757a366abc828c9ca727aJim Miller * all admins if admin is null. If the password is expired, this will return the time since 7556b85768058b065cc682757a366abc828c9ca727aJim Miller * the password expired as a negative number. If admin is null, then a composite of all 7566b85768058b065cc682757a366abc828c9ca727aJim Miller * expiration timeouts is returned - which will be the minimum of all timeouts. 757a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * 758a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @param admin The name of the admin component to check, or null to aggregate all admins. 759a4e28d181942018ba8759989799a28fa88764ce3Jim Miller * @return The password expiration time, in ms. 760a4e28d181942018ba8759989799a28fa88764ce3Jim Miller */ 761a4e28d181942018ba8759989799a28fa88764ce3Jim Miller public long getPasswordExpiration(ComponentName admin) { 762a4e28d181942018ba8759989799a28fa88764ce3Jim Miller if (mService != null) { 763a4e28d181942018ba8759989799a28fa88764ce3Jim Miller try { 764a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return mService.getPasswordExpiration(admin); 765a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } catch (RemoteException e) { 766a4e28d181942018ba8759989799a28fa88764ce3Jim Miller Log.w(TAG, "Failed talking with device policy service", e); 767a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 768a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 769a4e28d181942018ba8759989799a28fa88764ce3Jim Miller return 0; 770a4e28d181942018ba8759989799a28fa88764ce3Jim Miller } 771a4e28d181942018ba8759989799a28fa88764ce3Jim Miller 772a4e28d181942018ba8759989799a28fa88764ce3Jim Miller /** 7733255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * Retrieve the current password history length for all admins 7743255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * or a particular one. 7753255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @param admin The name of the admin component to check, or null to aggregate 7763255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * all admins. 7773255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * @return The length of the password history 7783255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev */ 7793255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev public int getPasswordHistoryLength(ComponentName admin) { 7803255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev if (mService != null) { 7813255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev try { 7823255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev return mService.getPasswordHistoryLength(admin); 7833255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } catch (RemoteException e) { 7843255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev Log.w(TAG, "Failed talking with device policy service", e); 7853255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7863255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7873255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev return 0; 7883255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev } 7893255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 790d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 791254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Return the maximum password length that the device supports for a 7929327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * particular password quality. 793364f6e3d44c27cd17fe0f3fca844465e9a502636Dianne Hackborn * @param quality The quality being interrogated. 794254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @return Returns the maximum length that the user can enter. 795254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn */ 7969327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn public int getPasswordMaximumLength(int quality) { 797254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn // Kind-of arbitrary. 798254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return 16; 799254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 8003255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 801254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn /** 802df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * Determine whether the current password the user has set is sufficient 8039327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * to meet the policy requirements (quality, minimum length) that have been 804df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * requested. 8053255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 8068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 8078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call 8088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 8093255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 810df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @return Returns true if the password meets the current requirements, 811df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * else false. 812d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 813df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn public boolean isActivePasswordSufficient() { 814d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 815d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 816df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn return mService.isActivePasswordSufficient(); 817d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 818d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 819d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 820d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 821df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn return false; 822d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 8233255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 824d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 825d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Retrieve the number of times the user has failed at entering a 826d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * password since that last successful password entry. 8273255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 8288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 8298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call 8308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 831d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 832d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public int getCurrentFailedPasswordAttempts() { 833d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 834d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 835d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mService.getCurrentFailedPasswordAttempts(); 836d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 837d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 838d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 839d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 840d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return -1; 841d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 842df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn 843df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn /** 84488209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * Setting this to a value greater than zero enables a built-in policy 84588209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * that will perform a device wipe after too many incorrect 84688209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * device-unlock passwords have been entered. This built-in policy combines 84788209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * watching for failed passwords and wiping the device, and requires 84888209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and 8498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}. 8503255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 85188209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * <p>To implement any other policy (e.g. wiping data for a particular 85288209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * application only, erasing or revoking credentials, or reporting the 85388209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * failure to a server), you should implement 854ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} 85588209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * instead. Do not use this API, because if the maximum count is reached, 85688209d15dd5fcb883403525a6455857566e3aee7Andrew Stadler * the device will be wiped immediately, and your callback will not be invoked. 8573255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 858ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 8598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @param num The number of failed password attempts at which point the 8608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * device will wipe its data. 8618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 8628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void setMaximumFailedPasswordsForWipe(ComponentName admin, int num) { 8638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (mService != null) { 8648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn try { 8658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mService.setMaximumFailedPasswordsForWipe(admin, num); 8668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } catch (RemoteException e) { 8678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 8688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 8698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 8708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 8713255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 8728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 873254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current maximum number of login attempts that are allowed 874254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * before the device wipes itself, for all admins 875254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 876254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 877254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 878254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn */ 879254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public int getMaximumFailedPasswordsForWipe(ComponentName admin) { 880254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn if (mService != null) { 881254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn try { 882254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return mService.getMaximumFailedPasswordsForWipe(admin); 883254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } catch (RemoteException e) { 884254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 885254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 886254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 887254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return 0; 888254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 8893255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 890254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn /** 89187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * Flag for {@link #resetPassword}: don't allow other admins to change 89287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * the password again until the user has entered it. 89387bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn */ 89487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001; 8953255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 89687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn /** 897ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * Force a new device unlock password (the password needed to access the 898ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * entire device, not for individual accounts) on the user. This takes 899ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * effect immediately. 9009327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * The given password must be sufficient for the 9019327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * current password quality and length constraints as returned by 9029327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #getPasswordQuality(ComponentName)} and 9039327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet 9049327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * these constraints, then it will be rejected and false returned. Note 9059327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * that the password may be a stronger quality (containing alphanumeric 9069327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * characters when the requested quality is only numeric), in which case 9079327f4f671de3cbb795612bf4f314ceff88de865Dianne Hackborn * the currently active quality will be increased to match. 9083255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 9098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 9108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call 9118aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 9123255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 913df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @param password The new password for the user. 91487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn * @param flags May be 0 or {@link #RESET_PASSWORD_REQUIRE_ENTRY}. 915df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @return Returns true if the password was applied, or false if it is 916df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * not acceptable for the current constraints. 917df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn */ 91887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn public boolean resetPassword(String password, int flags) { 919df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn if (mService != null) { 920df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn try { 92187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn return mService.resetPassword(password, flags); 922df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } catch (RemoteException e) { 923df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 924df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 925df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 926df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn return false; 927df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 9283255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 929d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 930d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Called by an application that is administering the device to set the 931d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * maximum time for user activity until the device will lock. This limits 932d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * the length that the user can set. It takes effect immediately. 9333255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 9348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 935315ada7fbb9e967c22e87b4921bec720ceb2c73cDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call 9368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 9373255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 938ef6b22fc04a8d5ab26e13efac8069c097e0da7c9Dianne Hackborn * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 939d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @param timeMs The new desired maximum time to lock in milliseconds. 940d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * A value of 0 means there is no restriction. 941d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 942d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void setMaximumTimeToLock(ComponentName admin, long timeMs) { 943d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 944d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 945d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService.setMaximumTimeToLock(admin, timeMs); 946d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 947d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 948d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 949d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 950d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 9513255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 952d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 953254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * Retrieve the current maximum time to unlock for all admins 954254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * or a particular one. 955254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * @param admin The name of the admin component to check, or null to aggregate 956254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * all admins. 957d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 958254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public long getMaximumTimeToLock(ComponentName admin) { 959d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 960d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 961254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn return mService.getMaximumTimeToLock(admin); 962d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 963d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 964d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 965d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 966d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return 0; 967d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 9683255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 969d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 970df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * Make the device lock immediately, as if the lock screen timeout has 971df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * expired at the point of this call. 9723255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 9738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 9748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call 9758aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 976d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 977df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn public void lockNow() { 978df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn if (mService != null) { 979df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn try { 980df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn mService.lockNow(); 981df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } catch (RemoteException e) { 982df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 983df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 984df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 985df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 9863255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 987d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 988424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn * Flag for {@link #wipeData(int)}: also erase the device's external 989424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn * storage. 990424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn */ 991424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn public static final int WIPE_EXTERNAL_STORAGE = 0x0001; 992424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn 993424991704b5fb7a64f6cf0fcc3f4b1aabbf2a2e0Dianne Hackborn /** 994d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * Ask the user date be wiped. This will cause the device to reboot, 995df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * erasing all user data while next booting up. External storage such 996df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * as SD cards will not be erased. 9973255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 9988aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * <p>The calling device admin must have requested 9998aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to be able to call 10008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * this method; if it has not, a security exception will be thrown. 10013255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev * 1002df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn * @param flags Bit mask of additional options: currently must be 0. 1003d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1004d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void wipeData(int flags) { 1005d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1006d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1007d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService.wipeData(flags); 1008d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1009d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1010d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1011d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1012d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 10133255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1014d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 101569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Called by an application that is administering the device to set the 101669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * global proxy and exclusion list. 101769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * <p> 101869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * The calling device admin must have requested 101969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * {@link DeviceAdminInfo#USES_POLICY_SETS_GLOBAL_PROXY} to be able to call 102069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * this method; if it has not, a security exception will be thrown. 102169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Only the first device admin can set the proxy. If a second admin attempts 102269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * to set the proxy, the {@link ComponentName} of the admin originally setting the 102369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * proxy will be returned. If successful in setting the proxy, null will 102469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * be returned. 102569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * The method can be called repeatedly by the device admin alrady setting the 102669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * proxy to update the proxy and exclusion list. 102769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * 102869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param admin Which {@link DeviceAdminReceiver} this request is associated 102969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * with. 103069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param proxySpec the global proxy desired. Must be an HTTP Proxy. 103169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Pass Proxy.NO_PROXY to reset the proxy. 103269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @param exclusionList a list of domains to be excluded from the global proxy. 103369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @return returns null if the proxy was successfully set, or a {@link ComponentName} 103469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * of the device admin that sets thew proxy otherwise. 103569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor */ 103669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor public ComponentName setGlobalProxy(ComponentName admin, Proxy proxySpec, 103769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor List<String> exclusionList ) { 103869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (proxySpec == null) { 103969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor throw new NullPointerException(); 104069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 104169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (mService != null) { 104269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor try { 104369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String hostSpec; 104469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String exclSpec; 104569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (proxySpec.equals(Proxy.NO_PROXY)) { 104669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor hostSpec = null; 104769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = null; 104869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 104969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (!proxySpec.type().equals(Proxy.Type.HTTP)) { 105069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor throw new IllegalArgumentException(); 105169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 105269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor InetSocketAddress sa = (InetSocketAddress)proxySpec.address(); 105369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor String hostName = sa.getHostName(); 105469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor int port = sa.getPort(); 105569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor StringBuilder hostBuilder = new StringBuilder(); 105669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor hostSpec = hostBuilder.append(hostName) 105769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor .append(":").append(Integer.toString(port)).toString(); 105869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (exclusionList == null) { 105969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = ""; 106069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 106169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor StringBuilder listBuilder = new StringBuilder(); 106269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor boolean firstDomain = true; 106369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor for (String exclDomain : exclusionList) { 106469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (!firstDomain) { 106569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor listBuilder = listBuilder.append(","); 106669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } else { 106769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor firstDomain = false; 106869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 106969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor listBuilder = listBuilder.append(exclDomain.trim()); 107069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 107169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor exclSpec = listBuilder.toString(); 107269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 107369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec); 107469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 107569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return mService.setGlobalProxy(admin, hostSpec, exclSpec); 107669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } catch (RemoteException e) { 107769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor Log.w(TAG, "Failed talking with device policy service", e); 107869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 107969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 108069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return null; 108169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 108269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 108369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor /** 108469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * Returns the component name setting the global proxy. 108569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * @return ComponentName object of the device admin that set the global proxy, or 108669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor * null if no admin has set the proxy. 108769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor */ 108869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor public ComponentName getGlobalProxyAdmin() { 108969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor if (mService != null) { 109069238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor try { 109169238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return mService.getGlobalProxyAdmin(); 109269238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } catch (RemoteException e) { 109369238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor Log.w(TAG, "Failed talking with device policy service", e); 109469238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 109569238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 109669238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor return null; 109769238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor } 109869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 109969238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor /** 110022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11017b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is not supported. 11027b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11037b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0; 11047b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11057b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 110622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11077b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is supported, but is not currently active. 11087b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11097b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final int ENCRYPTION_STATUS_INACTIVE = 1; 11107b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11117b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 111222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11137b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is not currently active, but is currently 11147b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * being activated. This is only reported by devices that support 11157b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * encryption of data and only when the storage is currently 11167b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * undergoing a process of becoming encrypted. A device that must reboot and/or wipe data 11177b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * to become encrypted will never return this value. 11187b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 111922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public static final int ENCRYPTION_STATUS_ACTIVATING = 2; 11207b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11217b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 112222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}: 11237b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * indicating that encryption is active. 11247b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 112522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public static final int ENCRYPTION_STATUS_ACTIVE = 3; 11267b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11277b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 11287b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Activity action: begin the process of encrypting data on the device. This activity should 11297b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * be launched after using {@link #setStorageEncryption} to request encryption be activated. 11307b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * After resuming from this activity, use {@link #getStorageEncryption} 11317b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * to check encryption status. However, on some devices this activity may never return, as 11327b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * it may trigger a reboot and in some cases a complete data wipe of the device. 11337b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11347b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 11357b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public static final String ACTION_START_ENCRYPTION 11367b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler = "android.app.action.START_ENCRYPTION"; 11377b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11387b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 11397b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Called by an application that is administering the device to 114022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * request that the storage system be encrypted. 11417b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 11427b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>When multiple device administrators attempt to control device 11437b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * encryption, the most secure, supported setting will always be 11447b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * used. If any device administrator requests device encryption, 11457b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * it will be enabled; Conversely, if a device administrator 11467b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * attempts to disable device encryption while another 11477b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * device administrator has enabled it, the call to disable will 11487b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}). 11497b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 11507b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>This policy controls encryption of the secure (application data) storage area. Data 11517b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * written to other areas (e.g. the directory returned by 11527b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * {@link android.os.Environment#getExternalStorageDirectory()} may or may not be encrypted. 11537b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 11547b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * <p>Important Note: On some devices, it is possible to encrypt storage without requiring 11557b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * the user to create a device PIN or Password. In this case, the storage is encrypted, but 11567b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * the encryption key may not be fully secured. For maximum security, the administrator should 11577b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * also require (and check for) a pattern, PIN, or password. 11587b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 11597b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. 11607b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * @param encrypt true to request encryption, false to release any previous request 116122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return the new request status (for all active admins) - will be one of 116222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or 116322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use 116422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #getStorageEncryptionStatus()} to query the actual device state. 11657b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 11667b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler public int setStorageEncryption(ComponentName admin, boolean encrypt) { 11677b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler if (mService != null) { 11687b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler try { 11697b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return mService.setStorageEncryption(admin, encrypt); 11707b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } catch (RemoteException e) { 11717b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler Log.w(TAG, "Failed talking with device policy service", e); 11727b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 11737b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 11747b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return ENCRYPTION_STATUS_UNSUPPORTED; 11757b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 11767b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 11777b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 11787b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * Called by an application that is administering the device to 117922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * determine the requested setting for secure storage. 11807b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler * 118122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null, 118222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * this will return the requested encryption setting as an aggregate of all active 118322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * administrators. 118422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return true if the admin(s) are requesting encryption, false if not. 11857b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler */ 118622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public boolean getStorageEncryption(ComponentName admin) { 11877b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler if (mService != null) { 11887b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler try { 11897b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return mService.getStorageEncryption(admin); 11907b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } catch (RemoteException e) { 119122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler Log.w(TAG, "Failed talking with device policy service", e); 119222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 119322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 119422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler return false; 119522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } 119622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler 119722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler /** 119822dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Called by an application that is administering the device to 119922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * determine the current encryption status of the device. 120022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * 120122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * Depending on the returned status code, the caller may proceed in different 120222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * ways. If the result is {@link #ENCRYPTION_STATUS_UNSUPPORTED}, the 120322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * storage system does not support encryption. If the 120422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * result is {@link #ENCRYPTION_STATUS_INACTIVE}, use {@link 120522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * #ACTION_START_ENCRYPTION} to begin the process of encrypting or decrypting the 120622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * storage. If the result is {@link #ENCRYPTION_STATUS_ACTIVATING} or 120722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVE}, no further action is required. 120822dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * 120922dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * @return current status of encryption. The value will be one of 121022dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, 121122dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler * {@link #ENCRYPTION_STATUS_ACTIVATING}, or{@link #ENCRYPTION_STATUS_ACTIVE}. 121222dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler */ 121322dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler public int getStorageEncryptionStatus() { 121422dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler if (mService != null) { 121522dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler try { 121622dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler return mService.getStorageEncryptionStatus(); 121722dbfda976aab9ae897eed0625e2e64ead32bbc4Andy Stadler } catch (RemoteException e) { 12187b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler Log.w(TAG, "Failed talking with device policy service", e); 12197b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12207b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12217b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler return ENCRYPTION_STATUS_UNSUPPORTED; 12227b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler } 12237b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler 12247b0f8f08ac7b3ed5cf462b92283713b033d6a64aAndy Stadler /** 1225d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1226d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1227c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler public void setActiveAdmin(ComponentName policyReceiver, boolean refreshing) { 1228d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1229d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1230c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler mService.setActiveAdmin(policyReceiver, refreshing); 1231d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1232d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1233d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1234d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1235d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 12363255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1237d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1238c25f70a440ef9468085b8d98c8416c7e8b116753Andy Stadler * Returns the DeviceAdminInfo as defined by the administrator's package info & meta-data 1239d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1240d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1241d47c6ed4a9f2b5bd31f6c806b74701428efe458bDianne Hackborn public DeviceAdminInfo getAdminInfo(ComponentName cn) { 1242d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ActivityInfo ai; 1243d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1244d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ai = mContext.getPackageManager().getReceiverInfo(cn, 1245d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn PackageManager.GET_META_DATA); 1246d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1247d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to retrieve device policy " + cn, e); 1248d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1249d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 12503255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1251d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ResolveInfo ri = new ResolveInfo(); 1252d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn ri.activityInfo = ai; 12533255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1254d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1255d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return new DeviceAdminInfo(mContext, ri); 1256d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (XmlPullParserException e) { 1257d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to parse device policy " + cn, e); 1258d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1259d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (IOException e) { 1260d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Unable to parse device policy " + cn, e); 1261d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return null; 1262d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1263d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 12643255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1265d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1266d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 12678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 12688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void getRemoveWarning(ComponentName admin, RemoteCallback result) { 12698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (mService != null) { 12708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn try { 12718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mService.getRemoveWarning(admin, result); 12728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } catch (RemoteException e) { 12738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 12748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 12758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 12768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 12778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 12788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn /** 12798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @hide 1280d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1281a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev public void setActivePasswordState(int quality, int length, int letters, int uppercase, 1282c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev int lowercase, int numbers, int symbols, int nonletter) { 1283d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1284d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1285a15dcfaf2bc7cbd13b30db6766afe3bbaa01db97Konstantin Lopyrev mService.setActivePasswordState(quality, length, letters, uppercase, lowercase, 1286c857740f242169f2ca7fd42f0d1268661b399ad6Konstantin Lopyrev numbers, symbols, nonletter); 1287d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1288d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1289d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1290d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1291d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 12923255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1293d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1294d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1295d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1296d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void reportFailedPasswordAttempt() { 1297d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1298d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1299d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService.reportFailedPasswordAttempt(); 1300d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1301d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1302d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1303d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1304d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 13053255823de062e981f7bfc7994919207988697e45Konstantin Lopyrev 1306d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn /** 1307d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * @hide 1308d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn */ 1309d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn public void reportSuccessfulPasswordAttempt() { 1310d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mService != null) { 1311d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn try { 1312d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mService.reportSuccessfulPasswordAttempt(); 1313d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } catch (RemoteException e) { 1314d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn Log.w(TAG, "Failed talking with device policy service", e); 1315d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1316d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1317d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 131869238c6a37ae43c748ad9cd7613f2209149ee7daOscar Montemayor 1319d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn} 1320