Fix fingerprint icon screen on animation
Bug: 22807015 Change-Id: I4685085007d87f1b1e1db380d0f899efc4e56240
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user