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