diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java index e6092eafa9..fe07fd1f8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallActionProcessorDelegate.java @@ -149,8 +149,13 @@ public class ActiveCallActionProcessorDelegate extends WebRtcActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { Log.i(tag, "handleCallConcluded():"); + + if (remotePeer == null) { + return currentState; + } + Log.i(tag, "delete remotePeer callId: " + remotePeer.getCallId() + " key: " + remotePeer.hashCode()); return currentState.builder() .changeCallInfoState() diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ConnectedCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ConnectedCallActionProcessor.java index 67e61e4436..52972c6cd5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ConnectedCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ConnectedCallActionProcessor.java @@ -6,7 +6,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.signal.ringrtc.CallException; -import org.thoughtcrime.securesms.events.CallParticipant; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.ringrtc.IceCandidateParcel; import org.thoughtcrime.securesms.ringrtc.RemotePeer; @@ -14,7 +13,6 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; import org.thoughtcrime.securesms.webrtc.locks.LockManager; import java.util.ArrayList; -import java.util.Objects; /** * Handles action for a connected/ongoing call. At this point it's mostly responding @@ -121,7 +119,7 @@ public class ConnectedCallActionProcessor extends DeviceAwareActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { return activeCallDelegate.handleCallConcluded(currentState, remotePeer); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DisconnectingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DisconnectingCallActionProcessor.java index 1157c9a821..d219402ff6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DisconnectingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DisconnectingCallActionProcessor.java @@ -1,10 +1,12 @@ package org.thoughtcrime.securesms.service.webrtc; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; +import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; /** @@ -39,13 +41,20 @@ public class DisconnectingCallActionProcessor extends WebRtcActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { Log.i(TAG, "handleCallConcluded():"); - Log.i(TAG, "delete remotePeer callId: " + remotePeer.getCallId() + " key: " + remotePeer.hashCode()); - return currentState.builder() - .actionProcessor(new IdleActionProcessor(webRtcInteractor)) - .changeCallInfoState() - .removeRemotePeer(remotePeer) - .build(); + + WebRtcServiceStateBuilder builder = currentState.builder() + .actionProcessor(new IdleActionProcessor(webRtcInteractor)); + + if (remotePeer != null) { + Log.i(TAG, "delete remotePeer callId: " + remotePeer.getCallId() + " key: " + remotePeer.hashCode()); + + builder.changeCallInfoState() + .removeRemotePeer(remotePeer) + .commit(); + } + + return builder.build(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java index 4fbe9665ad..f0a3fb9187 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java @@ -211,7 +211,7 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { return activeCallDelegate.handleCallConcluded(currentState, remotePeer); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java index a039fb3794..34f19eb06a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java @@ -211,7 +211,7 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { return activeCallDelegate.handleCallConcluded(currentState, remotePeer); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java index 81b29c9efe..137ceb48e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java @@ -119,6 +119,7 @@ import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getEr import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getGroupMembershipToken; import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getIceCandidates; import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getIceServers; +import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getNullableRemotePeerFromMap; import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getOfferMessageType; import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getRemotePeer; import static org.thoughtcrime.securesms.service.webrtc.WebRtcIntentParser.getRemotePeerFromMap; @@ -180,7 +181,7 @@ public abstract class WebRtcActionProcessor { case ACTION_CALL_CONNECTED: return handleCallConnected(currentState, getRemotePeerFromMap(intent, currentState)); case ACTION_RECEIVED_OFFER_WHILE_ACTIVE: return handleReceivedOfferWhileActive(currentState, getRemotePeerFromMap(intent, currentState)); case ACTION_SEND_BUSY: return handleSendBusy(currentState, CallMetadata.fromIntent(intent), getBroadcastFlag(intent)); - case ACTION_CALL_CONCLUDED: return handleCallConcluded(currentState, getRemotePeerFromMap(intent, currentState)); + case ACTION_CALL_CONCLUDED: return handleCallConcluded(currentState, getNullableRemotePeerFromMap(intent, currentState)); case ACTION_REMOTE_VIDEO_ENABLE: return handleRemoteVideoEnable(currentState, getEnable(intent)); case ACTION_RECEIVE_HANGUP: return handleReceivedHangup(currentState, CallMetadata.fromIntent(intent), HangupMetadata.fromIntent(intent)); case ACTION_LOCAL_HANGUP: return handleLocalHangup(currentState); @@ -425,7 +426,7 @@ public abstract class WebRtcActionProcessor { return currentState; } - protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @NonNull RemotePeer remotePeer) { + protected @NonNull WebRtcServiceState handleCallConcluded(@NonNull WebRtcServiceState currentState, @Nullable RemotePeer remotePeer) { Log.i(tag, "handleCallConcluded not processed"); return currentState; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcIntentParser.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcIntentParser.java index f70473a45e..7b695f3034 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcIntentParser.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcIntentParser.java @@ -75,16 +75,19 @@ public final class WebRtcIntentParser { } public static @NonNull RemotePeer getRemotePeerFromMap(@NonNull Intent intent, @NonNull WebRtcServiceState currentState) { - int remotePeerKey = getRemotePeerKey(intent); - RemotePeer remotePeer = currentState.getCallInfoState().getPeer(remotePeerKey); + RemotePeer remotePeer = getNullableRemotePeerFromMap(intent, currentState); if (remotePeer == null) { - throw new AssertionError("No RemotePeer in map for key: " + remotePeerKey + "!"); + throw new AssertionError("No RemotePeer in map for key: " + getRemotePeerKey(intent) + "!"); } return remotePeer; } + public static @Nullable RemotePeer getNullableRemotePeerFromMap(@NonNull Intent intent, @NonNull WebRtcServiceState currentState) { + return currentState.getCallInfoState().getPeer(getRemotePeerKey(intent)); + } + public static int getRemotePeerKey(@NonNull Intent intent) { if (!intent.hasExtra(EXTRA_REMOTE_PEER_KEY)) { throw new AssertionError("No RemotePeer key in intent!");