Handle object in thread-safe manner.

Make sure mUsageEventListeners is always accessed while holding an
appropriate lock.

Bug: 247635314
Test: Android builds
Change-Id: Ia649f1724836f09020ae438bbdcfbe45c71b6784
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index f595c3d..ea40100 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -221,6 +221,7 @@
     final SparseArray<ActivityData> mVisibleActivities = new SparseArray();
     @GuardedBy("mLock")
     private final SparseArray<LaunchTimeAlarmQueue> mLaunchTimeAlarmQueues = new SparseArray<>();
+    @GuardedBy("mUsageEventListeners") // Don't hold the main lock when calling out
     private final ArraySet<UsageStatsManagerInternal.UsageEventListener> mUsageEventListeners =
             new ArraySet<>();
     private final CopyOnWriteArraySet<UsageStatsManagerInternal.EstimatedLaunchTimeChangedListener>
@@ -1168,9 +1169,11 @@
             service.reportEvent(event);
         }
 
-        final int size = mUsageEventListeners.size();
-        for (int i = 0; i < size; ++i) {
-            mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
+        synchronized (mUsageEventListeners) {
+            final int size = mUsageEventListeners.size();
+            for (int i = 0; i < size; ++i) {
+                mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
+            }
         }
     }
 
@@ -1661,7 +1664,7 @@
      * Called via the local interface.
      */
     private void registerListener(@NonNull UsageStatsManagerInternal.UsageEventListener listener) {
-        synchronized (mLock) {
+        synchronized (mUsageEventListeners) {
             mUsageEventListeners.add(listener);
         }
     }
@@ -1671,7 +1674,7 @@
      */
     private void unregisterListener(
             @NonNull UsageStatsManagerInternal.UsageEventListener listener) {
-        synchronized (mLock) {
+        synchronized (mUsageEventListeners) {
             mUsageEventListeners.remove(listener);
         }
     }