blob: 941cd4441e23ae7b37cbe82b923e6702f7dd3b4e [file] [log] [blame]
Jim Millerab954542014-10-10 18:21:49 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jorim Jaggib10e33f2015-02-04 21:57:40 +010017package com.android.server.policy.keyguard;
Jim Millerab954542014-10-10 18:21:49 -070018
19import android.app.ActivityManager;
20import android.content.Context;
21import android.os.RemoteException;
22import android.util.Slog;
23
24import com.android.internal.policy.IKeyguardService;
25import com.android.internal.policy.IKeyguardStateCallback;
26import com.android.internal.widget.LockPatternUtils;
27
Jorim Jaggi84dc08a2015-09-11 17:45:22 -070028import java.io.PrintWriter;
29
Jim Millerab954542014-10-10 18:21:49 -070030/**
31 * Maintains a cached copy of Keyguard's state.
32 * @hide
33 */
34public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub {
35 private static final String TAG = "KeyguardStateMonitor";
36
37 // These cache the current state of Keyguard to improve performance and avoid deadlock. After
38 // Keyguard changes its state, it always triggers a layout in window manager. Because
39 // IKeyguardStateCallback is synchronous and because these states are declared volatile, it's
40 // guaranteed that window manager picks up the new state all the time in the layout caused by
Adrian Roos02a28882015-06-03 17:06:46 -070041 // the state change of Keyguard. To be extra safe, assume most restrictive values until Keyguard
42 // tells us the actual value.
43 private volatile boolean mIsShowing = true;
44 private volatile boolean mSimSecure = true;
45 private volatile boolean mInputRestricted = true;
Adrian Roosd88eb262016-08-04 14:50:48 -070046 private volatile boolean mTrusted = false;
Jorim Jaggid11d1a92016-08-16 16:02:32 -070047 private volatile boolean mHasLockscreenWallpaper = false;
Jim Millerab954542014-10-10 18:21:49 -070048
Adrian Roosd6aa6cb2015-04-16 19:31:29 -070049 private int mCurrentUserId;
50
Jim Millerab954542014-10-10 18:21:49 -070051 private final LockPatternUtils mLockPatternUtils;
Jorim Jaggie69c9312016-10-31 18:24:38 -070052 private final StateCallback mCallback;
Jim Millerab954542014-10-10 18:21:49 -070053
Jorim Jaggie69c9312016-10-31 18:24:38 -070054 public KeyguardStateMonitor(Context context, IKeyguardService service, StateCallback callback) {
Jim Millerab954542014-10-10 18:21:49 -070055 mLockPatternUtils = new LockPatternUtils(context);
Adrian Roosd6aa6cb2015-04-16 19:31:29 -070056 mCurrentUserId = ActivityManager.getCurrentUser();
Jorim Jaggie69c9312016-10-31 18:24:38 -070057 mCallback = callback;
Jorim Jaggife762342016-10-13 14:33:27 +020058
Jim Millerab954542014-10-10 18:21:49 -070059 try {
60 service.addStateMonitorCallback(this);
61 } catch (RemoteException e) {
62 Slog.w(TAG, "Remote Exception", e);
63 }
64 }
65
66 public boolean isShowing() {
67 return mIsShowing;
68 }
69
Jim Millere4044bb2016-05-10 18:38:25 -070070 public boolean isSecure(int userId) {
71 return mLockPatternUtils.isSecure(userId) || mSimSecure;
Jim Millerab954542014-10-10 18:21:49 -070072 }
73
74 public boolean isInputRestricted() {
75 return mInputRestricted;
76 }
77
Adrian Roosd88eb262016-08-04 14:50:48 -070078 public boolean isTrusted() {
79 return mTrusted;
80 }
81
Jorim Jaggid11d1a92016-08-16 16:02:32 -070082 public boolean hasLockscreenWallpaper() {
83 return mHasLockscreenWallpaper;
84 }
85
Jim Millerab954542014-10-10 18:21:49 -070086 @Override // Binder interface
87 public void onShowingStateChanged(boolean showing) {
88 mIsShowing = showing;
89 }
90
91 @Override // Binder interface
92 public void onSimSecureStateChanged(boolean simSecure) {
93 mSimSecure = simSecure;
94 }
95
Adrian Roosd6aa6cb2015-04-16 19:31:29 -070096 public synchronized void setCurrentUser(int userId) {
97 mCurrentUserId = userId;
98 }
99
100 private synchronized int getCurrentUser() {
101 return mCurrentUserId;
Jim Millerab954542014-10-10 18:21:49 -0700102 }
103
104 @Override // Binder interface
105 public void onInputRestrictedStateChanged(boolean inputRestricted) {
106 mInputRestricted = inputRestricted;
107 }
Jorim Jaggi84dc08a2015-09-11 17:45:22 -0700108
Adrian Roosd88eb262016-08-04 14:50:48 -0700109 @Override // Binder interface
110 public void onTrustedChanged(boolean trusted) {
111 mTrusted = trusted;
Jorim Jaggie69c9312016-10-31 18:24:38 -0700112 mCallback.onTrustedChanged();
Adrian Roosd88eb262016-08-04 14:50:48 -0700113 }
114
Jorim Jaggid11d1a92016-08-16 16:02:32 -0700115 @Override // Binder interface
116 public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) {
117 mHasLockscreenWallpaper = hasLockscreenWallpaper;
118 }
119
Jorim Jaggie69c9312016-10-31 18:24:38 -0700120 public interface StateCallback {
121 void onTrustedChanged();
122 }
123
Jorim Jaggi84dc08a2015-09-11 17:45:22 -0700124 public void dump(String prefix, PrintWriter pw) {
125 pw.println(prefix + TAG);
126 prefix += " ";
127 pw.println(prefix + "mIsShowing=" + mIsShowing);
128 pw.println(prefix + "mSimSecure=" + mSimSecure);
129 pw.println(prefix + "mInputRestricted=" + mInputRestricted);
Adrian Roosd88eb262016-08-04 14:50:48 -0700130 pw.println(prefix + "mTrusted=" + mTrusted);
Jorim Jaggi84dc08a2015-09-11 17:45:22 -0700131 pw.println(prefix + "mCurrentUserId=" + mCurrentUserId);
132 }
Jim Millerab954542014-10-10 18:21:49 -0700133}