summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Diego Vela <diegovela@google.com> 2025-03-12 20:01:20 +0000
committer Diego Vela <diegovela@google.com> 2025-03-14 00:48:40 +0000
commit9dea2c455b3d5b95778e490ec7d32e5835d4d693 (patch)
treea39335fc4ddc1d7da57146edd372e81b3e1f5d97
parente0150b49b99d8c38c7a02cc6a7e72ac05a13d5d0 (diff)
Ensure listener is not triggered when reregistered
Ensure a listener is not reregistered a second time. Ensure the listener does not get a repeat value. Update the javadocs for addGlobalWindowViewsListener to clear up confusion. Fix some typos. Flag: android.view.flags.root_view_changed_listener Bug: 401234449 Test: atest CtsViewTestCases Change-Id: Icaaee0db756884f90409e07c0f088b04afba4ce3
-rw-r--r--core/java/android/view/WindowManagerGlobal.java8
-rw-r--r--core/java/android/view/inspector/WindowInspector.java5
-rw-r--r--core/java/android/view/translation/ListenerGroup.java4
3 files changed, 11 insertions, 6 deletions
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index 624216776f42..b97f28da7559 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -329,13 +329,17 @@ public final class WindowManagerGlobal {
/**
* Adds a listener that will be notified whenever {@link #getWindowViews()} changes. The
- * current value is provided immediately. If it was registered previously then this is ano op.
+ * current value is provided immediately using the provided {@link Executor}. If this
+ * {@link Consumer} was registered previously, then this is a no op.
*/
public void addWindowViewsListener(@NonNull Executor executor,
@NonNull Consumer<List<View>> consumer) {
synchronized (mLock) {
+ if (mWindowViewsListenerGroup.isConsumerPresent(consumer)) {
+ return;
+ }
mWindowViewsListenerGroup.addListener(executor, consumer);
- mWindowViewsListenerGroup.accept(getWindowViews());
+ executor.execute(() -> consumer.accept(getWindowViews()));
}
}
diff --git a/core/java/android/view/inspector/WindowInspector.java b/core/java/android/view/inspector/WindowInspector.java
index 3ebca3c9d9b6..f0cc01133e07 100644
--- a/core/java/android/view/inspector/WindowInspector.java
+++ b/core/java/android/view/inspector/WindowInspector.java
@@ -42,8 +42,9 @@ public final class WindowInspector {
}
/**
- * Adds a listener that is notified whenever the list of global window views changes. If a
- * {@link Consumer} is already registered this method is a no op.
+ * Adds a listener that is notified whenever the value of {@link #getGlobalWindowViews()}
+ * changes. The current value is provided immediately using the provided {@link Executor}.
+ * If this {@link Consumer} is already registered, then this method is a no op.
* @see #getGlobalWindowViews()
*/
@FlaggedApi(android.view.flags.Flags.FLAG_ROOT_VIEW_CHANGED_LISTENER)
diff --git a/core/java/android/view/translation/ListenerGroup.java b/core/java/android/view/translation/ListenerGroup.java
index bf506815f841..5c70805042fa 100644
--- a/core/java/android/view/translation/ListenerGroup.java
+++ b/core/java/android/view/translation/ListenerGroup.java
@@ -48,7 +48,7 @@ public class ListenerGroup<T> {
* is a no op.
*/
public void addListener(@NonNull Executor executor, @NonNull Consumer<T> consumer) {
- if (isContained(consumer)) {
+ if (isConsumerPresent(consumer)) {
return;
}
mListeners.add(new ListenerWrapper<>(executor, consumer));
@@ -69,7 +69,7 @@ public class ListenerGroup<T> {
* Returns {@code true} if the {@link Consumer} is present in the list, {@code false}
* otherwise.
*/
- private boolean isContained(Consumer<T> consumer) {
+ public boolean isConsumerPresent(Consumer<T> consumer) {
return computeIndex(consumer) > -1;
}