Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1518da4 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix fingerprint icon screen on animation

Bug: 22807015
Change-Id: I4685085007d87f1b1e1db380d0f899efc4e56240
parent a21b2e30
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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() {
+10 −0
Original line number Diff line number Diff line
@@ -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.
     */
+10 −0
Original line number Diff line number Diff line
@@ -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();
+27 −31
Original line number Diff line number Diff line
@@ -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() {
            if (animation != null && isAnim) {
                animation.start();
            }
                    }, ANIM_DELAY_AFTER_SCREEN_ON);
                } else {
                    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;