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