LockIcon.java revision 1fcafc49ad34cb8f778862653d452ac0fe61461c
127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi/*
227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * Copyright (C) 2015 The Android Open Source Project
327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi *
427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * you may not use this file except in compliance with the License.
627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * You may obtain a copy of the License at
727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi *
827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi *
1027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
1127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
1227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * See the License for the specific language governing permissions and
1427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * limitations under the License
1527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi */
1627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
1727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggipackage com.android.systemui.statusbar.phone;
1827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
1927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.content.Context;
2027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.graphics.drawable.AnimatedVectorDrawable;
2127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.graphics.drawable.Drawable;
2227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.graphics.drawable.InsetDrawable;
2327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.util.AttributeSet;
2427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport android.view.View;
25c99d9a95643c514ee0a671f023359931df443077Selim Cinekimport android.view.accessibility.AccessibilityNodeInfo;
2627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
2727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport com.android.keyguard.KeyguardUpdateMonitor;
2827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport com.android.systemui.R;
2927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport com.android.systemui.statusbar.KeyguardAffordanceView;
3027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggiimport com.android.systemui.statusbar.policy.AccessibilityController;
3127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
3227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi/**
3327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi * Manages the different states and animations of the unlock icon.
3427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi */
3527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggipublic class LockIcon extends KeyguardAffordanceView {
3627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
37864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    /**
38864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi     * Delay animations a bit when the screen just turned on as a heuristic to start them after
39864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi     * the screen has actually turned on.
40864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi     */
41864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    private static final long ANIM_DELAY_AFTER_SCREEN_ON = 250;
4227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
4327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_LOCKED = 0;
4427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_LOCK_OPEN = 1;
4527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FACE_UNLOCK = 2;
4627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FINGERPRINT = 3;
4727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FINGERPRINT_ERROR = 4;
4827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
4927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private int mLastState = 0;
50864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    private boolean mLastScreenOn;
5127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private boolean mTransientFpError;
52864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    private boolean mScreenOn;
5327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private final TrustDrawable mTrustDrawable;
5427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private final UnlockMethodCache mUnlockMethodCache;
5527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private AccessibilityController mAccessibilityController;
56c99d9a95643c514ee0a671f023359931df443077Selim Cinek    private boolean mHasFingerPrintIcon;
5727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
58582b57f984a3ed87265ff5724b35349224605ac9Jorim Jaggi    public LockIcon(Context context, AttributeSet attrs) {
5927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super(context, attrs);
6027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable = new TrustDrawable(context);
6127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setBackground(mTrustDrawable);
6227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
6327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
6427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
6527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    @Override
66582b57f984a3ed87265ff5724b35349224605ac9Jorim Jaggi    protected void onVisibilityChanged(View changedView, int visibility) {
6727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super.onVisibilityChanged(changedView, visibility);
6827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (isShown()) {
6927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.start();
7027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
7127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.stop();
7227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
7327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
7427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
7527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    @Override
7627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    protected void onDetachedFromWindow() {
7727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super.onDetachedFromWindow();
7827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable.stop();
7927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
8027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
8127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void setTransientFpError(boolean transientFpError) {
8227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTransientFpError = transientFpError;
8327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        update();
8427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
8527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
86864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    public void setScreenOn(boolean screenOn) {
87864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        mScreenOn = screenOn;
88864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        update();
89864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    }
90864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi
9127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void update() {
9227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean visible = isShown() && KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
9327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (visible) {
9427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.start();
9527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
9627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.stop();
9727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
9827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (!visible) {
9927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return;
10027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
10127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        // TODO: Real icon for facelock.
10227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        int state = getState();
10327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR;
104864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        if (state != mLastState || mScreenOn != mLastScreenOn) {
105864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            int iconRes = getAnimationResForTransition(mLastState, state, mLastScreenOn, mScreenOn);
106864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) {
107864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                anyFingerprintIcon = true;
108864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            }
10927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            if (iconRes == -1) {
11027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                iconRes = getIconForState(state);
11127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
11227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            Drawable icon = mContext.getDrawable(iconRes);
113864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
114864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    ? (AnimatedVectorDrawable) icon
115864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    : null;
11627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            int iconHeight = getResources().getDimensionPixelSize(
11727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.keyguard_affordance_icon_height);
11827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            int iconWidth = getResources().getDimensionPixelSize(
11927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.keyguard_affordance_icon_width);
12027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            if (!anyFingerprintIcon && (icon.getIntrinsicHeight() != iconHeight
12127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    || icon.getIntrinsicWidth() != iconWidth)) {
12227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                icon = new IntrinsicSizeDrawable(icon, iconWidth, iconHeight);
12327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
12427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            setPaddingRelative(0, 0, 0, anyFingerprintIcon
12527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    ? getResources().getDimensionPixelSize(
12627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.fingerprint_icon_additional_padding)
12727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    : 0);
12827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            setRestingAlpha(
12927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    anyFingerprintIcon ? 1f : KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT);
13027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            setImageDrawable(icon);
131c99d9a95643c514ee0a671f023359931df443077Selim Cinek            String contentDescription = getResources().getString(anyFingerprintIcon
132c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    ? R.string.accessibility_unlock_button_fingerprint
133c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    : R.string.accessibility_unlock_button);
134c99d9a95643c514ee0a671f023359931df443077Selim Cinek            setContentDescription(contentDescription);
135c99d9a95643c514ee0a671f023359931df443077Selim Cinek            mHasFingerPrintIcon = anyFingerprintIcon;
13627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            if (animation != null) {
137864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi
138864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                // If we play the draw on animation, delay it by one frame when the screen is
139864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                // actually turned on.
140864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                if (iconRes == R.drawable.lockscreen_fingerprint_draw_on_animation) {
141864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    postOnAnimationDelayed(new Runnable() {
142864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                        @Override
143864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                        public void run() {
144864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                            animation.start();
145864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                        }
146864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    }, ANIM_DELAY_AFTER_SCREEN_ON);
147864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                } else {
148864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    animation.start();
149864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                }
15027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
151864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            mLastState = state;
152864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            mLastScreenOn = mScreenOn;
15327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
15427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
15527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        // Hide trust circle when fingerprint is running.
15627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean trustManaged = mUnlockMethodCache.isTrustManaged() && !anyFingerprintIcon;
15727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable.setTrustManaged(trustManaged);
15827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        updateClickability();
15927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
16027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
16127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private void updateClickability() {
16227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (mAccessibilityController == null) {
16327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return;
16427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
16527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean clickToUnlock = mAccessibilityController.isTouchExplorationEnabled();
16627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean clickToForceLock = mUnlockMethodCache.isTrustManaged()
16727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                && !mAccessibilityController.isAccessibilityEnabled();
16827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged()
16927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                && !clickToForceLock;
17027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setClickable(clickToForceLock || clickToUnlock);
17127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setLongClickable(longClickToForceLock);
17227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setFocusable(mAccessibilityController.isAccessibilityEnabled());
17327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
17427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
175c99d9a95643c514ee0a671f023359931df443077Selim Cinek    @Override
176c99d9a95643c514ee0a671f023359931df443077Selim Cinek    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
177c99d9a95643c514ee0a671f023359931df443077Selim Cinek        super.onInitializeAccessibilityNodeInfo(info);
178c99d9a95643c514ee0a671f023359931df443077Selim Cinek        if (mHasFingerPrintIcon) {
179c99d9a95643c514ee0a671f023359931df443077Selim Cinek            // Avoid that the button description is also spoken
180c99d9a95643c514ee0a671f023359931df443077Selim Cinek            info.setClassName(LockIcon.class.getName());
181c99d9a95643c514ee0a671f023359931df443077Selim Cinek            AccessibilityNodeInfo.AccessibilityAction unlock
182c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    = new AccessibilityNodeInfo.AccessibilityAction(
183c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    AccessibilityNodeInfo.ACTION_CLICK,
184c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    getContext().getString(R.string.accessibility_unlock_without_fingerprint));
185c99d9a95643c514ee0a671f023359931df443077Selim Cinek            info.addAction(unlock);
186c99d9a95643c514ee0a671f023359931df443077Selim Cinek        }
187c99d9a95643c514ee0a671f023359931df443077Selim Cinek    }
188c99d9a95643c514ee0a671f023359931df443077Selim Cinek
18927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void setAccessibilityController(AccessibilityController accessibilityController) {
19027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mAccessibilityController = accessibilityController;
19127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
19227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
19327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private int getIconForState(int state) {
19427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        switch (state) {
19527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_LOCKED:
19627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_lock_24dp;
19727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_LOCK_OPEN:
19827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_lock_open_24dp;
19927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FACE_UNLOCK:
20027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return com.android.internal.R.drawable.ic_account_circle;
20127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FINGERPRINT:
20227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_fingerprint;
20327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FINGERPRINT_ERROR:
20427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_fingerprint_error;
20527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            default:
20627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                throw new IllegalArgumentException();
20727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
20827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
20927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
210864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    private int getAnimationResForTransition(int oldState, int newState, boolean oldScreenOn,
211864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            boolean screenOn) {
21227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
213864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
214864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
215864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
2162a46d6857172e6f9dfedb150f7eda8dba65eaf91Selim Cinek        } else if (oldState == STATE_FINGERPRINT && newState == STATE_LOCK_OPEN
217e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek                && !mUnlockMethodCache.isTrusted()) {
218864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_draw_off_animation;
219864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        } else if (newState == STATE_FINGERPRINT && !oldScreenOn && screenOn) {
220864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_draw_on_animation;
22127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
22227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return -1;
22327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
22427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
22527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
22627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private int getState() {
2271fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
2281fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
2291fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
230e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek        if (mUnlockMethodCache.canSkipBouncer()) {
2312a46d6857172e6f9dfedb150f7eda8dba65eaf91Selim Cinek            return STATE_LOCK_OPEN;
2322a46d6857172e6f9dfedb150f7eda8dba65eaf91Selim Cinek        } else if (mTransientFpError) {
23327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_FINGERPRINT_ERROR;
2341fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        } else if (fingerprintRunning && unlockingAllowed) {
23527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_FINGERPRINT;
23627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else if (mUnlockMethodCache.isFaceUnlockRunning()) {
23727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_FACE_UNLOCK;
23827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
23927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_LOCKED;
24027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
24127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
24227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
24327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    /**
24427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi     * A wrapper around another Drawable that overrides the intrinsic size.
24527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi     */
24627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static class IntrinsicSizeDrawable extends InsetDrawable {
24727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
24827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        private final int mIntrinsicWidth;
24927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        private final int mIntrinsicHeight;
25027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
25127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public IntrinsicSizeDrawable(Drawable drawable, int intrinsicWidth, int intrinsicHeight) {
25227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            super(drawable, 0);
25327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mIntrinsicWidth = intrinsicWidth;
25427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mIntrinsicHeight = intrinsicHeight;
25527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
25627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
25727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        @Override
25827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public int getIntrinsicWidth() {
25927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return mIntrinsicWidth;
26027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
26127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
26227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        @Override
26327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public int getIntrinsicHeight() {
26427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return mIntrinsicHeight;
26527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
26627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
26727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi}
268