/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.keyguard; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.telephony.SubscriptionManager; import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; public class KeyguardSecurityModel { /** * The different types of security available. * @see KeyguardSecurityContainer#showSecurityScreen */ public enum SecurityMode { Invalid, // NULL state None, // No security enabled Pattern, // Unlock by drawing a pattern. Password, // Unlock by entering an alphanumeric password PIN, // Strictly numeric password SimPin, // Unlock by entering a sim pin. SimPuk // Unlock by entering a sim puk } private final Context mContext; private final boolean mIsPukScreenAvailable; private LockPatternUtils mLockPatternUtils; KeyguardSecurityModel(Context context) { mContext = context; mLockPatternUtils = new LockPatternUtils(context); mIsPukScreenAvailable = mContext.getResources().getBoolean( com.android.internal.R.bool.config_enable_puk_unlock_screen); } void setLockPatternUtils(LockPatternUtils utils) { mLockPatternUtils = utils; } SecurityMode getSecurityMode(int userId) { KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); if (mIsPukScreenAvailable && SubscriptionManager.isValidSubscriptionId( monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))) { return SecurityMode.SimPuk; } if (SubscriptionManager.isValidSubscriptionId( monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED))) { return SecurityMode.SimPin; } final int security = mLockPatternUtils.getActivePasswordQuality(userId); switch (security) { case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: return SecurityMode.PIN; case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: case DevicePolicyManager.PASSWORD_QUALITY_MANAGED: return SecurityMode.Password; case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: return SecurityMode.Pattern; case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED: return SecurityMode.None; default: throw new IllegalStateException("Unknown security quality:" + security); } } }