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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user