Fix jank when switching themes

Turning overlays on and off takes time,
it also doesn't allow us to have fine control
over which view is using which theme.
Lock screen colors are now driven by themes.

Change-Id: I4b5db6234cafebbe8eaa952781c038370a11488b
Fixes: 63751714
Test: Visual. Set wallpapers, unlock.
Test: runtest -x tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java
Test: systrace
This commit is contained in:
Lucas Dupin
2017-07-17 15:45:06 -07:00
parent 6b4f0bb6fe
commit e5d0b9dddb
18 changed files with 244 additions and 192 deletions

View File

@@ -29,7 +29,9 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.types.ExtractionType;
import com.android.internal.colorextraction.types.Tonal;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Class to process wallpaper colors and generate a tonal palette based on them.
@@ -44,7 +46,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener
private static final String TAG = "ColorExtractor";
private final SparseArray<GradientColors[]> mGradientColors;
private final ArrayList<OnColorsChangedListener> mOnColorsChangedListeners;
private final ArrayList<WeakReference<OnColorsChangedListener>> mOnColorsChangedListeners;
private final Context mContext;
private final ExtractionType mExtractionType;
private WallpaperColors mSystemColors;
@@ -167,8 +169,17 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener
}
protected void triggerColorsChanged(int which) {
for (OnColorsChangedListener listener: mOnColorsChangedListeners) {
listener.onColorsChanged(this, which);
ArrayList<WeakReference<OnColorsChangedListener>> references =
new ArrayList<>(mOnColorsChangedListeners);
final int size = references.size();
for (int i = 0; i < size; i++) {
final WeakReference<OnColorsChangedListener> weakReference = references.get(i);
final OnColorsChangedListener listener = weakReference.get();
if (listener == null) {
mOnColorsChangedListeners.remove(weakReference);
} else {
listener.onColorsChanged(this, which);
}
}
}
@@ -187,11 +198,20 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener
}
public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener) {
mOnColorsChangedListeners.add(listener);
mOnColorsChangedListeners.add(new WeakReference<>(listener));
}
public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener listener) {
mOnColorsChangedListeners.remove(listener);
ArrayList<WeakReference<OnColorsChangedListener>> references =
new ArrayList<>(mOnColorsChangedListeners);
final int size = references.size();
for (int i = 0; i < size; i++) {
final WeakReference<OnColorsChangedListener> weakReference = references.get(i);
if (weakReference.get() == listener) {
mOnColorsChangedListeners.remove(weakReference);
break;
}
}
}
public static class GradientColors {