summaryrefslogtreecommitdiff
path: root/core/java/android/app
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2021-12-01 21:50:43 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-12-01 21:50:43 +0000
commiteb57e090bc5be8d12fdfd6463b264cc37b2ae470 (patch)
tree4c5e33ad36bfb0b5582330b53377ea76c06dd255 /core/java/android/app
parent7f947fbf6c8fbcc3c78fa7ae6179e779ef341c2b (diff)
parent2eaae4e670a1dc8a38806676a8a3aba134766ff7 (diff)
Merge "Properly remove local color areas of callback" into sc-v2-dev
Diffstat (limited to 'core/java/android/app')
-rw-r--r--core/java/android/app/WallpaperManager.java81
1 files changed, 44 insertions, 37 deletions
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 22b1c03fba50..fca4c698c49c 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -365,17 +365,18 @@ public class WallpaperManager {
private int mCachedWallpaperUserId;
private Bitmap mDefaultWallpaper;
private Handler mMainLooperHandler;
- private ArrayMap<RectF, ArraySet<LocalWallpaperColorConsumer>> mLocalColorAreas =
- new ArrayMap<>();
+ private ArrayMap<LocalWallpaperColorConsumer, ArraySet<RectF>> mLocalColorCallbackAreas =
+ new ArrayMap<>();
private ILocalWallpaperColorConsumer mLocalColorCallback =
new ILocalWallpaperColorConsumer.Stub() {
@Override
public void onColorsChanged(RectF area, WallpaperColors colors) {
- ArraySet<LocalWallpaperColorConsumer> callbacks =
- mLocalColorAreas.get(area);
- if (callbacks == null) return;
- for (LocalWallpaperColorConsumer callback: callbacks) {
- callback.onColorsChanged(area, colors);
+ for (LocalWallpaperColorConsumer callback :
+ mLocalColorCallbackAreas.keySet()) {
+ ArraySet<RectF> areas = mLocalColorCallbackAreas.get(callback);
+ if (areas != null && areas.contains(area)) {
+ callback.onColorsChanged(area, colors);
+ }
}
}
};
@@ -420,46 +421,52 @@ public class WallpaperManager {
}
}
- public void addOnColorsChangedListener(@NonNull LocalWallpaperColorConsumer callback,
+ public void addOnColorsChangedListener(
+ @NonNull LocalWallpaperColorConsumer callback,
@NonNull List<RectF> regions, int which, int userId, int displayId) {
- for (RectF area: regions) {
- ArraySet<LocalWallpaperColorConsumer> callbacks = mLocalColorAreas.get(area);
- if (callbacks == null) {
- callbacks = new ArraySet<>();
- mLocalColorAreas.put(area, callbacks);
+ synchronized (this) {
+ for (RectF area : regions) {
+ ArraySet<RectF> areas = mLocalColorCallbackAreas.get(callback);
+ if (areas == null) {
+ areas = new ArraySet<>();
+ mLocalColorCallbackAreas.put(callback, areas);
+ }
+ areas.add(area);
+ }
+ try {
+ // one way returns immediately
+ mService.addOnLocalColorsChangedListener(mLocalColorCallback, regions, which,
+ userId, displayId);
+ } catch (RemoteException e) {
+ // Can't get colors, connection lost.
+ Log.e(TAG, "Can't register for local color updates", e);
}
- callbacks.add(callback);
- }
- try {
- mService.addOnLocalColorsChangedListener(mLocalColorCallback , regions, which,
- userId, displayId);
- } catch (RemoteException e) {
- // Can't get colors, connection lost.
- Log.e(TAG, "Can't register for local color updates", e);
}
}
public void removeOnColorsChangedListener(
@NonNull LocalWallpaperColorConsumer callback, int which, int userId,
int displayId) {
- final ArrayList<RectF> removeAreas = new ArrayList<>();
- for (RectF area : mLocalColorAreas.keySet()) {
- ArraySet<LocalWallpaperColorConsumer> callbacks = mLocalColorAreas.get(area);
- if (callbacks == null) continue;
- callbacks.remove(callback);
- if (callbacks.size() == 0) {
- mLocalColorAreas.remove(area);
- removeAreas.add(area);
+ synchronized (this) {
+ final ArraySet<RectF> removeAreas = mLocalColorCallbackAreas.remove(callback);
+ if (removeAreas == null || removeAreas.size() == 0) {
+ return;
}
- }
- try {
- if (removeAreas.size() > 0) {
- mService.removeOnLocalColorsChangedListener(
- mLocalColorCallback, removeAreas, which, userId, displayId);
+ for (LocalWallpaperColorConsumer cb : mLocalColorCallbackAreas.keySet()) {
+ ArraySet<RectF> areas = mLocalColorCallbackAreas.get(cb);
+ if (areas != null && cb != callback) removeAreas.removeAll(areas);
+ }
+ try {
+ if (removeAreas.size() > 0) {
+ // one way returns immediately
+ mService.removeOnLocalColorsChangedListener(
+ mLocalColorCallback, new ArrayList(removeAreas), which, userId,
+ displayId);
+ }
+ } catch (RemoteException e) {
+ // Can't get colors, connection lost.
+ Log.e(TAG, "Can't unregister for local color updates", e);
}
- } catch (RemoteException e) {
- // Can't get colors, connection lost.
- Log.e(TAG, "Can't unregister for local color updates", e);
}
}