From 740452e8756cb7f51ed185c3906a5ca61b8fcdd4 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 9 Jul 2015 12:13:59 -0700 Subject: Touch, wake and unlock - Add onFingerprintAcquired, so Keyguard can grab a wakelock to prevent the device from sleeping. - If we get a successful fingerprint, wake the device up, immediately dismiss the keyguard and tell PWM that we kicked off our frame that will represent the correct state. - PWM then waits for this frame to be drawn, and then turns on the screen, which results in unlocking directly to the previsouly opened app. Bug: 21855614 Change-Id: I5f43df17fa5e4e9c6a6392eef4a4590b07df4f96 --- Android.mk | 2 +- .../hardware/fingerprint/FingerprintManager.java | 16 +++- .../internal/policy/IKeyguardDrawnCallback.aidl | 20 +++++ .../android/internal/policy/IKeyguardService.aidl | 10 ++- .../internal/policy/IKeyguardShowCallback.aidl | 20 ----- .../com/android/keyguard/KeyguardConstants.java | 1 + .../android/keyguard/KeyguardUpdateMonitor.java | 96 ++++++++++++++++------ .../keyguard/KeyguardUpdateMonitorCallback.java | 4 +- .../android/systemui/keyguard/KeyguardService.java | 12 ++- .../systemui/keyguard/KeyguardViewMediator.java | 93 ++++++++++++++------- .../statusbar/phone/KeyguardBottomAreaView.java | 2 +- .../systemui/statusbar/phone/PhoneStatusBar.java | 4 +- .../phone/StatusBarKeyguardViewManager.java | 47 ++++------- .../statusbar/phone/UnlockMethodCache.java | 2 +- .../server/fingerprint/FingerprintService.java | 8 -- .../android/server/policy/PhoneWindowManager.java | 33 ++++---- .../policy/keyguard/KeyguardServiceDelegate.java | 46 ++++++----- .../policy/keyguard/KeyguardServiceWrapper.java | 15 +++- 18 files changed, 271 insertions(+), 160 deletions(-) create mode 100644 core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl delete mode 100644 core/java/com/android/internal/policy/IKeyguardShowCallback.aidl diff --git a/Android.mk b/Android.mk index 121bc8e..a7a2ecb 100644 --- a/Android.mk +++ b/Android.mk @@ -285,7 +285,7 @@ LOCAL_SRC_FILES += \ core/java/com/android/internal/appwidget/IAppWidgetHost.aidl \ core/java/com/android/internal/backup/IBackupTransport.aidl \ core/java/com/android/internal/backup/IObbBackupService.aidl \ - core/java/com/android/internal/policy/IKeyguardShowCallback.aidl \ + core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl \ core/java/com/android/internal/policy/IKeyguardExitCallback.aidl \ core/java/com/android/internal/policy/IKeyguardService.aidl \ core/java/com/android/internal/policy/IKeyguardStateCallback.aidl \ diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index c5f142a..ee37047 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -321,6 +321,14 @@ public class FingerprintManager { * Called when a fingerprint is valid but not recognized. */ public void onAuthenticationFailed() { } + + /** + * Called when a fingerprint image has been acquired, but wasn't processed yet. + * + * @param acquireInfo one of FINGERPRINT_ACQUIRED_* constants + * @hide + */ + public void onAuthenticationAcquired(int acquireInfo) {} }; /** @@ -737,9 +745,13 @@ public class FingerprintManager { } private void sendAcquiredResult(long deviceId, int acquireInfo) { + if (mAuthenticationCallback != null) { + mAuthenticationCallback.onAuthenticationAcquired(acquireInfo); + } final String msg = getAcquiredString(acquireInfo); - if (msg == null) return; - + if (msg == null) { + return; + } if (mEnrollmentCallback != null) { mEnrollmentCallback.onEnrollmentHelp(acquireInfo, msg); } else if (mAuthenticationCallback != null) { diff --git a/core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl b/core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl new file mode 100644 index 0000000..ef8478c --- /dev/null +++ b/core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl @@ -0,0 +1,20 @@ +/* + * 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; + +oneway interface IKeyguardDrawnCallback { + void onDrawn(); +} diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 7ab4651..79af452 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -15,7 +15,7 @@ */ package com.android.internal.policy; -import com.android.internal.policy.IKeyguardShowCallback; +import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardStateCallback; import com.android.internal.policy.IKeyguardExitCallback; @@ -57,7 +57,13 @@ oneway interface IKeyguardService { /** * Called when the device has started waking up. */ - void onStartedWakingUp(IKeyguardShowCallback callback); + void onStartedWakingUp(); + + /** + * Called when the device screen is turning on. + */ + void onScreenTurningOn(IKeyguardDrawnCallback callback); + void setKeyguardEnabled(boolean enabled); void onSystemReady(); void doKeyguardTimeout(in Bundle options); diff --git a/core/java/com/android/internal/policy/IKeyguardShowCallback.aidl b/core/java/com/android/internal/policy/IKeyguardShowCallback.aidl deleted file mode 100644 index a2784d9..0000000 --- a/core/java/com/android/internal/policy/IKeyguardShowCallback.aidl +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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; - -oneway interface IKeyguardShowCallback { - void onShown(IBinder windowToken); -} diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java index e5f3dc9..3927122 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java @@ -27,4 +27,5 @@ public class KeyguardConstants { */ public static final boolean DEBUG = false; public static final boolean DEBUG_SIM_STATES = false; + public static final boolean DEBUG_FP_WAKELOCK = true; } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 9e5644e..b098258 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -44,7 +44,9 @@ import android.os.CancellationSignal; import android.os.Handler; import android.os.IRemoteCallback; import android.os.Message; +import android.os.PowerManager; import android.os.RemoteException; +import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; @@ -90,12 +92,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final String TAG = "KeyguardUpdateMonitor"; private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; + private static final boolean DEBUG_FP_WAKELOCK = KeyguardConstants.DEBUG_FP_WAKELOCK; private static final int LOW_BATTERY_THRESHOLD = 20; + private static final long FINGERPRINT_WAKELOCK_TIMEOUT_MS = 15 * 1000; private static final String ACTION_FACE_UNLOCK_STARTED = "com.android.facelock.FACE_UNLOCK_STARTED"; private static final String ACTION_FACE_UNLOCK_STOPPED = "com.android.facelock.FACE_UNLOCK_STOPPED"; + private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock"; // Callback messages private static final int MSG_TIME_UPDATE = 301; @@ -114,10 +119,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SCREEN_TURNED_ON = 319; private static final int MSG_SCREEN_TURNED_OFF = 320; private static final int MSG_KEYGUARD_BOUNCER_CHANGED = 322; - private static final int MSG_FINGERPRINT_AUTHENTICATED = 323; - private static final int MSG_FINGERPRINT_ERROR = 324; - private static final int MSG_FINGERPRINT_HELP = 325; - private static final int MSG_FINGERPRINT_AUTH_FAILED = 326; private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327; private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; private static final int MSG_AIRPLANE_MODE_CHANGED = 329; @@ -157,6 +158,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private List mSubscriptionInfo; private boolean mFingerprintDetectionRunning; private TrustManager mTrustManager; + private PowerManager mPowerManager; private final Handler mHandler = new Handler() { @Override @@ -210,18 +212,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_SCREEN_TURNED_ON: handleScreenTurnedOn(); break; - case MSG_FINGERPRINT_AUTHENTICATED: - handleFingerprintAuthenticated(); - break; - case MSG_FINGERPRINT_HELP: - handleFingerprintHelp(msg.arg1 /* msgId */, (String) msg.obj /* errString */); - break; - case MSG_FINGERPRINT_ERROR: - handleFingerprintError(msg.arg1 /* msgId */, (String) msg.obj /* errString */); - break; - case MSG_FINGERPRINT_AUTH_FAILED: - handleFingerprintAuthFailed(); - break; case MSG_FACE_UNLOCK_STATE_CHANGED: handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2); break; @@ -253,6 +243,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static int sCurrentUser; + private boolean mWakeAndUnlocking; + public synchronized static void setCurrentUser(int currentUser) { sCurrentUser = currentUser; } @@ -353,23 +345,72 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } - private void onFingerprintAuthenticated(int userId) { + private void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { mUserFingerprintAuthenticated.put(userId, true); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onFingerprintAuthenticated(userId); + cb.onFingerprintAuthenticated(userId, wakeAndUnlocking); } } } private void handleFingerprintAuthFailed() { + releaseFingerprintWakeLock(); stopListeningForFingerprint(); handleFingerprintHelp(-1, mContext.getString(R.string.fingerprint_not_recognized)); updateFingerprintListeningState(); } + private void handleFingerprintAcquired(int acquireInfo) { + if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) { + return; + } + if (!mScreenOn) { + releaseFingerprintWakeLock(); + mWakeLock = mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME); + mWakeLock.acquire(); + mWakeAndUnlocking = true; + if (DEBUG_FP_WAKELOCK) { + Log.i(TAG, "fingerprint acquired, grabbing fp wakelock"); + } + mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable, + FINGERPRINT_WAKELOCK_TIMEOUT_MS); + } else { + mWakeAndUnlocking = false; + } + } + + private final Runnable mReleaseFingerprintWakeLockRunnable = new Runnable() { + @Override + public void run() { + if (DEBUG_FP_WAKELOCK) { + Log.i(TAG, "fp wakelock: TIMEOUT!!"); + } + releaseFingerprintWakeLock(); + } + }; + + private void releaseFingerprintWakeLock() { + if (mWakeLock != null) { + mHandler.removeCallbacks(mReleaseFingerprintWakeLockRunnable); + if (DEBUG_FP_WAKELOCK) { + Log.i(TAG, "releasing fp wakelock"); + } + mWakeLock.release(); + mWakeLock = null; + } + } + private void handleFingerprintAuthenticated() { + if (mWakeAndUnlocking) { + if (DEBUG_FP_WAKELOCK) { + Log.i(TAG, "fp wakelock: Authenticated, waking up..."); + } + mPowerManager.wakeUp(SystemClock.uptimeMillis()); + } + releaseFingerprintWakeLock(); try { final int userId; try { @@ -382,7 +423,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); return; } - onFingerprintAuthenticated(userId); + onFingerprintAuthenticated(userId, mWakeAndUnlocking); } finally { setFingerprintRunningDetectionRunning(false); } @@ -555,26 +596,32 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { @Override public void onAuthenticationFailed() { - mHandler.obtainMessage(MSG_FINGERPRINT_AUTH_FAILED).sendToTarget(); + handleFingerprintAuthFailed(); }; @Override public void onAuthenticationSucceeded(AuthenticationResult result) { - mHandler.obtainMessage(MSG_FINGERPRINT_AUTHENTICATED).sendToTarget(); + handleFingerprintAuthenticated(); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { - mHandler.obtainMessage(MSG_FINGERPRINT_HELP, helpMsgId, 0, helpString).sendToTarget(); + handleFingerprintHelp(helpMsgId, helpString.toString()); } @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { - mHandler.obtainMessage(MSG_FINGERPRINT_ERROR, errMsgId, 0, errString).sendToTarget(); + handleFingerprintError(errMsgId, errString.toString()); + } + + @Override + public void onAuthenticationAcquired(int acquireInfo) { + handleFingerprintAcquired(acquireInfo); } }; private CancellationSignal mFingerprintCancelSignal; private FingerprintManager mFpm; + private PowerManager.WakeLock mWakeLock; /** * When we receive a @@ -741,6 +788,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private KeyguardUpdateMonitor(Context context) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); + mPowerManager = context.getSystemService(PowerManager.class); mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); // Since device can't be un-provisioned, we only need to register a content observer // to update mDeviceProvisioned when we are... @@ -819,7 +867,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private boolean shouldListenForFingerprint() { - return mScreenOn && mKeyguardIsVisible && !mSwitchingUser + return mKeyguardIsVisible && !mSwitchingUser && mTrustManager.hasUserAuthenticatedSinceBoot(ActivityManager.getCurrentUser()); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 26e6973..9fd8d30 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -178,8 +178,10 @@ public class KeyguardUpdateMonitorCallback { /** * Called when a fingerprint is recognized. * @param userId the user id for which the fingerprint was authenticated + * @param wakeAndUnlocking whether the authentication woke the device up and thus we'd like to + * dismiss the lockscreen before turning on the screen */ - public void onFingerprintAuthenticated(int userId) { } + public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { } /** * Called when fingerprint provides help string (e.g. "Try again") diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 98558b4..9f21dbe 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -25,9 +25,9 @@ import android.os.IBinder; import android.os.Process; import android.util.Log; +import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; -import com.android.internal.policy.IKeyguardShowCallback; import com.android.internal.policy.IKeyguardStateCallback; import com.android.systemui.SystemUIApplication; @@ -120,9 +120,15 @@ public class KeyguardService extends Service { } @Override // Binder interface - public void onStartedWakingUp(IKeyguardShowCallback callback) { + public void onStartedWakingUp() { checkPermission(); - mKeyguardViewMediator.onStartedWakingUp(callback); + mKeyguardViewMediator.onStartedWakingUp(); + } + + @Override // Binder interface + public void onScreenTurningOn(IKeyguardDrawnCallback callback) { + checkPermission(); + mKeyguardViewMediator.onScreenTurningOn(callback); } @Override // Binder interface diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 009a0d6..c01a485 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -41,6 +41,7 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -55,8 +56,9 @@ import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicy; import android.view.animation.Animation; import android.view.animation.AnimationUtils; + +import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; -import com.android.internal.policy.IKeyguardShowCallback; import com.android.internal.policy.IKeyguardStateCallback; import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; @@ -77,7 +79,6 @@ import java.util.List; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; - /** * Mediates requests related to the keyguard. This includes queries about the * state of the keyguard, power management events that effect whether the keyguard @@ -138,7 +139,7 @@ public class KeyguardViewMediator extends SystemUI { private static final int RESET = 4; private static final int VERIFY_UNLOCK = 5; private static final int NOTIFY_SCREEN_OFF = 6; - private static final int NOTIFY_SCREEN_ON = 7; + private static final int NOTIFY_SCREEN_TURNING_ON = 7; private static final int KEYGUARD_DONE = 9; private static final int KEYGUARD_DONE_DRAWING = 10; private static final int KEYGUARD_DONE_AUTHENTICATING = 11; @@ -148,6 +149,7 @@ public class KeyguardViewMediator extends SystemUI { private static final int START_KEYGUARD_EXIT_ANIM = 18; private static final int ON_ACTIVITY_DRAWN = 19; private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20; + private static final int NOTIFY_STARTED_WAKING_UP = 21; /** * The default amount of time we stay awake (used for all key input) @@ -311,11 +313,14 @@ public class KeyguardViewMediator extends SystemUI { private boolean mPendingReset; /** - * When starting goign to sleep, we figured out that we need to lock Keyguard and this should be + * When starting going to sleep, we figured out that we need to lock Keyguard and this should be * committed when finished going to sleep. */ private boolean mPendingLock; + private boolean mWakeAndUnlocking; + private IKeyguardDrawnCallback mDrawnCallback; + KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -454,12 +459,17 @@ public class KeyguardViewMediator extends SystemUI { } @Override - public void onFingerprintAuthenticated(int userId) { + public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(); } else { - mStatusBarKeyguardViewManager.animateCollapsePanels( - FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR); + if (wakeAndUnlocking) { + mWakeAndUnlocking = true; + keyguardDone(true, true); + } else { + mStatusBarKeyguardViewManager.animateCollapsePanels( + FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR); + } } }; @@ -752,21 +762,23 @@ public class KeyguardViewMediator extends SystemUI { /** * Let's us know when the device is waking up. */ - public void onStartedWakingUp(IKeyguardShowCallback callback) { + public void onStartedWakingUp() { // TODO: Rename all screen off/on references to interactive/sleeping synchronized (this) { mDeviceInteractive = true; cancelDoKeyguardLaterLocked(); if (DEBUG) Log.d(TAG, "onStartedWakingUp, seq = " + mDelayedShowingSequence); - if (callback != null) { - notifyScreenOnLocked(callback); - } + notifyStartedWakingUp(); } KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn(); maybeSendUserPresentBroadcast(); } + public void onScreenTurningOn(IKeyguardDrawnCallback callback) { + notifyScreenOnLocked(callback); + } + private void maybeSendUserPresentBroadcast() { if (mSystemReady && mLockPatternUtils.isLockScreenDisabled( KeyguardUpdateMonitor.getCurrentUser())) { @@ -1093,14 +1105,14 @@ public class KeyguardViewMediator extends SystemUI { mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); } - /** - * Send a message to keyguard telling it the screen just turned on. - * @see #onScreenTurnedOn - * @see #handleNotifyScreenOn - */ - private void notifyScreenOnLocked(IKeyguardShowCallback result) { + private void notifyStartedWakingUp() { + if (DEBUG) Log.d(TAG, "notifyStartedWakingUp"); + mHandler.sendEmptyMessage(NOTIFY_STARTED_WAKING_UP); + } + + private void notifyScreenOnLocked(IKeyguardDrawnCallback callback) { if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); - Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_ON, result); + Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNING_ON, callback); mHandler.sendMessage(msg); } @@ -1190,8 +1202,11 @@ public class KeyguardViewMediator extends SystemUI { case NOTIFY_SCREEN_OFF: handleNotifyScreenOff(); break; - case NOTIFY_SCREEN_ON: - handleNotifyScreenOn((IKeyguardShowCallback) msg.obj); + case NOTIFY_SCREEN_TURNING_ON: + handleNotifyScreenTurningOn((IKeyguardDrawnCallback) msg.obj); + break; + case NOTIFY_STARTED_WAKING_UP: + handleNotifyStartedWakingUp(); break; case KEYGUARD_DONE: handleKeyguardDone(msg.arg1 != 0, msg.arg2 != 0); @@ -1354,6 +1369,7 @@ public class KeyguardViewMediator extends SystemUI { setShowingLocked(true); mStatusBarKeyguardViewManager.show(options); mHiding = false; + mWakeAndUnlocking = false; resetKeyguardDonePendingLocked(); mHideAnimationRun = false; updateActivityLockScreenState(); @@ -1375,7 +1391,8 @@ public class KeyguardViewMediator extends SystemUI { // manager until it tells us it's safe to do so with // startKeyguardExitAnimation. ActivityManagerNative.getDefault().keyguardGoingAway( - mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock(), + mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock() + || mWakeAndUnlocking, mStatusBarKeyguardViewManager.isGoingToNotificationShade()); } catch (RemoteException e) { Log.e(TAG, "Error while calling WindowManager", e); @@ -1437,6 +1454,9 @@ public class KeyguardViewMediator extends SystemUI { updateActivityLockScreenState(); adjustStatusBarLocked(); sendUserPresentBroadcast(); + if (mWakeAndUnlocking && mDrawnCallback != null) { + notifyDrawn(mDrawnCallback); + } } } @@ -1508,14 +1528,31 @@ public class KeyguardViewMediator extends SystemUI { } } - /** - * Handle message sent by {@link #notifyScreenOnLocked} - * @see #NOTIFY_SCREEN_ON - */ - private void handleNotifyScreenOn(IKeyguardShowCallback callback) { + private void handleNotifyStartedWakingUp() { + synchronized (KeyguardViewMediator.this) { + if (DEBUG) Log.d(TAG, "handleNotifyWakingUp"); + mStatusBarKeyguardViewManager.onScreenTurnedOn(); + } + } + + private void handleNotifyScreenTurningOn(IKeyguardDrawnCallback callback) { synchronized (KeyguardViewMediator.this) { - if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); - mStatusBarKeyguardViewManager.onScreenTurnedOn(callback); + if (DEBUG) Log.d(TAG, "handleNotifyScreenTurningOn"); + if (callback != null) { + if (mWakeAndUnlocking) { + mDrawnCallback = callback; + } else { + notifyDrawn(callback); + } + } + } + } + + private void notifyDrawn(final IKeyguardDrawnCallback callback) { + try { + callback.onDrawn(); + } catch (RemoteException e) { + Slog.w(TAG, "Exception calling onDrawn():", e); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 91adc46..a5310a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -641,7 +641,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } @Override - public void onFingerprintAuthenticated(int userId) { + public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 2248905..6ebb012 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1730,7 +1730,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } private int adjustDisableFlags(int state) { - if (!mLaunchTransitionFadingAway + if (!mLaunchTransitionFadingAway && !mKeyguardFadingAway && (mExpandedVisible || mBouncerShowing || mWaitingForKeyguardExit)) { state |= StatusBarManager.DISABLE_NOTIFICATION_ICONS; state |= StatusBarManager.DISABLE_SYSTEM_INFO; @@ -3460,7 +3460,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, startTime + fadeoutDuration - StatusBarIconController.DEFAULT_TINT_ANIMATION_DURATION, StatusBarIconController.DEFAULT_TINT_ANIMATION_DURATION); - disable(mDisabledUnmodified1, mDisabledUnmodified2, true /* animate */); + disable(mDisabledUnmodified1, mDisabledUnmodified2, fadeoutDuration > 0 /* animate */); } public boolean isKeyguardFadingAway() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index a69416a..e622144 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -19,15 +19,12 @@ package com.android.systemui.statusbar.phone; import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Bundle; -import android.os.RemoteException; import android.os.SystemClock; -import android.util.Slog; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManagerGlobal; -import com.android.internal.policy.IKeyguardShowCallback; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; @@ -163,26 +160,10 @@ public class StatusBarKeyguardViewManager { mBouncer.onScreenTurnedOff(); } - public void onScreenTurnedOn(final IKeyguardShowCallback callback) { + public void onScreenTurnedOn() { mScreenOn = true; mScreenWillWakeUp = false; mPhoneStatusBar.onScreenTurnedOn(); - if (callback != null) { - callbackAfterDraw(callback); - } - } - - private void callbackAfterDraw(final IKeyguardShowCallback callback) { - mContainer.post(new Runnable() { - @Override - public void run() { - try { - callback.onShown(mContainer.getWindowToken()); - } catch (RemoteException e) { - Slog.w(TAG, "Exception calling onShown():", e); - } - } - }); } public void notifyScreenWakeUpRequested() { @@ -270,16 +251,22 @@ public class StatusBarKeyguardViewManager { mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration); boolean staying = mPhoneStatusBar.hideKeyguard(); if (!staying) { - mStatusBarWindowManager.setKeyguardFadingAway(true); - mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() { - @Override - public void run() { - mStatusBarWindowManager.setKeyguardFadingAway(false); - mPhoneStatusBar.finishKeyguardFadingAway(); - WindowManagerGlobal.getInstance().trimMemory( - ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); - } - }); + if (fadeoutDuration == 0) { + mPhoneStatusBar.finishKeyguardFadingAway(); + WindowManagerGlobal.getInstance().trimMemory( + ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + } else { + mStatusBarWindowManager.setKeyguardFadingAway(true); + mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() { + @Override + public void run() { + mStatusBarWindowManager.setKeyguardFadingAway(false); + mPhoneStatusBar.finishKeyguardFadingAway(); + WindowManagerGlobal.getInstance().trimMemory( + ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + } + }); + } } else { mScrimController.animateGoingToFullShade(delay, fadeoutDuration); mPhoneStatusBar.finishKeyguardFadingAway(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index 6fc15a8..f31311d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -132,7 +132,7 @@ public class UnlockMethodCache { } @Override - public void onFingerprintAuthenticated(int userId) { + public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { update(false /* updateAlways */); } diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 8871e64..f34fff7 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -74,7 +74,6 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe private static final int MSG_USER_SWITCHING = 10; private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute - private boolean mIsKeyguard; // true if the authentication client is keyguard private ClientMonitor mAuthClient = null; private ClientMonitor mEnrollClient = null; private ClientMonitor mRemoveClient = null; @@ -577,12 +576,6 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe result |= true; // we have a valid fingerprint mLockoutReset.run(); } - // For fingerprint devices that support touch-to-wake, this will ensure the device - // wakes up and turns the screen on when fingerprint is authenticated. - if (mIsKeyguard && authenticated) { - mPowerManager.wakeUp(SystemClock.uptimeMillis(), - "android.server.fingerprint:AUTH"); - } return result; } @@ -727,7 +720,6 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe mHandler.post(new Runnable() { @Override public void run() { - mIsKeyguard = KEYGUARD_PACKAGE.equals(opPackageName); startAuthentication(token, opId, groupId, receiver, flags, restricted); } }); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 28cbaab..dc3e2d6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -119,7 +119,7 @@ import com.android.internal.util.ScreenShapeHelper; import com.android.internal.widget.PointerLocationView; import com.android.server.LocalServices; import com.android.server.policy.keyguard.KeyguardServiceDelegate; -import com.android.server.policy.keyguard.KeyguardServiceDelegate.ShowListener; +import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener; import java.io.File; import java.io.FileReader; @@ -323,10 +323,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHandler.sendEmptyMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE); } }; - final ShowListener mKeyguardDelegateCallback = new ShowListener() { + final DrawnListener mKeyguardDrawnCallback = new DrawnListener() { @Override - public void onShown(IBinder windowToken) { - if (DEBUG_WAKEUP) Slog.d(TAG, "mKeyguardDelegate.ShowListener.onShown."); + public void onDrawn() { + if (DEBUG_WAKEUP) Slog.d(TAG, "mKeyguardDelegate.ShowListener.onDrawn."); mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE); } }; @@ -5496,11 +5496,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (mKeyguardDelegate != null) { - mKeyguardDelegate.onStartedWakingUp(mKeyguardDelegateCallback); - // ... eventually calls finishKeyguardDrawn - } else { - if (DEBUG_WAKEUP) Slog.d(TAG, "null mKeyguardDelegate: setting mKeyguardDrawComplete."); - finishKeyguardDrawn(); + mKeyguardDelegate.onStartedWakingUp(); } } @@ -5539,9 +5535,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mKeyguardDelegate != null) { mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); } + mWindowManagerDrawComplete = false; } - finishScreenTurningOn(); + // ... eventually calls finishWindowsDrawn which will finalize our screen turn on + // as well as enabling the orientation change logic/sensor. + mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback, + WAITING_FOR_DRAWN_TIMEOUT); } // Called on the DisplayManager's DisplayPowerController thread. @@ -5570,12 +5570,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mScreenOnFully = false; mWindowManagerDrawComplete = false; mScreenOnListener = screenOnListener; - } - mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback, - WAITING_FOR_DRAWN_TIMEOUT); - // ... eventually calls finishWindowsDrawn which will finalize our screen turn on - // as well as enabling the orientation change logic/sensor. + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); + } else { + if (DEBUG_WAKEUP) Slog.d(TAG, + "null mKeyguardDelegate: setting mKeyguardDrawComplete."); + finishKeyguardDrawn(); + } + } } private void finishWindowsDrawn() { diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 1406789..0f3a199 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -18,9 +18,9 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicy.OnKeyguardExitResult; +import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; -import com.android.internal.policy.IKeyguardShowCallback; /** * A local class that keeps a cache of keyguard state that can be restored in the event @@ -35,7 +35,7 @@ public class KeyguardServiceDelegate { private final Context mContext; private final View mScrim; // shown if keyguard crashes private final KeyguardState mKeyguardState = new KeyguardState(); - private ShowListener mShowListenerWhenConnect; + private DrawnListener mDrawnListenerWhenConnect; private static final class KeyguardState { KeyguardState() { @@ -61,23 +61,23 @@ public class KeyguardServiceDelegate { public boolean bootCompleted; }; - public interface ShowListener { - public void onShown(IBinder windowToken); + public interface DrawnListener { + void onDrawn(); } // A delegate class to map a particular invocation with a ShowListener object. - private final class KeyguardShowDelegate extends IKeyguardShowCallback.Stub { - private ShowListener mShowListener; + private final class KeyguardShowDelegate extends IKeyguardDrawnCallback.Stub { + private DrawnListener mDrawnListener; - KeyguardShowDelegate(ShowListener showListener) { - mShowListener = showListener; + KeyguardShowDelegate(DrawnListener drawnListener) { + mDrawnListener = drawnListener; } @Override - public void onShown(IBinder windowToken) throws RemoteException { + public void onDrawn() throws RemoteException { if (DEBUG) Log.v(TAG, "**** SHOWN CALLED ****"); - if (mShowListener != null) { - mShowListener.onShown(windowToken); + if (mDrawnListener != null) { + mDrawnListener.onDrawn(); } hideScrim(); } @@ -141,9 +141,10 @@ public class KeyguardServiceDelegate { // If the system is ready, it means keyguard crashed and restarted. mKeyguardService.onSystemReady(); // This is used to hide the scrim once keyguard displays. - mKeyguardService.onStartedWakingUp(new KeyguardShowDelegate( - mShowListenerWhenConnect)); - mShowListenerWhenConnect = null; + mKeyguardService.onStartedWakingUp(); + mKeyguardService.onScreenTurningOn( + new KeyguardShowDelegate(mDrawnListenerWhenConnect)); + mDrawnListenerWhenConnect = null; } if (mKeyguardState.bootCompleted) { mKeyguardService.onBootCompleted(); @@ -221,16 +222,23 @@ public class KeyguardServiceDelegate { mKeyguardState.dreaming = false; } - public void onStartedWakingUp(final ShowListener showListener) { + public void onStartedWakingUp() { if (mKeyguardService != null) { - if (DEBUG) Log.v(TAG, "onScreenTurnedOn(showListener = " + showListener + ")"); - mKeyguardService.onStartedWakingUp(new KeyguardShowDelegate(showListener)); + if (DEBUG) Log.v(TAG, "onStartedWakingUp()"); + mKeyguardService.onStartedWakingUp(); + } + } + + public void onScreenTurningOn(final DrawnListener drawnListener) { + if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "onScreenTurnedOn(showListener = " + drawnListener + ")"); + mKeyguardService.onScreenTurningOn(new KeyguardShowDelegate(drawnListener)); } else { // try again when we establish a connection - Slog.w(TAG, "onScreenTurnedOn(): no keyguard service!"); + Slog.w(TAG, "onScreenTurningOn(): no keyguard service!"); // This shouldn't happen, but if it does, show the scrim immediately and // invoke the listener's callback after the service actually connects. - mShowListenerWhenConnect = showListener; + mDrawnListenerWhenConnect = drawnListener; showScrim(); } } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 51d59fa..5810a45 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -22,9 +22,9 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; +import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; -import com.android.internal.policy.IKeyguardShowCallback; import com.android.internal.policy.IKeyguardStateCallback; /** @@ -124,9 +124,18 @@ public class KeyguardServiceWrapper implements IKeyguardService { } @Override - public void onStartedWakingUp(IKeyguardShowCallback callback) { + public void onStartedWakingUp() { try { - mService.onStartedWakingUp(callback); + mService.onStartedWakingUp(); + } catch (RemoteException e) { + Slog.w(TAG , "Remote Exception", e); + } + } + + @Override + public void onScreenTurningOn(IKeyguardDrawnCallback callback) { + try { + mService.onScreenTurningOn(callback); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } -- cgit v1.1