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
This commit is contained in:
Hall Liu
2019-11-08 18:26:47 -08:00
parent 9eba10e17f
commit fc2be9c0d2

View File

@@ -152,13 +152,20 @@ public final class Phone {
return;
}
Call 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);
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);
}
}