Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0288bcb4 authored by Kweku Adams's avatar Kweku Adams
Browse files

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
parent 5cb56048
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ public class UsageStatsService extends SystemService implements
    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>
@@ -1189,11 +1190,13 @@ public class UsageStatsService extends SystemService implements
            service.reportEvent(event);
        }

        synchronized (mUsageEventListeners) {
            final int size = mUsageEventListeners.size();
            for (int i = 0; i < size; ++i) {
                mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
            }
        }
    }

    private String getUsageSourcePackage(Event event) {
        switch(mUsageSource) {
@@ -1682,7 +1685,7 @@ public class UsageStatsService extends SystemService implements
     * Called via the local interface.
     */
    private void registerListener(@NonNull UsageStatsManagerInternal.UsageEventListener listener) {
        synchronized (mLock) {
        synchronized (mUsageEventListeners) {
            mUsageEventListeners.add(listener);
        }
    }
@@ -1692,7 +1695,7 @@ public class UsageStatsService extends SystemService implements
     */
    private void unregisterListener(
            @NonNull UsageStatsManagerInternal.UsageEventListener listener) {
        synchronized (mLock) {
        synchronized (mUsageEventListeners) {
            mUsageEventListeners.remove(listener);
        }
    }