1ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller/* 2ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * Copyright (C) 2013 The Android Open Source Project 3ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * 4ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * you may not use this file except in compliance with the License. 6ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * You may obtain a copy of the License at 7ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * 8ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * http://www.apache.org/licenses/LICENSE-2.0 9ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * 10ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * Unless required by applicable law or agreed to in writing, software 11ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * See the License for the specific language governing permissions and 14ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * limitations under the License. 15ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller */ 16ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 17ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerpackage com.android.internal.policy.impl.keyguard; 18ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 19ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport android.app.ActivityManager; 20ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport android.content.Context; 21ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport android.os.RemoteException; 22ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport android.util.Slog; 23ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 24ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport com.android.internal.policy.IKeyguardService; 25ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport com.android.internal.policy.IKeyguardStateCallback; 26ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport com.android.internal.widget.LockPatternUtils; 27ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 28ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller/** 29ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * Maintains a cached copy of Keyguard's state. 30ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller * @hide 31ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller */ 32ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerpublic class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { 33ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private static final String TAG = "KeyguardStateMonitor"; 34ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 35ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller // These cache the current state of Keyguard to improve performance and avoid deadlock. After 36ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller // Keyguard changes its state, it always triggers a layout in window manager. Because 37ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller // IKeyguardStateCallback is synchronous and because these states are declared volatile, it's 38ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller // guaranteed that window manager picks up the new state all the time in the layout caused by 39ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller // the state change of Keyguard. 40ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private volatile boolean mIsShowing; 41ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private volatile boolean mSimSecure; 42ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private volatile boolean mInputRestricted; 43ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 44ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private final LockPatternUtils mLockPatternUtils; 45ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 46ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public KeyguardStateMonitor(Context context, IKeyguardService service) { 47ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mLockPatternUtils = new LockPatternUtils(context); 48ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mLockPatternUtils.setCurrentUser(ActivityManager.getCurrentUser()); 49ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller try { 50ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller service.addStateMonitorCallback(this); 51ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } catch (RemoteException e) { 52ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller Slog.w(TAG, "Remote Exception", e); 53ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 54ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 55ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 56ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public boolean isShowing() { 57ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller return mIsShowing; 58ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 59ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 60ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public boolean isSecure() { 61ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller return mLockPatternUtils.isSecure() || mSimSecure; 62ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 63ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 64ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public boolean isInputRestricted() { 65ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller return mInputRestricted; 66ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 67ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 68ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 69ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void onShowingStateChanged(boolean showing) { 70ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mIsShowing = showing; 71ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 72ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 73ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 74ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void onSimSecureStateChanged(boolean simSecure) { 75ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mSimSecure = simSecure; 76ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 77ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 78ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void setCurrentUser(int userId) { 79ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mLockPatternUtils.setCurrentUser(userId); 80ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 81ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 82ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 83ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void onInputRestrictedStateChanged(boolean inputRestricted) { 84ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mInputRestricted = inputRestricted; 85ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 86ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller}