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}