Merge "Fix potential exceptions in CallDiagnosticService and missing locks." into sc-dev

This commit is contained in:
Tyler Gunn
2021-05-24 20:26:49 +00:00
committed by Android (Google) Code Review

View File

@@ -294,6 +294,10 @@ public abstract class CallDiagnosticService extends Service {
CallDiagnostics callDiagnostics; CallDiagnostics callDiagnostics;
synchronized (mLock) { synchronized (mLock) {
callDiagnostics = mDiagnosticCallByTelecomCallId.get(telecomCallId); callDiagnostics = mDiagnosticCallByTelecomCallId.get(telecomCallId);
if (callDiagnostics == null) {
// Possible to get a call update after a call is removed.
return;
}
mCallByTelecomCallId.put(telecomCallId, newCallDetails); mCallByTelecomCallId.put(telecomCallId, newCallDetails);
} }
getExecutor().execute(() -> callDiagnostics.handleCallUpdated(newCallDetails)); getExecutor().execute(() -> callDiagnostics.handleCallUpdated(newCallDetails));
@@ -306,12 +310,12 @@ public abstract class CallDiagnosticService extends Service {
private void handleCallRemoved(@NonNull String telecomCallId) { private void handleCallRemoved(@NonNull String telecomCallId) {
Log.i(this, "handleCallRemoved: callId=%s - removed", telecomCallId); Log.i(this, "handleCallRemoved: callId=%s - removed", telecomCallId);
CallDiagnostics callDiagnostics;
synchronized (mLock) {
if (mCallByTelecomCallId.containsKey(telecomCallId)) { if (mCallByTelecomCallId.containsKey(telecomCallId)) {
mCallByTelecomCallId.remove(telecomCallId); mCallByTelecomCallId.remove(telecomCallId);
} }
CallDiagnostics callDiagnostics;
synchronized (mLock) {
if (mDiagnosticCallByTelecomCallId.containsKey(telecomCallId)) { if (mDiagnosticCallByTelecomCallId.containsKey(telecomCallId)) {
callDiagnostics = mDiagnosticCallByTelecomCallId.remove(telecomCallId); callDiagnostics = mDiagnosticCallByTelecomCallId.remove(telecomCallId);
} else { } else {
@@ -353,7 +357,10 @@ public abstract class CallDiagnosticService extends Service {
private void handleCallDisconnected(@NonNull String callId, private void handleCallDisconnected(@NonNull String callId,
@NonNull DisconnectCause disconnectCause) { @NonNull DisconnectCause disconnectCause) {
Log.i(this, "handleCallDisconnected: call=%s; cause=%s", callId, disconnectCause); Log.i(this, "handleCallDisconnected: call=%s; cause=%s", callId, disconnectCause);
CallDiagnostics callDiagnostics = mDiagnosticCallByTelecomCallId.get(callId); CallDiagnostics callDiagnostics;
synchronized (mLock) {
callDiagnostics = mDiagnosticCallByTelecomCallId.get(callId);
}
CharSequence message; CharSequence message;
if (disconnectCause.getImsReasonInfo() != null) { if (disconnectCause.getImsReasonInfo() != null) {
message = callDiagnostics.onCallDisconnected(disconnectCause.getImsReasonInfo()); message = callDiagnostics.onCallDisconnected(disconnectCause.getImsReasonInfo());
@@ -391,7 +398,9 @@ public abstract class CallDiagnosticService extends Service {
@NonNull CallQuality callQuality) { @NonNull CallQuality callQuality) {
Log.i(this, "handleCallQualityChanged; call=%s, cq=%s", callId, callQuality); Log.i(this, "handleCallQualityChanged; call=%s, cq=%s", callId, callQuality);
CallDiagnostics callDiagnostics; CallDiagnostics callDiagnostics;
synchronized(mLock) {
callDiagnostics = mDiagnosticCallByTelecomCallId.get(callId); callDiagnostics = mDiagnosticCallByTelecomCallId.get(callId);
}
if (callDiagnostics != null) { if (callDiagnostics != null) {
callDiagnostics.onCallQualityReceived(callQuality); callDiagnostics.onCallQualityReceived(callQuality);
} }