Merge "Add a lock for call add/remove operations to avoid ConcurrentModificationException."

This commit is contained in:
Treehugger Robot
2021-07-16 12:05:52 +00:00
committed by Gerrit Code Review

View File

@@ -139,6 +139,8 @@ public final class Phone {
*/ */
private final int mTargetSdkVersion; private final int mTargetSdkVersion;
private final Object mLock = new Object();
Phone(InCallAdapter adapter, String callingPackage, int targetSdkVersion) { Phone(InCallAdapter adapter, String callingPackage, int targetSdkVersion) {
mInCallAdapter = adapter; mInCallAdapter = adapter;
mCallingPackage = callingPackage; mCallingPackage = callingPackage;
@@ -156,8 +158,12 @@ public final class Phone {
if (call == null) { if (call == null) {
call = new Call(this, parcelableCall.getId(), mInCallAdapter, call = new Call(this, parcelableCall.getId(), mInCallAdapter,
parcelableCall.getState(), mCallingPackage, mTargetSdkVersion); parcelableCall.getState(), mCallingPackage, mTargetSdkVersion);
mCallByTelecomCallId.put(parcelableCall.getId(), call);
mCalls.add(call); synchronized (mLock) {
mCallByTelecomCallId.put(parcelableCall.getId(), call);
mCalls.add(call);
}
checkCallTree(parcelableCall); checkCallTree(parcelableCall);
call.internalUpdate(parcelableCall, mCallByTelecomCallId); call.internalUpdate(parcelableCall, mCallByTelecomCallId);
fireCallAdded(call); fireCallAdded(call);
@@ -169,8 +175,10 @@ public final class Phone {
} }
final void internalRemoveCall(Call call) { final void internalRemoveCall(Call call) {
mCallByTelecomCallId.remove(call.internalGetCallId()); synchronized (mLock) {
mCalls.remove(call); mCallByTelecomCallId.remove(call.internalGetCallId());
mCalls.remove(call);
}
InCallService.VideoCall videoCall = call.getVideoCall(); InCallService.VideoCall videoCall = call.getVideoCall();
if (videoCall != null) { if (videoCall != null) {