1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/*
2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project
3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License.
6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at
7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software
11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and
14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License.
15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */
165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.admin.DevicePolicyManager;
19dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context;
2052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager;
21dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.telephony.IccCardConstants;
23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils;
24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardSecurityModel {
2646842d946d1777c22f05e6bb96933c1b5cbd00d4Adrian Roos
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
28c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     * The different types of security available.
29c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     * @see KeyguardSecurityContainer#showSecurityScreen
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
31a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    public enum SecurityMode {
3263f9b81795559443e0376985f8aaaa97a359ef94Jim Miller        Invalid, // NULL state
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        None, // No security enabled
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        Pattern, // Unlock by drawing a pattern.
3569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        Password, // Unlock by entering an alphanumeric password
3669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        PIN, // Strictly numeric password
37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        SimPin, // Unlock by entering a sim pin.
38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        SimPuk // Unlock by entering a sim puk
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
41c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private final Context mContext;
42c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private final boolean mIsPukScreenAvailable;
43c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
46dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    KeyguardSecurityModel(Context context) {
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mContext = context;
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = new LockPatternUtils(context);
49c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        mIsPukScreenAvailable = mContext.getResources().getBoolean(
50c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                com.android.internal.R.bool.config_enable_puk_unlock_screen);
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    void setLockPatternUtils(LockPatternUtils utils) {
54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
578702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev    SecurityMode getSecurityMode(int userId) {
5852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
59c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
60a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (SubscriptionManager.isValidSubscriptionId(
61a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville                monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED))) {
62c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            return SecurityMode.SimPin;
63c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        }
64c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
65c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        if (mIsPukScreenAvailable && SubscriptionManager.isValidSubscriptionId(
66c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))) {
67c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            return SecurityMode.SimPuk;
68c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        }
69c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
708702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev        final int security = mLockPatternUtils.getActivePasswordQuality(userId);
71c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        switch (security) {
72c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
73c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
74c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                return SecurityMode.PIN;
75c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
76c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
77c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
78c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
7979675b326c5d5f49af1e2314b3d6b1466c857fe2Toni Barzic            case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
80c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                return SecurityMode.Password;
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
82c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
83c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                return SecurityMode.Pattern;
84c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
85c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                return SecurityMode.None;
86258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller
87c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            default:
88c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                throw new IllegalStateException("Unknown security quality:" + security);
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
92