diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index fdf69795c968d..3b4163fb22b08 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -85,6 +85,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.os.IResultReceiver; import com.android.internal.os.SomeArgs; import com.android.internal.policy.PhoneFallbackEventHandler; @@ -154,7 +155,12 @@ public final class ViewRootImpl implements ViewParent, static final ArrayList sConfigCallbacks = new ArrayList(); - final ArrayList mWindowCallbacks = new ArrayList(); + /** + * This list must only be modified by the main thread, so a lock is only needed when changing + * the list or when accessing the list from a non-main thread. + */ + @GuardedBy("mWindowCallbacks") + final ArrayList mWindowCallbacks = new ArrayList<>(); final Context mContext; final IWindowSession mWindowSession; final Display mDisplay; @@ -2437,10 +2443,8 @@ public final class ViewRootImpl implements ViewParent, @Override public void onHardwarePostDraw(DisplayListCanvas canvas) { drawAccessibilityFocusedDrawableIfNeeded(canvas); - synchronized (mWindowCallbacks) { - for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onPostDraw(canvas); - } + for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { + mWindowCallbacks.get(i).onPostDraw(canvas); } } @@ -7092,11 +7096,9 @@ public final class ViewRootImpl implements ViewParent, Rect stableInsets, int resizeMode) { if (!mDragResizing) { mDragResizing = true; - synchronized (mWindowCallbacks) { - for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onWindowDragResizeStart(initialBounds, fullscreen, - systemInsets, stableInsets, resizeMode); - } + for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { + mWindowCallbacks.get(i).onWindowDragResizeStart(initialBounds, fullscreen, + systemInsets, stableInsets, resizeMode); } mFullRedrawNeeded = true; } @@ -7108,10 +7110,8 @@ public final class ViewRootImpl implements ViewParent, private void endDragResizing() { if (mDragResizing) { mDragResizing = false; - synchronized (mWindowCallbacks) { - for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onWindowDragResizeEnd(); - } + for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { + mWindowCallbacks.get(i).onWindowDragResizeEnd(); } mFullRedrawNeeded = true; } @@ -7119,13 +7119,11 @@ public final class ViewRootImpl implements ViewParent, private boolean updateContentDrawBounds() { boolean updated = false; - synchronized (mWindowCallbacks) { - for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - updated |= mWindowCallbacks.get(i).onContentDrawn( - mWindowAttributes.surfaceInsets.left, - mWindowAttributes.surfaceInsets.top, - mWidth, mHeight); - } + for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { + updated |= mWindowCallbacks.get(i).onContentDrawn( + mWindowAttributes.surfaceInsets.left, + mWindowAttributes.surfaceInsets.top, + mWidth, mHeight); } return updated | (mDragResizing && mReportNextDraw); } @@ -7134,10 +7132,8 @@ public final class ViewRootImpl implements ViewParent, if (mReportNextDraw) { mWindowDrawCountDown = new CountDownLatch(mWindowCallbacks.size()); } - synchronized (mWindowCallbacks) { - for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onRequestDraw(mReportNextDraw); - } + for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { + mWindowCallbacks.get(i).onRequestDraw(mReportNextDraw); } }