From e10a3513f4831fcb47c641215438c9316835ef87 Mon Sep 17 00:00:00 2001 From: Robert Horvath Date: Wed, 23 Mar 2022 15:21:10 +0100 Subject: [PATCH] Prevent ArrayList allocation for prefer keep clear areas This avoids creating an ArrayList if there are no keep clear areas, returning early with an empty or singleton list where possible. Bug: 222567277 Test: android.view.ViewShowHidePerfTest#testVisibleToInvisible Change-Id: Id718a37ea8aa4fcf4edbaade532cea826b15adf0 --- core/java/android/view/View.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index febd2e2efdacf..7d823b1c100d2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11939,13 +11939,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @NonNull List collectPreferKeepClearRects() { ListenerInfo info = mListenerInfo; - final List list = new ArrayList<>(); + boolean keepBoundsClear = + (info != null && info.mPreferKeepClear) || mPreferKeepClearForFocus; + boolean hasCustomKeepClearRects = info != null && info.mKeepClearRects != null; - if ((info != null && info.mPreferKeepClear) || mPreferKeepClearForFocus) { + if (!keepBoundsClear && !hasCustomKeepClearRects) { + return Collections.emptyList(); + } else if (keepBoundsClear && !hasCustomKeepClearRects) { + return Collections.singletonList(new Rect(0, 0, getWidth(), getHeight())); + } + + final List list = new ArrayList<>(); + if (keepBoundsClear) { list.add(new Rect(0, 0, getWidth(), getHeight())); } - if (info != null && info.mKeepClearRects != null) { + if (hasCustomKeepClearRects) { list.addAll(info.mKeepClearRects); }