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

Commit 5c5f6ad2 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Fix ConcurrentModificationException

The code that keeps track of registered BroadcastReceiver in tests was
being accesses by multiple threads. Guard against that.

Bug: 160433244
Test: SystemUITests
Change-Id: Ia89e638919d65955ae2182639fd74bcbab771fcc
parent 11d0c95f
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -26,11 +26,14 @@ import android.util.ArraySet;
import android.util.Log;
import android.view.Display;

import com.android.internal.annotations.GuardedBy;

import java.util.Set;

public class SysuiTestableContext extends TestableContext {

    private Set<BroadcastReceiver> mRegisteredReceivers = new ArraySet<>();
    @GuardedBy("mRegisteredReceivers")
    private final Set<BroadcastReceiver> mRegisteredReceivers = new ArraySet<>();

    public SysuiTestableContext(Context base) {
        super(base);
@@ -54,7 +57,11 @@ public class SysuiTestableContext extends TestableContext {
    }

    public void cleanUpReceivers(String testName) {
        Set<BroadcastReceiver> copy = new ArraySet<>(mRegisteredReceivers);
        Set<BroadcastReceiver> copy;
        synchronized (mRegisteredReceivers) {
            copy = new ArraySet<>(mRegisteredReceivers);
            mRegisteredReceivers.clear();
        }
        for (BroadcastReceiver r : copy) {
            try {
                unregisterReceiver(r);
@@ -68,8 +75,10 @@ public class SysuiTestableContext extends TestableContext {
    @Override
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        if (receiver != null) {
            synchronized (mRegisteredReceivers) {
                mRegisteredReceivers.add(receiver);
            }
        }
        return super.registerReceiver(receiver, filter);
    }

@@ -77,8 +86,10 @@ public class SysuiTestableContext extends TestableContext {
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
            String broadcastPermission, Handler scheduler) {
        if (receiver != null) {
            synchronized (mRegisteredReceivers) {
                mRegisteredReceivers.add(receiver);
            }
        }
        return super.registerReceiver(receiver, filter, broadcastPermission, scheduler);
    }

@@ -86,16 +97,20 @@ public class SysuiTestableContext extends TestableContext {
    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
            IntentFilter filter, String broadcastPermission, Handler scheduler) {
        if (receiver != null) {
            synchronized (mRegisteredReceivers) {
                mRegisteredReceivers.add(receiver);
            }
        }
        return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission, scheduler);
    }

    @Override
    public void unregisterReceiver(BroadcastReceiver receiver) {
        if (receiver != null) {
            synchronized (mRegisteredReceivers) {
                mRegisteredReceivers.remove(receiver);
            }
        }
        super.unregisterReceiver(receiver);
    }
}