Cache icon drawables.

There's only a few of these. They currently get reloaded every time
the view changes states. This loading also happens in an on-predraw
listener. Cache them instead.

Fixes: 145666518
Test: atest SystemUITests
Change-Id: I5727459d395f1e347db42d91b313913c079ff3be
This commit is contained in:
Dave Mankoff
2020-03-19 11:26:33 -04:00
parent 27bb209292
commit c46982833c
2 changed files with 36 additions and 26 deletions

View File

@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone;
import android.annotation.IntDef;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -27,6 +28,7 @@ import android.os.Trace;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.ViewTreeObserver.OnPreDrawListener;
import com.android.internal.graphics.ColorUtils;
@@ -53,7 +55,7 @@ public class LockIcon extends KeyguardAffordanceView {
private boolean mPulsing;
private boolean mDozing;
private boolean mKeyguardJustShown;
private boolean mScanningFace;
private final SparseArray<Drawable> mDrawableCache = new SparseArray<>();
private final OnPreDrawListener mOnPreDrawListener = new OnPreDrawListener() {
@Override
@@ -61,23 +63,15 @@ public class LockIcon extends KeyguardAffordanceView {
getViewTreeObserver().removeOnPreDrawListener(this);
int newState = mStateProvider.getState();
@LockAnimIndex final int lockAnimIndex =
getAnimationIndexForTransition(mOldState, newState, mPulsing, mDozing,
mKeyguardJustShown);
boolean isAnim = lockAnimIndex != -1;
int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex)
: LockIcon.getIconForState(newState);
Drawable icon = getResources().getDrawable(iconRes);
Drawable icon = getIcon(newState);
setImageDrawable(icon, false);
if (mScanningFace) {
if (newState == STATE_SCANNING_FACE) {
announceForAccessibility(getResources().getString(
R.string.accessibility_scanning_face));
}
if (isAnim && icon instanceof AnimatedVectorDrawable) {
if (icon instanceof AnimatedVectorDrawable) {
final AnimatedVectorDrawable animation = (AnimatedVectorDrawable) icon;
animation.forceAnimationOnUI();
animation.clearAnimationCallbacks();
@@ -87,7 +81,7 @@ public class LockIcon extends KeyguardAffordanceView {
public void onAnimationEnd(Drawable drawable) {
if (getDrawable() == animation
&& newState == mStateProvider.getState()
&& lockAnimIndex == LockIcon.SCANNING) {
&& newState == STATE_SCANNING_FACE) {
animation.start();
} else {
Trace.endAsyncSection("LockIcon#Animation", newState);
@@ -110,6 +104,12 @@ public class LockIcon extends KeyguardAffordanceView {
mStateProvider = stateProvider;
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawableCache.clear();
}
/**
* Update the icon visibility
* @return true if the visibility changed
@@ -135,13 +135,11 @@ public class LockIcon extends KeyguardAffordanceView {
return false;
}
void update(int oldState, boolean pulsing, boolean dozing,
boolean keyguardJustShown, boolean scanningFace) {
void update(int oldState, boolean pulsing, boolean dozing, boolean keyguardJustShown) {
mOldState = oldState;
mPulsing = pulsing;
mDozing = dozing;
mKeyguardJustShown = keyguardJustShown;
mScanningFace = scanningFace;
getViewTreeObserver().addOnPreDrawListener(mOnPreDrawListener);
}
@@ -151,7 +149,8 @@ public class LockIcon extends KeyguardAffordanceView {
updateDarkTint();
}
void setIconColor(int iconColor) {
void onThemeChange(int iconColor) {
mDrawableCache.clear();
mIconColor = iconColor;
updateDarkTint();
}
@@ -161,6 +160,21 @@ public class LockIcon extends KeyguardAffordanceView {
setImageTintList(ColorStateList.valueOf(color));
}
private Drawable getIcon(int newState) {
@LockAnimIndex final int lockAnimIndex =
getAnimationIndexForTransition(mOldState, newState, mPulsing, mDozing,
mKeyguardJustShown);
boolean isAnim = lockAnimIndex != -1;
int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(newState);
if (!mDrawableCache.contains(iconRes)) {
mDrawableCache.put(iconRes, getResources().getDrawable(iconRes));
}
return mDrawableCache.get(iconRes);
}
static int getIconForState(int state) {
int iconRes;
switch (state) {
@@ -206,7 +220,7 @@ public class LockIcon extends KeyguardAffordanceView {
@IntDef({ERROR, UNLOCK, LOCK, SCANNING})
@interface LockAnimIndex {}
static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3;
static final int[][] LOCK_ANIM_RES_IDS = new int[][] {
private static final int[][] LOCK_ANIM_RES_IDS = new int[][] {
{
R.anim.lock_to_error,
R.anim.lock_unlock,

View File

@@ -75,7 +75,6 @@ public class LockscreenLockIconController {
private final HeadsUpManagerPhone mHeadsUpManagerPhone;
private boolean mKeyguardShowing;
private boolean mKeyguardJustShown;
private boolean mIsFaceUnlockState;
private boolean mBlockUpdates;
private boolean mPulsing;
private boolean mDozing;
@@ -150,7 +149,7 @@ public class LockscreenLockIconController {
null, new int[]{ R.attr.wallpaperTextColor }, 0, 0);
int iconColor = typedArray.getColor(0, Color.WHITE);
typedArray.recycle();
mLockIcon.setIconColor(iconColor);
mLockIcon.onThemeChange(iconColor);
}
@Override
@@ -299,7 +298,7 @@ public class LockscreenLockIconController {
info.addAction(unlock);
info.setHintText(mResources.getString(
R.string.accessibility_waiting_for_fingerprint));
} else if (mIsFaceUnlockState) {
} else if (getState() == STATE_SCANNING_FACE) {
//Avoid 'button' to be spoken for scanning face
info.setClassName(LockIcon.class.getName());
info.setContentDescription(mResources.getString(
@@ -458,15 +457,12 @@ public class LockscreenLockIconController {
private void update(boolean force) {
int state = getState();
mIsFaceUnlockState = state == STATE_SCANNING_FACE;
boolean shouldUpdate = mLastState != state || force;
if (mBlockUpdates && canBlockUpdates()) {
shouldUpdate = false;
}
if (shouldUpdate && mLockIcon != null) {
mLockIcon.update(
mLastState, mPulsing, mDozing, mKeyguardJustShown, mIsFaceUnlockState);
mLockIcon.update(mLastState, mPulsing, mDozing, mKeyguardJustShown);
}
mLastState = state;
mKeyguardJustShown = false;