summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Mankoff <mankoff@google.com> 2020-03-19 11:26:33 -0400
committer Dave Mankoff <mankoff@google.com> 2020-03-24 16:19:43 -0400
commitc46982833c52a93a8c30b85426ec2e5b377ce4eb (patch)
treea36b5f8329cb91d52fca83a0206db3b08323c5fa
parent27bb209292bb27986f89d2d47f046d8f90b9fff2 (diff)
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
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java10
2 files changed, 36 insertions, 26 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index c5c7226c1734..d70484e9cf41 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -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,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
index 224358550f13..f7c861b84a68 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
@@ -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;