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

Commit b1c5ed4d authored by Thomas Stuart's avatar Thomas Stuart
Browse files

avoid concurrentModExeption by iterating over a list instead of set

A crash report came in showing that iterating over a set in the
CallEndpointController methods can cause a
ConcurrentModificationException.

In order to avoid this exception, the set can be converted to an
ArrayList. ArrayLists have safe iteration and can be iterated over
without worrying about ConcurrentModificationExceptions.

Flag: EXEMPT type change for iteration
Fixes: 359377211
Test: presubmits
Change-Id: Ie5314072403c23079157bf977b7892a646eef993
parent 7454e970
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.flags.FeatureFlags;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
@@ -1086,7 +1087,7 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
    }

    private void updateAudioStateForTrackedCalls(CallAudioState newCallAudioState) {
        Set<Call> calls = mCallsManager.getTrackedCalls();
        List<Call> calls = new ArrayList<>(mCallsManager.getTrackedCalls());
        for (Call call : calls) {
            if (call != null && call.getConnectionService() != null) {
                call.getConnectionService().onCallAudioStateChanged(call, newCallAudioState);
+5 −3
Original line number Diff line number Diff line
@@ -29,7 +29,9 @@ import android.telecom.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.telecom.flags.FeatureFlags;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.HashSet;
import java.util.Set;
@@ -197,7 +199,7 @@ public class CallEndpointController extends CallsManagerListenerBase {
        }
        mCallsManager.updateCallEndpoint(mActiveCallEndpoint);

        Set<Call> calls = mCallsManager.getTrackedCalls();
        List<Call> calls = new ArrayList<>(mCallsManager.getTrackedCalls());
        for (Call call : calls) {
            if (mFeatureFlags.cacheCallAudioCallbacks()) {
                onCallEndpointChangedOrCache(call);
@@ -227,7 +229,7 @@ public class CallEndpointController extends CallsManagerListenerBase {
    private void notifyAvailableCallEndpointsChange() {
        mCallsManager.updateAvailableCallEndpoints(mAvailableCallEndpoints);

        Set<Call> calls = mCallsManager.getTrackedCalls();
        List<Call> calls = new ArrayList<>(mCallsManager.getTrackedCalls());
        for (Call call : calls) {
            if (mFeatureFlags.cacheCallAudioCallbacks()) {
                onAvailableEndpointsChangedOrCache(call);
@@ -258,7 +260,7 @@ public class CallEndpointController extends CallsManagerListenerBase {
    private void notifyMuteStateChange(boolean isMuted) {
        mCallsManager.updateMuteState(isMuted);

        Set<Call> calls = mCallsManager.getTrackedCalls();
        List<Call> calls = new ArrayList<>(mCallsManager.getTrackedCalls());
        for (Call call : calls) {
            if (mFeatureFlags.cacheCallAudioCallbacks()) {
                onMuteStateChangedOrCache(call, isMuted);