diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkConnectedActionProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkConnectedActionProcessor.kt index 1a032640ef..f5ef567732 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkConnectedActionProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkConnectedActionProcessor.kt @@ -12,11 +12,9 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState * Process actions for when the call link has at least once been connected and joined. */ class CallLinkConnectedActionProcessor( + actionProcessorFactory: MultiPeerActionProcessorFactory, webRtcInteractor: WebRtcInteractor -) : GroupConnectedActionProcessor(webRtcInteractor) { - override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor { - return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor) - } +) : GroupConnectedActionProcessor(actionProcessorFactory, webRtcInteractor) { override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState { Log.i(tag, "handleGroupRequestUpdateMembers():") diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkJoiningActionProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkJoiningActionProcessor.kt index 3bafd1cc79..f57a1d9ba4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkJoiningActionProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkJoiningActionProcessor.kt @@ -12,11 +12,9 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState * Process actions to go from lobby to a joined call link. */ class CallLinkJoiningActionProcessor( + actionProcessorFactory: MultiPeerActionProcessorFactory, webRtcInteractor: WebRtcInteractor -) : GroupJoiningActionProcessor(webRtcInteractor) { - override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor { - return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor) - } +) : GroupJoiningActionProcessor(actionProcessorFactory, webRtcInteractor) { override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState { Log.i(tag, "handleGroupRequestUpdateMembers():") diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkNetworkUnavailableActionProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkNetworkUnavailableActionProcessor.kt deleted file mode 100644 index 51e6b79e13..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkNetworkUnavailableActionProcessor.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.thoughtcrime.securesms.service.webrtc - -/** - * Processor which is utilized when the network becomes unavailable during a call link call. In general, - * this is triggered whenever there is a call ended, and the ending was not the result of direct user - * action. - * - * This class will check the network status when handlePreJoinCall is invoked, and transition to - * [CallLinkPreJoinActionProcessor] as network becomes available again. - */ -class CallLinkNetworkUnavailableActionProcessor( - webRtcInteractor: WebRtcInteractor -) : GroupNetworkUnavailableActionProcessor(webRtcInteractor) { - override fun createGroupPreJoinActionProcessor(): GroupPreJoinActionProcessor { - return CallLinkPreJoinActionProcessor(webRtcInteractor) - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkPreJoinActionProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkPreJoinActionProcessor.kt index 57e0198377..a91c9d5946 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkPreJoinActionProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/CallLinkPreJoinActionProcessor.kt @@ -26,8 +26,9 @@ import java.io.IOException * Process actions while the user is in the pre-join lobby for the call link. */ class CallLinkPreJoinActionProcessor( + actionProcessorFactory: MultiPeerActionProcessorFactory, webRtcInteractor: WebRtcInteractor -) : GroupPreJoinActionProcessor(webRtcInteractor) { +) : GroupPreJoinActionProcessor(actionProcessorFactory, webRtcInteractor) { companion object { private val TAG = Log.tag(CallLinkPreJoinActionProcessor::class.java) @@ -98,8 +99,4 @@ class CallLinkPreJoinActionProcessor( return currentState } - - override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor { - return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor) - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java index dfef20036a..6656975fef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java @@ -38,8 +38,15 @@ import java.util.Set; * and call specific setup information that is the same for any group call state. */ public class GroupActionProcessor extends DeviceAwareActionProcessor { - public GroupActionProcessor(@NonNull WebRtcInteractor webRtcInteractor, @NonNull String tag) { + + protected MultiPeerActionProcessorFactory actionProcessorFactory; + + public GroupActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, + @NonNull WebRtcInteractor webRtcInteractor, + @NonNull String tag) + { super(webRtcInteractor, tag); + this.actionProcessorFactory = actionProcessorFactory; } protected @NonNull WebRtcServiceState handleReceivedOffer(@NonNull WebRtcServiceState currentState, @@ -295,7 +302,7 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor { VideoState videoState = currentState.getVideoState(); currentState = terminateGroupCall(currentState, false).builder() - .actionProcessor(getGroupNetworkUnavailableActionProcessor()) + .actionProcessor(actionProcessorFactory.createNetworkUnavailableActionProcessor(webRtcInteractor)) .changeVideoState() .eglBase(videoState.getLockableEglBase()) .camera(videoState.getCamera()) @@ -321,8 +328,4 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor { return terminateGroupCall(currentState); } - - public @NonNull GroupNetworkUnavailableActionProcessor getGroupNetworkUnavailableActionProcessor() { - return new GroupNetworkUnavailableActionProcessor(webRtcInteractor); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java index 97f34b8179..671aba1be0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java @@ -34,8 +34,8 @@ public class GroupConnectedActionProcessor extends GroupActionProcessor { private static final String TAG = Log.tag(GroupConnectedActionProcessor.class); - public GroupConnectedActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { - super(webRtcInteractor, TAG); + public GroupConnectedActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) { + super(actionProcessorFactory, webRtcInteractor, TAG); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupJoiningActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupJoiningActionProcessor.java index eba0d64845..c945d2dbae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupJoiningActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupJoiningActionProcessor.java @@ -25,8 +25,8 @@ public class GroupJoiningActionProcessor extends GroupActionProcessor { private static final String TAG = Log.tag(GroupJoiningActionProcessor.class); - public GroupJoiningActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { - super(webRtcInteractor, TAG); + public GroupJoiningActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) { + super(actionProcessorFactory, webRtcInteractor, TAG); } @Override @@ -94,7 +94,7 @@ public class GroupJoiningActionProcessor extends GroupActionProcessor { .commit() .changeLocalDeviceState() .commit() - .actionProcessor(new GroupConnectedActionProcessor(webRtcInteractor)); + .actionProcessor(actionProcessorFactory.createConnectedActionProcessor(webRtcInteractor)); } else if (device.getJoinState() == GroupCall.JoinState.JOINING) { builder.changeCallInfoState() diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupNetworkUnavailableActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupNetworkUnavailableActionProcessor.java index dedad0262c..346f9c8736 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupNetworkUnavailableActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupNetworkUnavailableActionProcessor.java @@ -26,8 +26,13 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso private static final String TAG = Log.tag(GroupNetworkUnavailableActionProcessor.class); - public GroupNetworkUnavailableActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { + private final MultiPeerActionProcessorFactory actionProcessorFactory; + + public GroupNetworkUnavailableActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, + @NonNull WebRtcInteractor webRtcInteractor) + { super(webRtcInteractor, TAG); + this.actionProcessorFactory = actionProcessorFactory; } @Override @@ -38,7 +43,7 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { - GroupPreJoinActionProcessor processor = createGroupPreJoinActionProcessor(); + GroupPreJoinActionProcessor processor = actionProcessorFactory.createPreJoinActionProcessor(webRtcInteractor); return processor.handlePreJoinCall(currentState.builder().actionProcessor(processor).build(), remotePeer); } @@ -72,7 +77,7 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso public @NonNull WebRtcServiceState handleNetworkChanged(@NonNull WebRtcServiceState currentState, boolean available) { if (available) { return currentState.builder() - .actionProcessor(createGroupPreJoinActionProcessor()) + .actionProcessor(actionProcessorFactory.createPreJoinActionProcessor(webRtcInteractor)) .changeCallInfoState() .callState(WebRtcViewModel.State.CALL_PRE_JOIN) .build(); @@ -80,8 +85,4 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso return currentState; } } - - protected @NonNull GroupPreJoinActionProcessor createGroupPreJoinActionProcessor() { - return new GroupPreJoinActionProcessor(webRtcInteractor); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java index 9043685d52..4367b5c58f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java @@ -33,8 +33,8 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor { private static final String TAG = Log.tag(GroupPreJoinActionProcessor.class); - public GroupPreJoinActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { - super(webRtcInteractor, TAG); + public GroupPreJoinActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) { + super(actionProcessorFactory, webRtcInteractor, TAG); } @Override @@ -170,7 +170,7 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor { } return currentState.builder() - .actionProcessor(new GroupJoiningActionProcessor(webRtcInteractor)) + .actionProcessor(actionProcessorFactory.createJoiningActionProcessor(webRtcInteractor)) .changeCallInfoState() .callState(WebRtcViewModel.State.CALL_OUTGOING) .groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING) @@ -207,7 +207,7 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor { public @NonNull WebRtcServiceState handleNetworkChanged(@NonNull WebRtcServiceState currentState, boolean available) { if (!available) { return currentState.builder() - .actionProcessor(getGroupNetworkUnavailableActionProcessor()) + .actionProcessor(actionProcessorFactory.createNetworkUnavailableActionProcessor(webRtcInteractor)) .changeCallInfoState() .callState(WebRtcViewModel.State.NETWORK_FAILURE) .build(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java index bf1ef5b117..80e872c1da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java @@ -7,7 +7,6 @@ import org.signal.ringrtc.CallException; import org.signal.ringrtc.CallManager; import org.signal.ringrtc.PeekInfo; import org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper; -import org.thoughtcrime.securesms.database.CallTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.groups.GroupId; @@ -69,9 +68,9 @@ public class IdleActionProcessor extends WebRtcActionProcessor { final WebRtcActionProcessor processor; if (remotePeer.getRecipient().isCallLink()) { - processor = new CallLinkPreJoinActionProcessor(webRtcInteractor); + processor = MultiPeerActionProcessorFactory.CallLinkActionProcessorFactory.INSTANCE.createPreJoinActionProcessor(webRtcInteractor); } else if (remotePeer.getRecipient().isPushV2Group()) { - processor = new GroupPreJoinActionProcessor(webRtcInteractor); + processor = MultiPeerActionProcessorFactory.GroupActionProcessorFactory.INSTANCE.createPreJoinActionProcessor(webRtcInteractor); } else { processor = new PreJoinActionProcessor(webRtcInteractor); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java index e942c42010..55e67cf079 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java @@ -223,7 +223,7 @@ public final class IncomingGroupCallActionProcessor extends DeviceAwareActionPro } return currentState.builder() - .actionProcessor(new GroupJoiningActionProcessor(webRtcInteractor)) + .actionProcessor(MultiPeerActionProcessorFactory.GroupActionProcessorFactory.INSTANCE.createJoiningActionProcessor(webRtcInteractor)) .changeCallInfoState() .callState(WebRtcViewModel.State.CALL_OUTGOING) .groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/MultiPeerActionProcessorFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/MultiPeerActionProcessorFactory.kt new file mode 100644 index 0000000000..03f0d0079d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/MultiPeerActionProcessorFactory.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.service.webrtc + +/** + * Factory for generating action processors for call links and groups. + */ +sealed interface MultiPeerActionProcessorFactory { + + fun createPreJoinActionProcessor(webRtcInteractor: WebRtcInteractor): GroupPreJoinActionProcessor + fun createJoiningActionProcessor(webRtcInteractor: WebRtcInteractor): GroupJoiningActionProcessor + fun createConnectedActionProcessor(webRtcInteractor: WebRtcInteractor): GroupConnectedActionProcessor + + fun createNetworkUnavailableActionProcessor(webRtcInteractor: WebRtcInteractor): GroupNetworkUnavailableActionProcessor { + return GroupNetworkUnavailableActionProcessor(this, webRtcInteractor) + } + + object GroupActionProcessorFactory : MultiPeerActionProcessorFactory { + override fun createPreJoinActionProcessor(webRtcInteractor: WebRtcInteractor): GroupPreJoinActionProcessor { + return GroupPreJoinActionProcessor(this, webRtcInteractor) + } + + override fun createJoiningActionProcessor(webRtcInteractor: WebRtcInteractor): GroupJoiningActionProcessor { + return GroupJoiningActionProcessor(this, webRtcInteractor) + } + + override fun createConnectedActionProcessor(webRtcInteractor: WebRtcInteractor): GroupConnectedActionProcessor { + return GroupConnectedActionProcessor(this, webRtcInteractor) + } + } + + object CallLinkActionProcessorFactory : MultiPeerActionProcessorFactory { + override fun createPreJoinActionProcessor(webRtcInteractor: WebRtcInteractor): GroupPreJoinActionProcessor { + return CallLinkPreJoinActionProcessor(this, webRtcInteractor) + } + + override fun createJoiningActionProcessor(webRtcInteractor: WebRtcInteractor): GroupJoiningActionProcessor { + return CallLinkJoiningActionProcessor(this, webRtcInteractor) + } + + override fun createConnectedActionProcessor(webRtcInteractor: WebRtcInteractor): GroupConnectedActionProcessor { + return CallLinkConnectedActionProcessor(this, webRtcInteractor) + } + } +}