diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java index 5f56af7fd4e0d..1208b6ef396f7 100644 --- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java +++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java @@ -99,13 +99,15 @@ public class ActivityServiceConnectionsHolder { } public void forEachConnection(Consumer consumer) { + final ArraySet connections; synchronized (mActivity) { if (mConnections == null || mConnections.isEmpty()) { return; } - for (int i = mConnections.size() - 1; i >= 0; i--) { - consumer.accept(mConnections.valueAt(i)); - } + connections = new ArraySet<>(mConnections); + } + for (int i = connections.size() - 1; i >= 0; i--) { + consumer.accept(connections.valueAt(i)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 8f2b470908c44..0033e3e368c6c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2399,7 +2399,10 @@ public class ActivityRecordTests extends WindowTestsBase { holder.addConnection(connection); assertTrue(holder.isActivityVisible()); final int[] count = new int[1]; - final Consumer c = conn -> count[0]++; + final Consumer c = conn -> { + count[0]++; + assertFalse(Thread.holdsLock(activity)); + }; holder.forEachConnection(c); assertEquals(1, count[0]);