diff options
author | Jorim Jaggi <jjaggi@google.com> | 2015-07-30 11:56:36 -0700 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2015-07-31 19:31:16 +0000 |
commit | f1518da4512dcf350fd808a5288634f534bca1bb (patch) | |
tree | 7098556e9bdfbfc4872777b86eb0ae1e511d1a2d /packages | |
parent | a21b2e30b246b152b3b3692384de534ade2f3485 (diff) | |
download | frameworks_base-f1518da4512dcf350fd808a5288634f534bca1bb.zip frameworks_base-f1518da4512dcf350fd808a5288634f534bca1bb.tar.gz frameworks_base-f1518da4512dcf350fd808a5288634f534bca1bb.tar.bz2 |
Fix fingerprint icon screen on animation
Bug: 22807015
Change-Id: I4685085007d87f1b1e1db380d0f899efc4e56240
Diffstat (limited to 'packages')
4 files changed, 77 insertions, 31 deletions
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3670683..5183c35 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -142,6 +142,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; private static final int MSG_AIRPLANE_MODE_CHANGED = 329; private static final int MSG_SERVICE_STATE_CHANGE = 330; + private static final int MSG_SCREEN_TURNED_ON = 331; + private static final int MSG_SCREEN_TURNED_OFF = 332; private static KeyguardUpdateMonitor sInstance; @@ -248,6 +250,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_SERVICE_STATE_CHANGE: handleServiceStateChange(msg.arg1, (ServiceState) msg.obj); break; + case MSG_SCREEN_TURNED_ON: + handleScreenTurnedOn(); + break; + case MSG_SCREEN_TURNED_OFF: + handleScreenTurnedOff(); + break; } } }; @@ -806,6 +814,26 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { updateFingerprintListeningState(); } + private void handleScreenTurnedOn() { + final int count = mCallbacks.size(); + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onScreenTurnedOn(); + } + } + } + + private void handleScreenTurnedOff() { + final int count = mCallbacks.size(); + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onScreenTurnedOff(); + } + } + } + /** * IMPORTANT: Must be called from UI thread. */ @@ -1486,12 +1514,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { synchronized (this) { mScreenOn = true; } + mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON); } public void dispatchScreenTurnedOff() { synchronized(this) { mScreenOn = false; } + mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_OFF); } public boolean isDeviceInteractive() { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 0cdf999..6cda2b7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -161,6 +161,16 @@ public class KeyguardUpdateMonitorCallback { public void onFinishedGoingToSleep(int why) { } /** + * Called when the screen has been turned on. + */ + public void onScreenTurnedOn() { } + + /** + * Called when the screen has been turned off. + */ + public void onScreenTurnedOff() { } + + /** * Called when trust changes for a user. */ public void onTrustChanged(int userId) { } 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 6627360..8e5d4d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -644,6 +644,16 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } @Override + public void onScreenTurnedOn() { + mLockIcon.setScreenOn(true); + } + + @Override + public void onScreenTurnedOff() { + mLockIcon.setScreenOn(false); + } + + @Override public void onKeyguardVisibilityChanged(boolean showing) { mLockIcon.update(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 06d2fca..463abfc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -34,12 +34,6 @@ import com.android.systemui.statusbar.policy.AccessibilityController; */ public class LockIcon extends KeyguardAffordanceView { - /** - * Delay animations a bit when the screen just turned on as a heuristic to start them after - * the screen has actually turned on. - */ - private static final long ANIM_DELAY_AFTER_SCREEN_ON = 250; - private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; private static final int STATE_FACE_UNLOCK = 2; @@ -50,6 +44,8 @@ public class LockIcon extends KeyguardAffordanceView { private boolean mLastDeviceInteractive; private boolean mTransientFpError; private boolean mDeviceInteractive; + private boolean mScreenOn; + private boolean mLastScreenOn; private final TrustDrawable mTrustDrawable; private final UnlockMethodCache mUnlockMethodCache; private AccessibilityController mAccessibilityController; @@ -88,6 +84,11 @@ public class LockIcon extends KeyguardAffordanceView { update(); } + public void setScreenOn(boolean screenOn) { + mScreenOn = screenOn; + update(); + } + public void update() { boolean visible = isShown() && KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); @@ -96,20 +97,20 @@ public class LockIcon extends KeyguardAffordanceView { } else { mTrustDrawable.stop(); } - if (!visible) { - return; - } // TODO: Real icon for facelock. int state = getState(); boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR; - if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive) { + if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive + || mScreenOn != mLastScreenOn) { + boolean isAnim = true; int iconRes = getAnimationResForTransition(mLastState, state, mLastDeviceInteractive, - mDeviceInteractive); + mDeviceInteractive, mLastScreenOn, mScreenOn); if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) { anyFingerprintIcon = true; } if (iconRes == -1) { - iconRes = getIconForState(state); + iconRes = getIconForState(state, mScreenOn, mDeviceInteractive); + isAnim = false; } Drawable icon = mContext.getDrawable(iconRes); final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable @@ -135,23 +136,12 @@ public class LockIcon extends KeyguardAffordanceView { : R.string.accessibility_unlock_button); setContentDescription(contentDescription); mHasFingerPrintIcon = anyFingerprintIcon; - if (animation != null) { - - // If we play the draw on animation, delay it by one frame when the screen is - // actually turned on. - if (iconRes == R.drawable.lockscreen_fingerprint_draw_on_animation) { - postOnAnimationDelayed(new Runnable() { - @Override - public void run() { - animation.start(); - } - }, ANIM_DELAY_AFTER_SCREEN_ON); - } else { - animation.start(); - } + if (animation != null && isAnim) { + animation.start(); } mLastState = state; mLastDeviceInteractive = mDeviceInteractive; + mLastScreenOn = mScreenOn; } // Hide trust circle when fingerprint is running. @@ -192,7 +182,7 @@ public class LockIcon extends KeyguardAffordanceView { mAccessibilityController = accessibilityController; } - private int getIconForState(int state) { + private int getIconForState(int state, boolean screenOn, boolean deviceInteractive) { switch (state) { case STATE_LOCKED: return R.drawable.ic_lock_24dp; @@ -201,7 +191,11 @@ public class LockIcon extends KeyguardAffordanceView { case STATE_FACE_UNLOCK: return com.android.internal.R.drawable.ic_account_circle; case STATE_FINGERPRINT: - return R.drawable.ic_fingerprint; + // If screen is off and device asleep, use the draw on animation so the first frame + // gets drawn. + return screenOn && deviceInteractive + ? R.drawable.ic_fingerprint + : R.drawable.lockscreen_fingerprint_draw_on_animation; case STATE_FINGERPRINT_ERROR: return R.drawable.ic_fingerprint_error; default: @@ -209,8 +203,9 @@ public class LockIcon extends KeyguardAffordanceView { } } - private int getAnimationResForTransition(int oldState, int newState, boolean oldScreenOn, - boolean screenOn) { + private int getAnimationResForTransition(int oldState, int newState, + boolean oldDeviceInteractive, boolean deviceInteractive, + boolean oldScreenOn, boolean screenOn) { if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) { return R.drawable.lockscreen_fingerprint_fp_to_error_state_animation; } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) { @@ -218,7 +213,8 @@ public class LockIcon extends KeyguardAffordanceView { } else if (oldState == STATE_FINGERPRINT && newState == STATE_LOCK_OPEN && !mUnlockMethodCache.isTrusted()) { return R.drawable.lockscreen_fingerprint_draw_off_animation; - } else if (newState == STATE_FINGERPRINT && !oldScreenOn && screenOn) { + } else if (newState == STATE_FINGERPRINT && (!oldScreenOn && screenOn && deviceInteractive + || screenOn && !oldDeviceInteractive && deviceInteractive)) { return R.drawable.lockscreen_fingerprint_draw_on_animation; } else { return -1; |