summaryrefslogtreecommitdiffstats
path: root/policy
diff options
context:
space:
mode:
authorJim Miller <jaggies@google.com>2014-10-10 18:21:49 -0700
committerJorim Jaggi <jjaggi@google.com>2014-11-25 23:22:52 +0100
commitab954546dc49e1070ed8513efbddc8954b529c23 (patch)
tree3b21b5955fe49df391b6ca2500cdc0447716d160 /policy
parentfb6121e069f25dd43e15b1377fe4d5f60c3d0dbe (diff)
downloadframeworks_base-ab954546dc49e1070ed8513efbddc8954b529c23.zip
frameworks_base-ab954546dc49e1070ed8513efbddc8954b529c23.tar.gz
frameworks_base-ab954546dc49e1070ed8513efbddc8954b529c23.tar.bz2
Make IKeyguardService interface asynchronous
Add a state callback so lockscreen reports back whenever its state relevant for PhoneWindowManager changed, instead of synchronously calling into SysUI which can lead to deadlocks. Directly use LockPatternUtils for isSecure, and optimize the number of calls to this method to optimize layout performance. Bug: 17677097 Change-Id: I5d491fc8884d4f84d9562626b9ea0d5eaa5166fc
Diffstat (limited to 'policy')
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java74
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java41
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java100
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java86
4 files changed, 172 insertions, 129 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index dea9932..1271737 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -103,8 +103,6 @@ import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import com.android.internal.R;
-import com.android.internal.policy.IKeyguardService;
-import com.android.internal.policy.IKeyguardServiceConstants;
import com.android.internal.policy.PolicyManager;
import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate;
import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate.ShowListener;
@@ -483,6 +481,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mShowingLockscreen;
boolean mShowingDream;
boolean mDreamingLockscreen;
+ boolean mKeyguardSecure;
+ boolean mKeyguardSecureIncludingHidden;
+ volatile boolean mKeyguardOccluded;
boolean mHomePressed;
boolean mHomeConsumed;
boolean mHomeDoubleTapPending;
@@ -1108,7 +1109,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mGlobalActions == null) {
mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
}
- final boolean keyguardShowing = keyguardIsShowingTq();
+ final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();
mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
if (keyguardShowing) {
// since it took two seconds of long press to bring this up,
@@ -1973,7 +1974,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public boolean isForceHiding(WindowManager.LayoutParams attrs) {
return (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 ||
- (isKeyguardHostWindow(attrs) && isKeyguardSecureIncludingHidden()) ||
+ (isKeyguardHostWindow(attrs) &&
+ (mKeyguardDelegate != null && mKeyguardDelegate.isShowing())) ||
(attrs.type == TYPE_KEYGUARD_SCRIM);
}
@@ -2377,7 +2379,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
boolean keyguardOn() {
- return keyguardIsShowingTq() || inKeyguardRestrictedKeyInputMode();
+ return isKeyguardShowingAndNotOccluded() || inKeyguardRestrictedKeyInputMode();
}
private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {
@@ -2961,7 +2963,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
* given the situation with the keyguard.
*/
void launchHomeFromHotKey() {
- if (mKeyguardDelegate != null && mKeyguardDelegate.isShowingAndNotOccluded()) {
+ if (isKeyguardShowingAndNotOccluded()) {
// don't launch home if keyguard showing
} else if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) {
// when in keyguard restricted mode, must first verify unlock
@@ -3995,6 +3997,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mShowingLockscreen = false;
mShowingDream = false;
mWinShowWhenLocked = null;
+ mKeyguardSecure = isKeyguardSecure();
+ mKeyguardSecureIncludingHidden = mKeyguardSecure
+ && (mKeyguardDelegate != null && mKeyguardDelegate.isShowing());
}
/** {@inheritDoc} */
@@ -4039,7 +4044,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final boolean showWhenLocked = (fl & FLAG_SHOW_WHEN_LOCKED) != 0;
final boolean dismissKeyguard = (fl & FLAG_DISMISS_KEYGUARD) != 0;
- final boolean secureKeyguard = isKeyguardSecure();
final IApplicationToken appToken = win.getAppToken();
// For app windows that are not attached, we decide if all windows in the app they
@@ -4050,13 +4054,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Remove any previous windows with the same appToken.
mAppsToBeHidden.remove(appToken);
mAppsThatDismissKeyguard.remove(appToken);
- if (mAppsToBeHidden.isEmpty() && isKeyguardSecureIncludingHidden()) {
+ if (mAppsToBeHidden.isEmpty() && mKeyguardSecureIncludingHidden) {
mWinShowWhenLocked = win;
mHideLockScreen = true;
mForceStatusBarFromKeyguard = false;
}
} else if (dismissKeyguard) {
- if (secureKeyguard) {
+ if (mKeyguardSecure) {
mAppsToBeHidden.add(appToken);
} else {
mAppsToBeHidden.remove(appToken);
@@ -4077,7 +4081,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mDismissKeyguard = mWinDismissingKeyguard == win ?
DISMISS_KEYGUARD_CONTINUE : DISMISS_KEYGUARD_START;
mWinDismissingKeyguard = win;
- mForceStatusBarFromKeyguard = mShowingLockscreen && secureKeyguard;
+ mForceStatusBarFromKeyguard = mShowingLockscreen && mKeyguardSecure;
} else if (mAppsToBeHidden.isEmpty() && showWhenLocked) {
if (DEBUG_LAYOUT) Slog.v(TAG,
"Setting mHideLockScreen to true by win " + win);
@@ -4188,9 +4192,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mKeyguardDelegate != null && mStatusBar != null) {
if (localLOGV) Slog.v(TAG, "finishPostLayoutPolicyLw: mHideKeyguard="
+ mHideLockScreen);
- if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !isKeyguardSecure()) {
+ if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !mKeyguardSecure) {
mKeyguardHidden = true;
- if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(true))) {
+ if (setKeyguardOccludedLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT
| FINISH_LAYOUT_REDO_CONFIG
| FINISH_LAYOUT_REDO_WALLPAPER;
@@ -4205,7 +4209,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
} else if (mHideLockScreen) {
mKeyguardHidden = true;
- if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(true))) {
+ if (setKeyguardOccludedLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT
| FINISH_LAYOUT_REDO_CONFIG
| FINISH_LAYOUT_REDO_WALLPAPER;
@@ -4215,7 +4219,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mDismissKeyguard == DISMISS_KEYGUARD_START) {
// Only launch the next keyguard unlock window once per window.
mKeyguardHidden = false;
- if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(false))) {
+ if (setKeyguardOccludedLw(false)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT
| FINISH_LAYOUT_REDO_CONFIG
| FINISH_LAYOUT_REDO_WALLPAPER;
@@ -4230,7 +4234,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else {
mWinDismissingKeyguard = null;
mKeyguardHidden = false;
- if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(false))) {
+ if (setKeyguardOccludedLw(false)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT
| FINISH_LAYOUT_REDO_CONFIG
| FINISH_LAYOUT_REDO_WALLPAPER;
@@ -4250,23 +4254,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
/**
- * Processes the result code of {@link IKeyguardService#setOccluded}. This is needed because we
- * immediately need to put the wallpaper directly behind the Keyguard when a window with flag
- * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} gets dismissed. If we
- * would wait for Keyguard to change the flags, that would be running asynchronously and thus be
- * too late so the user might see the window behind.
+ * Updates the occluded state of the Keyguard.
*
- * @param setHiddenResult The result code from {@link IKeyguardService#setOccluded}.
* @return Whether the flags have changed and we have to redo the layout.
*/
- private boolean processKeyguardSetHiddenResultLw(int setHiddenResult) {
- if (setHiddenResult
- == IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS) {
+ private boolean setKeyguardOccludedLw(boolean isOccluded) {
+ boolean wasOccluded = mKeyguardOccluded;
+ boolean showing = mKeyguardDelegate.isShowing();
+ if (wasOccluded && !isOccluded && showing) {
+ mKeyguardOccluded = false;
+ mKeyguardDelegate.setOccluded(false);
mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD;
mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER;
return true;
- } else if (setHiddenResult
- == IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS) {
+ } else if (!wasOccluded && isOccluded && showing) {
+ mKeyguardOccluded = true;
+ mKeyguardDelegate.setOccluded(true);
mStatusBar.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD;
mStatusBar.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER;
return true;
@@ -4477,7 +4480,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// when the keyguard is hidden by another activity.
final boolean keyguardActive = (mKeyguardDelegate == null ? false :
(interactive ?
- mKeyguardDelegate.isShowingAndNotOccluded() :
+ isKeyguardShowingAndNotOccluded() :
mKeyguardDelegate.isShowing()));
if (DEBUG_INPUT) {
@@ -4817,7 +4820,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean shouldDispatchInputWhenNonInteractive() {
// Send events to keyguard while the screen is on.
- if (keyguardIsShowingTq() && mDisplay != null && mDisplay.getState() != Display.STATE_OFF) {
+ if (isKeyguardShowingAndNotOccluded() && mDisplay != null
+ && mDisplay.getState() != Display.STATE_OFF) {
return true;
}
@@ -5189,12 +5193,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
- private boolean keyguardIsShowingTq() {
+ private boolean isKeyguardShowingAndNotOccluded() {
if (mKeyguardDelegate == null) return false;
- return mKeyguardDelegate.isShowingAndNotOccluded();
+ return mKeyguardDelegate.isShowing() && !mKeyguardOccluded;
}
-
/** {@inheritDoc} */
@Override
public boolean isKeyguardLocked() {
@@ -5208,11 +5211,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mKeyguardDelegate.isSecure();
}
- // Returns true if keyguard is currently locked whether or not it is currently hidden.
- private boolean isKeyguardSecureIncludingHidden() {
- return mKeyguardDelegate.isSecure() && mKeyguardDelegate.isShowing();
- }
-
/** {@inheritDoc} */
@Override
public boolean inKeyguardRestrictedKeyInputMode() {
@@ -5527,7 +5525,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
@Override
public void systemReady() {
- mKeyguardDelegate = new KeyguardServiceDelegate(mContext, null);
+ mKeyguardDelegate = new KeyguardServiceDelegate(mContext);
mKeyguardDelegate.onSystemReady();
readCameraLensCoverState();
@@ -5974,7 +5972,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public void keepScreenOnStoppedLw() {
- if (mKeyguardDelegate != null && !mKeyguardDelegate.isShowingAndNotOccluded()) {
+ if (isKeyguardShowingAndNotOccluded()) {
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
index 50fe7c7..618ba1e 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
@@ -18,9 +18,8 @@ import android.view.WindowManager;
import android.view.WindowManagerPolicy.OnKeyguardExitResult;
import com.android.internal.policy.IKeyguardExitCallback;
-import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.policy.IKeyguardService;
-import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.policy.IKeyguardShowCallback;
/**
* A local class that keeps a cache of keyguard state that can be restored in the event
@@ -28,15 +27,16 @@ import com.android.internal.widget.LockPatternUtils;
* local or remote instances of keyguard.
*/
public class KeyguardServiceDelegate {
- // TODO: propagate changes to these to {@link KeyguardTouchDelegate}
public static final String KEYGUARD_PACKAGE = "com.android.systemui";
public static final String KEYGUARD_CLASS = "com.android.systemui.keyguard.KeyguardService";
private static final String TAG = "KeyguardServiceDelegate";
private static final boolean DEBUG = true;
+
protected KeyguardServiceWrapper mKeyguardService;
- private View mScrim; // shown if keyguard crashes
- private KeyguardState mKeyguardState = new KeyguardState();
+ private final Context mContext;
+ private final View mScrim; // shown if keyguard crashes
+ private final KeyguardState mKeyguardState = new KeyguardState();
/* package */ static final class KeyguardState {
KeyguardState() {
@@ -101,7 +101,8 @@ public class KeyguardServiceDelegate {
}
};
- public KeyguardServiceDelegate(Context context, LockPatternUtils lockPatternUtils) {
+ public KeyguardServiceDelegate(Context context) {
+ mContext = context;
mScrim = createScrim(context);
}
@@ -123,7 +124,7 @@ public class KeyguardServiceDelegate {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (DEBUG) Log.v(TAG, "*** Keyguard connected (yay!)");
- mKeyguardService = new KeyguardServiceWrapper(
+ mKeyguardService = new KeyguardServiceWrapper(mContext,
IKeyguardService.Stub.asInterface(service));
if (mKeyguardState.systemIsReady) {
// If the system is ready, it means keyguard crashed and restarted.
@@ -151,13 +152,6 @@ public class KeyguardServiceDelegate {
return mKeyguardState.showing;
}
- public boolean isShowingAndNotOccluded() {
- if (mKeyguardService != null) {
- mKeyguardState.showingAndNotOccluded = mKeyguardService.isShowingAndNotOccluded();
- }
- return mKeyguardState.showingAndNotOccluded;
- }
-
public boolean isInputRestricted() {
if (mKeyguardService != null) {
mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted();
@@ -177,13 +171,11 @@ public class KeyguardServiceDelegate {
}
}
- public int setOccluded(boolean isOccluded) {
- int result = 0;
+ public void setOccluded(boolean isOccluded) {
if (mKeyguardService != null) {
- result = mKeyguardService.setOccluded(isOccluded);
+ mKeyguardService.setOccluded(isOccluded);
}
mKeyguardState.occluded = isOccluded;
- return result;
}
public void dismiss() {
@@ -242,13 +234,6 @@ public class KeyguardServiceDelegate {
mKeyguardState.enabled = enabled;
}
- public boolean isDismissable() {
- if (mKeyguardService != null) {
- mKeyguardState.dismissable = mKeyguardService.isDismissable();
- }
- return mKeyguardState.dismissable;
- }
-
public void onSystemReady() {
if (mKeyguardService != null) {
mKeyguardService.onSystemReady();
@@ -263,12 +248,6 @@ public class KeyguardServiceDelegate {
}
}
- public void showAssistant() {
- if (mKeyguardService != null) {
- mKeyguardService.showAssistant();
- }
- }
-
public void setCurrentUser(int newUserId) {
if (mKeyguardService != null) {
mKeyguardService.setCurrentUser(newUserId);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java
index 2778b15..b3b7684 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java
@@ -16,16 +16,16 @@
package com.android.internal.policy.impl.keyguard;
+import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-import android.view.MotionEvent;
-import com.android.internal.policy.IKeyguardServiceConstants;
-import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.policy.IKeyguardExitCallback;
import com.android.internal.policy.IKeyguardService;
+import com.android.internal.policy.IKeyguardShowCallback;
+import com.android.internal.policy.IKeyguardStateCallback;
/**
* A wrapper class for KeyguardService. It implements IKeyguardService to ensure the interface
@@ -33,83 +33,52 @@ import com.android.internal.policy.IKeyguardService;
*
*/
public class KeyguardServiceWrapper implements IKeyguardService {
+ private KeyguardStateMonitor mKeyguardStateMonitor;
private IKeyguardService mService;
private String TAG = "KeyguardServiceWrapper";
- public KeyguardServiceWrapper(IKeyguardService service) {
+ public KeyguardServiceWrapper(Context context, IKeyguardService service) {
mService = service;
+ mKeyguardStateMonitor = new KeyguardStateMonitor(context, service);
}
- public boolean isShowing() {
- try {
- return mService.isShowing();
- } catch (RemoteException e) {
- Slog.w(TAG , "Remote Exception", e);
- }
- return false;
- }
-
- public boolean isSecure() {
- try {
- return mService.isSecure();
- } catch (RemoteException e) {
- Slog.w(TAG , "Remote Exception", e);
- }
- return false; // TODO cache state
- }
-
- public boolean isShowingAndNotOccluded() {
- try {
- return mService.isShowingAndNotOccluded();
- } catch (RemoteException e) {
- Slog.w(TAG , "Remote Exception", e);
- }
- return false; // TODO cache state
- }
-
- public boolean isInputRestricted() {
- try {
- return mService.isInputRestricted();
- } catch (RemoteException e) {
- Slog.w(TAG , "Remote Exception", e);
- }
- return false; // TODO cache state
- }
-
- public boolean isDismissable() {
+ @Override // Binder interface
+ public void verifyUnlock(IKeyguardExitCallback callback) {
try {
- return mService.isDismissable();
+ mService.verifyUnlock(callback);
} catch (RemoteException e) {
Slog.w(TAG , "Remote Exception", e);
}
- return true; // TODO cache state
}
- public void verifyUnlock(IKeyguardExitCallback callback) {
+ @Override // Binder interface
+ public void keyguardDone(boolean authenticated, boolean wakeup) {
try {
- mService.verifyUnlock(callback);
+ mService.keyguardDone(authenticated, wakeup);
} catch (RemoteException e) {
Slog.w(TAG , "Remote Exception", e);
}
}
- public void keyguardDone(boolean authenticated, boolean wakeup) {
+ @Override // Binder interface
+ public void setOccluded(boolean isOccluded) {
try {
- mService.keyguardDone(authenticated, wakeup);
+ mService.setOccluded(isOccluded);
} catch (RemoteException e) {
Slog.w(TAG , "Remote Exception", e);
}
}
- public int setOccluded(boolean isOccluded) {
+ @Override
+ public void addStateMonitorCallback(IKeyguardStateCallback callback) {
try {
- return mService.setOccluded(isOccluded);
+ mService.addStateMonitorCallback(callback);
} catch (RemoteException e) {
Slog.w(TAG , "Remote Exception", e);
- return IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE;
}
}
+ @Override // Binder interface
public void dismiss() {
try {
mService.dismiss();
@@ -118,6 +87,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onDreamingStarted() {
try {
mService.onDreamingStarted();
@@ -126,6 +96,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onDreamingStopped() {
try {
mService.onDreamingStopped();
@@ -134,6 +105,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onScreenTurnedOff(int reason) {
try {
mService.onScreenTurnedOff(reason);
@@ -142,6 +114,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onScreenTurnedOn(IKeyguardShowCallback result) {
try {
mService.onScreenTurnedOn(result);
@@ -150,6 +123,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void setKeyguardEnabled(boolean enabled) {
try {
mService.setKeyguardEnabled(enabled);
@@ -158,6 +132,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onSystemReady() {
try {
mService.onSystemReady();
@@ -166,6 +141,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void doKeyguardTimeout(Bundle options) {
try {
mService.doKeyguardTimeout(options);
@@ -174,7 +150,9 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void setCurrentUser(int userId) {
+ mKeyguardStateMonitor.setCurrentUser(userId);
try {
mService.setCurrentUser(userId);
} catch (RemoteException e) {
@@ -182,6 +160,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onBootCompleted() {
try {
mService.onBootCompleted();
@@ -190,6 +169,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
try {
mService.startKeyguardExitAnimation(startTime, fadeoutDuration);
@@ -198,6 +178,7 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
+ @Override // Binder interface
public void onActivityDrawn() {
try {
mService.onActivityDrawn();
@@ -206,21 +187,20 @@ public class KeyguardServiceWrapper implements IKeyguardService {
}
}
- public void showAssistant() {
- // Not used by PhoneWindowManager
+ @Override // Binder interface
+ public IBinder asBinder() {
+ return mService.asBinder();
}
- public void dispatch(MotionEvent event) {
- // Not used by PhoneWindowManager. See code in {@link NavigationBarView}
+ public boolean isShowing() {
+ return mKeyguardStateMonitor.isShowing();
}
- public void launchCamera() {
- // Not used by PhoneWindowManager. See code in {@link NavigationBarView}
+ public boolean isSecure() {
+ return mKeyguardStateMonitor.isSecure();
}
- @Override
- public IBinder asBinder() {
- return mService.asBinder();
+ public boolean isInputRestricted() {
+ return mKeyguardStateMonitor.isInputRestricted();
}
-
} \ No newline at end of file
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java
new file mode 100644
index 0000000..6f9c617
--- /dev/null
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 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.internal.policy.impl.keyguard;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.internal.policy.IKeyguardService;
+import com.android.internal.policy.IKeyguardStateCallback;
+import com.android.internal.widget.LockPatternUtils;
+
+/**
+ * Maintains a cached copy of Keyguard's state.
+ * @hide
+ */
+public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub {
+ private static final String TAG = "KeyguardStateMonitor";
+
+ // These cache the current state of Keyguard to improve performance and avoid deadlock. After
+ // Keyguard changes its state, it always triggers a layout in window manager. Because
+ // IKeyguardStateCallback is synchronous and because these states are declared volatile, it's
+ // guaranteed that window manager picks up the new state all the time in the layout caused by
+ // the state change of Keyguard.
+ private volatile boolean mIsShowing;
+ private volatile boolean mSimSecure;
+ private volatile boolean mInputRestricted;
+
+ private final LockPatternUtils mLockPatternUtils;
+
+ public KeyguardStateMonitor(Context context, IKeyguardService service) {
+ mLockPatternUtils = new LockPatternUtils(context);
+ mLockPatternUtils.setCurrentUser(ActivityManager.getCurrentUser());
+ try {
+ service.addStateMonitorCallback(this);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Remote Exception", e);
+ }
+ }
+
+ public boolean isShowing() {
+ return mIsShowing;
+ }
+
+ public boolean isSecure() {
+ return mLockPatternUtils.isSecure() || mSimSecure;
+ }
+
+ public boolean isInputRestricted() {
+ return mInputRestricted;
+ }
+
+ @Override // Binder interface
+ public void onShowingStateChanged(boolean showing) {
+ mIsShowing = showing;
+ }
+
+ @Override // Binder interface
+ public void onSimSecureStateChanged(boolean simSecure) {
+ mSimSecure = simSecure;
+ }
+
+ public void setCurrentUser(int userId) {
+ mLockPatternUtils.setCurrentUser(userId);
+ }
+
+ @Override // Binder interface
+ public void onInputRestrictedStateChanged(boolean inputRestricted) {
+ mInputRestricted = inputRestricted;
+ }
+} \ No newline at end of file