LockIcon.java revision 16093fe3f0d824731a53a264a132504deb08421a
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
3727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_LOCKED = 0;
3827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_LOCK_OPEN = 1;
3927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FACE_UNLOCK = 2;
4027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FINGERPRINT = 3;
4127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static final int STATE_FINGERPRINT_ERROR = 4;
4227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
4327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private int mLastState = 0;
440d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mLastDeviceInteractive;
4527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private boolean mTransientFpError;
460d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mDeviceInteractive;
47f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    private boolean mScreenOn;
48f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    private boolean mLastScreenOn;
4927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private final TrustDrawable mTrustDrawable;
5027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private final UnlockMethodCache mUnlockMethodCache;
5127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private AccessibilityController mAccessibilityController;
52c99d9a95643c514ee0a671f023359931df443077Selim Cinek    private boolean mHasFingerPrintIcon;
5327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
54582b57f984a3ed87265ff5724b35349224605ac9Jorim Jaggi    public LockIcon(Context context, AttributeSet attrs) {
5527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super(context, attrs);
5627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable = new TrustDrawable(context);
5727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setBackground(mTrustDrawable);
5827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
5927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
6027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
6127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    @Override
62582b57f984a3ed87265ff5724b35349224605ac9Jorim Jaggi    protected void onVisibilityChanged(View changedView, int visibility) {
6327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super.onVisibilityChanged(changedView, visibility);
6427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (isShown()) {
6527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.start();
6627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
6727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.stop();
6827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
6927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
7027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
7127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    @Override
7227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    protected void onDetachedFromWindow() {
7327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        super.onDetachedFromWindow();
7427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable.stop();
7527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
7627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
7727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void setTransientFpError(boolean transientFpError) {
7827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTransientFpError = transientFpError;
7927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        update();
8027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
8127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
820d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void setDeviceInteractive(boolean deviceInteractive) {
830d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mDeviceInteractive = deviceInteractive;
84864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        update();
85864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi    }
86864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi
87f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    public void setScreenOn(boolean screenOn) {
88f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi        mScreenOn = screenOn;
89f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi        update();
90f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    }
91f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi
9227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void update() {
930d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        boolean visible = isShown()
940d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                && KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
9527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (visible) {
9627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.start();
9727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
9827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mTrustDrawable.stop();
9927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
10027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        // TODO: Real icon for facelock.
10127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        int state = getState();
10227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR;
103c384198529870946249a79166fd0a42c1823bf09Selim Cinek        boolean useAdditionalPadding = anyFingerprintIcon;
104c384198529870946249a79166fd0a42c1823bf09Selim Cinek        boolean trustHidden = anyFingerprintIcon;
105f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi        if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive
106f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                || mScreenOn != mLastScreenOn) {
107f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi            boolean isAnim = true;
1080d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            int iconRes = getAnimationResForTransition(mLastState, state, mLastDeviceInteractive,
109f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                    mDeviceInteractive, mLastScreenOn, mScreenOn);
110864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) {
111864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                anyFingerprintIcon = true;
112c384198529870946249a79166fd0a42c1823bf09Selim Cinek                useAdditionalPadding = true;
113c384198529870946249a79166fd0a42c1823bf09Selim Cinek                trustHidden = true;
114c384198529870946249a79166fd0a42c1823bf09Selim Cinek            } else if (iconRes == R.drawable.trusted_state_to_error_animation) {
115c384198529870946249a79166fd0a42c1823bf09Selim Cinek                anyFingerprintIcon = true;
116c384198529870946249a79166fd0a42c1823bf09Selim Cinek                useAdditionalPadding = false;
117c384198529870946249a79166fd0a42c1823bf09Selim Cinek                trustHidden = true;
118c384198529870946249a79166fd0a42c1823bf09Selim Cinek            } else if (iconRes == R.drawable.error_to_trustedstate_animation) {
119c384198529870946249a79166fd0a42c1823bf09Selim Cinek                anyFingerprintIcon = true;
120c384198529870946249a79166fd0a42c1823bf09Selim Cinek                useAdditionalPadding = false;
121c384198529870946249a79166fd0a42c1823bf09Selim Cinek                trustHidden = false;
122864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            }
12327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            if (iconRes == -1) {
124f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                iconRes = getIconForState(state, mScreenOn, mDeviceInteractive);
125f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                isAnim = false;
12627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
12727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            Drawable icon = mContext.getDrawable(iconRes);
128864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
129864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    ? (AnimatedVectorDrawable) icon
130864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi                    : null;
13127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            int iconHeight = getResources().getDimensionPixelSize(
13227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.keyguard_affordance_icon_height);
13327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            int iconWidth = getResources().getDimensionPixelSize(
13427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.keyguard_affordance_icon_width);
13527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            if (!anyFingerprintIcon && (icon.getIntrinsicHeight() != iconHeight
13627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    || icon.getIntrinsicWidth() != iconWidth)) {
13727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                icon = new IntrinsicSizeDrawable(icon, iconWidth, iconHeight);
13827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
139c384198529870946249a79166fd0a42c1823bf09Selim Cinek            setPaddingRelative(0, 0, 0, useAdditionalPadding
14027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    ? getResources().getDimensionPixelSize(
14127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    R.dimen.fingerprint_icon_additional_padding)
14227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    : 0);
14327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            setRestingAlpha(
14427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                    anyFingerprintIcon ? 1f : KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT);
14527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            setImageDrawable(icon);
146c99d9a95643c514ee0a671f023359931df443077Selim Cinek            String contentDescription = getResources().getString(anyFingerprintIcon
147c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    ? R.string.accessibility_unlock_button_fingerprint
148c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    : R.string.accessibility_unlock_button);
149c99d9a95643c514ee0a671f023359931df443077Selim Cinek            setContentDescription(contentDescription);
150c99d9a95643c514ee0a671f023359931df443077Selim Cinek            mHasFingerPrintIcon = anyFingerprintIcon;
151f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi            if (animation != null && isAnim) {
152f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                animation.start();
15327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            }
154864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            mLastState = state;
1550d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mLastDeviceInteractive = mDeviceInteractive;
156f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi            mLastScreenOn = mScreenOn;
15727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
15827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
15927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        // Hide trust circle when fingerprint is running.
160c384198529870946249a79166fd0a42c1823bf09Selim Cinek        boolean trustManaged = mUnlockMethodCache.isTrustManaged() && !trustHidden;
16127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mTrustDrawable.setTrustManaged(trustManaged);
16227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        updateClickability();
16327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
16427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
16527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private void updateClickability() {
16627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (mAccessibilityController == null) {
16727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return;
16827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
16927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        boolean clickToUnlock = mAccessibilityController.isTouchExplorationEnabled();
17016093fe3f0d824731a53a264a132504deb08421aJorim Jaggi        boolean clickToForceLock = mUnlockMethodCache.isTrustManaged()
17127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                && !mAccessibilityController.isAccessibilityEnabled();
17216093fe3f0d824731a53a264a132504deb08421aJorim Jaggi        boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged()
17327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                && !clickToForceLock;
17427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setClickable(clickToForceLock || clickToUnlock);
17527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setLongClickable(longClickToForceLock);
17627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        setFocusable(mAccessibilityController.isAccessibilityEnabled());
17727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
17827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
179c99d9a95643c514ee0a671f023359931df443077Selim Cinek    @Override
180c99d9a95643c514ee0a671f023359931df443077Selim Cinek    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
181c99d9a95643c514ee0a671f023359931df443077Selim Cinek        super.onInitializeAccessibilityNodeInfo(info);
182c99d9a95643c514ee0a671f023359931df443077Selim Cinek        if (mHasFingerPrintIcon) {
183c99d9a95643c514ee0a671f023359931df443077Selim Cinek            // Avoid that the button description is also spoken
184c99d9a95643c514ee0a671f023359931df443077Selim Cinek            info.setClassName(LockIcon.class.getName());
185c99d9a95643c514ee0a671f023359931df443077Selim Cinek            AccessibilityNodeInfo.AccessibilityAction unlock
186c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    = new AccessibilityNodeInfo.AccessibilityAction(
187c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    AccessibilityNodeInfo.ACTION_CLICK,
188c99d9a95643c514ee0a671f023359931df443077Selim Cinek                    getContext().getString(R.string.accessibility_unlock_without_fingerprint));
189c99d9a95643c514ee0a671f023359931df443077Selim Cinek            info.addAction(unlock);
190c99d9a95643c514ee0a671f023359931df443077Selim Cinek        }
191c99d9a95643c514ee0a671f023359931df443077Selim Cinek    }
192c99d9a95643c514ee0a671f023359931df443077Selim Cinek
19327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    public void setAccessibilityController(AccessibilityController accessibilityController) {
19427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        mAccessibilityController = accessibilityController;
19527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
19627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
197f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    private int getIconForState(int state, boolean screenOn, boolean deviceInteractive) {
19827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        switch (state) {
19927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_LOCKED:
20027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_lock_24dp;
20127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_LOCK_OPEN:
20227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_lock_open_24dp;
20327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FACE_UNLOCK:
20427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return com.android.internal.R.drawable.ic_account_circle;
20527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FINGERPRINT:
206f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                // If screen is off and device asleep, use the draw on animation so the first frame
207f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                // gets drawn.
208f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                return screenOn && deviceInteractive
209f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                        ? R.drawable.ic_fingerprint
210f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                        : R.drawable.lockscreen_fingerprint_draw_on_animation;
21127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            case STATE_FINGERPRINT_ERROR:
21227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                return R.drawable.ic_fingerprint_error;
21327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            default:
21427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi                throw new IllegalArgumentException();
21527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
21627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
21727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
218f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi    private int getAnimationResForTransition(int oldState, int newState,
219f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi            boolean oldDeviceInteractive, boolean deviceInteractive,
220f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi            boolean oldScreenOn, boolean screenOn) {
22127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
222864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
223c384198529870946249a79166fd0a42c1823bf09Selim Cinek        } else if (oldState == STATE_LOCK_OPEN && newState == STATE_FINGERPRINT_ERROR) {
224c384198529870946249a79166fd0a42c1823bf09Selim Cinek            return R.drawable.trusted_state_to_error_animation;
225c384198529870946249a79166fd0a42c1823bf09Selim Cinek        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_LOCK_OPEN) {
226c384198529870946249a79166fd0a42c1823bf09Selim Cinek            return R.drawable.error_to_trustedstate_animation;
227864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
228864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
2292a46d6857172e6f9dfedb150f7eda8dba65eaf91Selim Cinek        } else if (oldState == STATE_FINGERPRINT && newState == STATE_LOCK_OPEN
230e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek                && !mUnlockMethodCache.isTrusted()) {
231864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_draw_off_animation;
232f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi        } else if (newState == STATE_FINGERPRINT && (!oldScreenOn && screenOn && deviceInteractive
233f1518da4512dcf350fd808a5288634f534bca1bbJorim Jaggi                || screenOn && !oldDeviceInteractive && deviceInteractive)) {
234864e64bacee1d09b60c1c8741b7195cf6ce7aa22Jorim Jaggi            return R.drawable.lockscreen_fingerprint_draw_on_animation;
23527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
23627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return -1;
23727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
23827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
23927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
24027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private int getState() {
2411fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
2421fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
2431fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek        boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
244c384198529870946249a79166fd0a42c1823bf09Selim Cinek        if (mTransientFpError) {
24527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_FINGERPRINT_ERROR;
246c384198529870946249a79166fd0a42c1823bf09Selim Cinek        } else if (mUnlockMethodCache.canSkipBouncer()) {
247c384198529870946249a79166fd0a42c1823bf09Selim Cinek            return STATE_LOCK_OPEN;
24827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else if (mUnlockMethodCache.isFaceUnlockRunning()) {
24927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_FACE_UNLOCK;
250e07cbaf53c545fc7176cebfe14096cabb677798aAdrian Roos        } else if (fingerprintRunning && unlockingAllowed) {
251e07cbaf53c545fc7176cebfe14096cabb677798aAdrian Roos            return STATE_FINGERPRINT;
25227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        } else {
25327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return STATE_LOCKED;
25427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
25527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
25627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
25727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    /**
25827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi     * A wrapper around another Drawable that overrides the intrinsic size.
25927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi     */
26027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    private static class IntrinsicSizeDrawable extends InsetDrawable {
26127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
26227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        private final int mIntrinsicWidth;
26327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        private final int mIntrinsicHeight;
26427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
26527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public IntrinsicSizeDrawable(Drawable drawable, int intrinsicWidth, int intrinsicHeight) {
26627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            super(drawable, 0);
26727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mIntrinsicWidth = intrinsicWidth;
26827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            mIntrinsicHeight = intrinsicHeight;
26927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
27027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
27127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        @Override
27227267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public int getIntrinsicWidth() {
27327267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return mIntrinsicWidth;
27427267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
27527267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi
27627267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        @Override
27727267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        public int getIntrinsicHeight() {
27827267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi            return mIntrinsicHeight;
27927267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi        }
28027267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi    }
28127267d6869a4e970e7575f36d0de75e8cb663952Jorim Jaggi}
282