diff options
| author | 2025-03-12 20:01:20 +0000 | |
|---|---|---|
| committer | 2025-03-14 00:48:40 +0000 | |
| commit | 9dea2c455b3d5b95778e490ec7d32e5835d4d693 (patch) | |
| tree | a39335fc4ddc1d7da57146edd372e81b3e1f5d97 | |
| parent | e0150b49b99d8c38c7a02cc6a7e72ac05a13d5d0 (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.java | 8 | ||||
| -rw-r--r-- | core/java/android/view/inspector/WindowInspector.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/translation/ListenerGroup.java | 4 |
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; } |