Fix fingerprint icon screen on animation

Bug: 22807015
Change-Id: I4685085007d87f1b1e1db380d0f899efc4e56240
This commit is contained in:
Jorim Jaggi
2015-07-30 11:56:36 -07:00
parent a21b2e30b2
commit f1518da451
4 changed files with 77 additions and 31 deletions

View File

@@ -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() {

View File

@@ -160,6 +160,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.
*/

View File

@@ -643,6 +643,16 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
mLockIcon.setDeviceInteractive(false);
}
@Override
public void onScreenTurnedOn() {
mLockIcon.setScreenOn(true);
}
@Override
public void onScreenTurnedOff() {
mLockIcon.setScreenOn(false);
}
@Override
public void onKeyguardVisibilityChanged(boolean showing) {
mLockIcon.update();

View File

@@ -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;