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