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

Commit 64aa50fb authored by Taeun Kim's avatar Taeun Kim
Browse files

Fix unexpected crashed in IncomingCallNotifier



mCalls in IncomingCallNotifier is not synchronized but 2 threads acces it at the same time.
Test: Manually test
Bug: 150799582

Change-Id: I68ffe7069d6c23f4799d41f2f9457b4d87f878b6
Signed-off-by: default avatarTaeun Kim <taeun99.kim@samsung.com>
parent 97acc377
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.server.telecom.R;
import com.android.server.telecom.TelecomBroadcastIntentProcessor;
import com.android.server.telecom.components.TelecomBroadcastReceiver;

import java.util.Objects;
import java.util.Optional;
import java.util.Set;

@@ -68,7 +69,7 @@ public class IncomingCallNotifier extends CallsManagerListenerBase {
    public static final int NOTIFICATION_INCOMING_CALL = 1;
    @VisibleForTesting
    public static final String NOTIFICATION_TAG = IncomingCallNotifier.class.getSimpleName();

    private final Object mLock = new Object();

    public final Call.ListenerBase mCallListener = new Call.ListenerBase() {
        @Override
@@ -104,19 +105,22 @@ public class IncomingCallNotifier extends CallsManagerListenerBase {

    @Override
    public void onCallAdded(Call call) {
        synchronized (mLock) {
            if (!mCalls.contains(call)) {
                mCalls.add(call);
            }
        }

        updateIncomingCall();
    }

    @Override
    public void onCallRemoved(Call call) {
        synchronized (mLock) {
            if (mCalls.contains(call)) {
                mCalls.remove(call);
            }

        }
        updateIncomingCall();
    }

@@ -130,11 +134,16 @@ public class IncomingCallNotifier extends CallsManagerListenerBase {
     * UI.
     */
    private void updateIncomingCall() {
        Optional<Call> incomingCallOp = mCalls.stream()
        Optional<Call> incomingCallOp;
        synchronized (mLock) {
            incomingCallOp = mCalls.stream()
                    .filter(Objects::nonNull)
                    .filter(call -> call.isSelfManaged() && call.isIncoming() &&
                            call.getState() == CallState.RINGING &&
                            call.getHandoverState() == HandoverState.HANDOVER_NONE)
                    .findFirst();
        }

        Call incomingCall = incomingCallOp.orElse(null);
        if (incomingCall != null && mCallsManagerProxy != null &&
                !mCallsManagerProxy.hasUnholdableCallsForOtherConnectionService(