Commit 4cfdcf5b authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

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: I0c43bcc9d334b509632704fb0c123ab3351edff2
parent a05e7ac2
......@@ -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 \
......
......@@ -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) {
......
......@@ -15,6 +15,6 @@
*/
package com.android.internal.policy;
oneway interface IKeyguardShowCallback {
void onShown(IBinder windowToken);
oneway interface IKeyguardDrawnCallback {
void onDrawn();
}
......@@ -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);
......
......@@ -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;
}
......@@ -45,7 +45,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;
......@@ -91,12 +93,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;
......@@ -115,10 +120,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;
......@@ -158,6 +159,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private List<SubscriptionInfo> mSubscriptionInfo;
private boolean mFingerprintDetectionRunning;
private TrustManager mTrustManager;
private PowerManager mPowerManager;
private final Handler mHandler = new Handler() {
@Override
......@@ -211,18 +213,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;
......@@ -254,6 +244,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private static int sCurrentUser;
private boolean mWakeAndUnlocking;
public synchronized static void setCurrentUser(int currentUser) {
sCurrentUser = currentUser;
}
......@@ -354,23 +346,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 {
......@@ -383,7 +424,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
......@@ -754,6 +801,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...
......@@ -832,7 +880,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private boolean shouldListenForFingerprint() {
return mScreenOn && mKeyguardIsVisible && !mSwitchingUser
return mKeyguardIsVisible && !mSwitchingUser
&& mTrustManager.hasUserAuthenticatedSinceBoot(ActivityManager.getCurrentUser());
}
......
......@@ -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")
......
......@@ -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
......
......@@ -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);
}
}
......
......@@ -18,7 +18,6 @@ package com.android.systemui.statusbar.phone;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.Application;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
......@@ -30,8 +29,6 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
......@@ -644,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
......
......@@ -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;
......@@ -3459,7 +3459,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() {
......
......@@ -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();
......
......@@ -125,7 +125,7 @@ public class UnlockMethodCache {
}
@Override
public void onFingerprintAuthenticated(int userId) {
public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
update(false /* updateAlways */);
}
......
......@@ -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;
......@@ -562,11 +561,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());
}
return result;
}
......@@ -711,7 +705,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);
}
});
......
......@@ -104,7 +104,6 @@ import com.android.internal.policy.PhoneWindow;
import android.view.Surface;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerInternal;
......@@ -120,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 +322,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);
}
};
......@@ -5478,11 +5477,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();
}
}
......@@ -5521,9 +5516,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.
......@@ -5552,12 +5551,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() {
......
......@@ -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;
/* package */ 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();
}
......@@ -136,9 +136,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();
......@@ -216,16 +217,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();
}
}
......
......@@ -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);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment