diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index f5db0b668c225..03769e97a27f0 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -18,6 +18,8 @@ package com.android.server.wm; import android.annotation.CallSuper; import android.content.res.Configuration; +import android.util.Pools; + import com.android.internal.util.ToBooleanFunction; import java.util.Comparator; @@ -68,6 +70,9 @@ class WindowContainer implements Comparable mConsumerWrapperPool = + new Pools.SynchronizedPool<>(3); + final protected WindowContainer getParent() { return mParent; } @@ -517,10 +522,9 @@ class WindowContainer implements Comparable callback, boolean traverseTopToBottom) { - forAllWindows(w -> { - callback.accept(w); - return false; - }, traverseTopToBottom); + ForAllWindowsConsumerWrapper wrapper = obtainConsumerWrapper(callback); + forAllWindows(wrapper, traverseTopToBottom); + wrapper.release(); } WindowState getWindow(Predicate callback) { @@ -613,4 +617,32 @@ class WindowContainer implements Comparable consumer) { + ForAllWindowsConsumerWrapper wrapper = mConsumerWrapperPool.acquire(); + if (wrapper == null) { + wrapper = new ForAllWindowsConsumerWrapper(); + } + wrapper.setConsumer(consumer); + return wrapper; + } + + private final class ForAllWindowsConsumerWrapper implements ToBooleanFunction { + + private Consumer mConsumer; + + void setConsumer(Consumer consumer) { + mConsumer = consumer; + } + + @Override + public boolean apply(WindowState w) { + mConsumer.accept(w); + return false; + } + + void release() { + mConsumer = null; + mConsumerWrapperPool.release(this); + } + } }