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

Commit fc2be9c0 authored by Hall Liu's avatar Hall Liu
Browse files

Fix double-add of calls

In the api compatibility logic for the new call states, we might end up
adding a call by accident in internalUpdateCall if a call was updated in
the NEW state, and it'd then get added again when internalAddCall gets
called.

To fix this, restrict the call states that would result in an add from
internalUpdateCall, and also don't add the call again in internalAddCall
if it's already present.

Fixes: 143049799
Test: CTS
Change-Id: I2a6b646a5200fedf9e02029a7120595210a24c76
parent 9eba10e1
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -152,13 +152,20 @@ public final class Phone {
            return;
        }

        Call call = new Call(this, parcelableCall.getId(), mInCallAdapter,
        Call call = mCallByTelecomCallId.get(parcelableCall.getId());
        if (call == null) {
            call = new Call(this, parcelableCall.getId(), mInCallAdapter,
                    parcelableCall.getState(), mCallingPackage, mTargetSdkVersion);
            mCallByTelecomCallId.put(parcelableCall.getId(), call);
            mCalls.add(call);
            checkCallTree(parcelableCall);
            call.internalUpdate(parcelableCall, mCallByTelecomCallId);
            fireCallAdded(call);
        } else {
            Log.w(this, "Call %s added, but it was already present", call.internalGetCallId());
            checkCallTree(parcelableCall);
            call.internalUpdate(parcelableCall, mCallByTelecomCallId);
        }
    }

    final void internalRemoveCall(Call call) {
@@ -190,7 +197,11 @@ public final class Phone {
        } else {
            // This call may have come out of audio processing. Try adding it if our target sdk
            // version is low enough.
            if (mTargetSdkVersion < SDK_VERSION_R) {
            // The only two allowable states coming out of audio processing are ACTIVE and
            // SIMULATED_RINGING.
            if (mTargetSdkVersion < SDK_VERSION_R && (parcelableCall.getState() == Call.STATE_ACTIVE
                    || parcelableCall.getState() == Call.STATE_SIMULATED_RINGING)) {
                Log.i(this, "adding call during update for sdk compatibility");
                internalAddCall(parcelableCall);
            }
        }