diff options
author | Jorim Jaggi <jjaggi@google.com> | 2014-11-26 14:07:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-11-26 14:07:21 +0000 |
commit | 803a6dc080f883f95cc02f5c9ad850e73f8e76a8 (patch) | |
tree | a258b953c839bdcf6d264c3de85202535710225c /policy | |
parent | be3736d38774210549deb2999bb226d83a29f1ee (diff) | |
parent | ab954546dc49e1070ed8513efbddc8954b529c23 (diff) | |
download | frameworks_base-803a6dc080f883f95cc02f5c9ad850e73f8e76a8.zip frameworks_base-803a6dc080f883f95cc02f5c9ad850e73f8e76a8.tar.gz frameworks_base-803a6dc080f883f95cc02f5c9ad850e73f8e76a8.tar.bz2 |
Merge "Make IKeyguardService interface asynchronous" into lmp-mr1-dev
Diffstat (limited to 'policy')
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 |