Hook in Call Links integration via factory.

This commit is contained in:
Alex Hart
2023-06-02 16:29:37 -03:00
committed by Cody Henthorne
parent 59435e49c8
commit bf7aaddbf9
12 changed files with 83 additions and 61 deletions

View File

@@ -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. * Process actions for when the call link has at least once been connected and joined.
*/ */
class CallLinkConnectedActionProcessor( class CallLinkConnectedActionProcessor(
actionProcessorFactory: MultiPeerActionProcessorFactory,
webRtcInteractor: WebRtcInteractor webRtcInteractor: WebRtcInteractor
) : GroupConnectedActionProcessor(webRtcInteractor) { ) : GroupConnectedActionProcessor(actionProcessorFactory, webRtcInteractor) {
override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor {
return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor)
}
override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState { override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState {
Log.i(tag, "handleGroupRequestUpdateMembers():") Log.i(tag, "handleGroupRequestUpdateMembers():")

View File

@@ -12,11 +12,9 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState
* Process actions to go from lobby to a joined call link. * Process actions to go from lobby to a joined call link.
*/ */
class CallLinkJoiningActionProcessor( class CallLinkJoiningActionProcessor(
actionProcessorFactory: MultiPeerActionProcessorFactory,
webRtcInteractor: WebRtcInteractor webRtcInteractor: WebRtcInteractor
) : GroupJoiningActionProcessor(webRtcInteractor) { ) : GroupJoiningActionProcessor(actionProcessorFactory, webRtcInteractor) {
override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor {
return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor)
}
override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState { override fun handleGroupRequestUpdateMembers(currentState: WebRtcServiceState): WebRtcServiceState {
Log.i(tag, "handleGroupRequestUpdateMembers():") Log.i(tag, "handleGroupRequestUpdateMembers():")

View File

@@ -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)
}
}

View File

@@ -26,8 +26,9 @@ import java.io.IOException
* Process actions while the user is in the pre-join lobby for the call link. * Process actions while the user is in the pre-join lobby for the call link.
*/ */
class CallLinkPreJoinActionProcessor( class CallLinkPreJoinActionProcessor(
actionProcessorFactory: MultiPeerActionProcessorFactory,
webRtcInteractor: WebRtcInteractor webRtcInteractor: WebRtcInteractor
) : GroupPreJoinActionProcessor(webRtcInteractor) { ) : GroupPreJoinActionProcessor(actionProcessorFactory, webRtcInteractor) {
companion object { companion object {
private val TAG = Log.tag(CallLinkPreJoinActionProcessor::class.java) private val TAG = Log.tag(CallLinkPreJoinActionProcessor::class.java)
@@ -98,8 +99,4 @@ class CallLinkPreJoinActionProcessor(
return currentState return currentState
} }
override fun getGroupNetworkUnavailableActionProcessor(): GroupNetworkUnavailableActionProcessor {
return CallLinkNetworkUnavailableActionProcessor(webRtcInteractor)
}
} }

View File

@@ -38,8 +38,15 @@ import java.util.Set;
* and call specific setup information that is the same for any group call state. * and call specific setup information that is the same for any group call state.
*/ */
public class GroupActionProcessor extends DeviceAwareActionProcessor { 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); super(webRtcInteractor, tag);
this.actionProcessorFactory = actionProcessorFactory;
} }
protected @NonNull WebRtcServiceState handleReceivedOffer(@NonNull WebRtcServiceState currentState, protected @NonNull WebRtcServiceState handleReceivedOffer(@NonNull WebRtcServiceState currentState,
@@ -295,7 +302,7 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor {
VideoState videoState = currentState.getVideoState(); VideoState videoState = currentState.getVideoState();
currentState = terminateGroupCall(currentState, false).builder() currentState = terminateGroupCall(currentState, false).builder()
.actionProcessor(getGroupNetworkUnavailableActionProcessor()) .actionProcessor(actionProcessorFactory.createNetworkUnavailableActionProcessor(webRtcInteractor))
.changeVideoState() .changeVideoState()
.eglBase(videoState.getLockableEglBase()) .eglBase(videoState.getLockableEglBase())
.camera(videoState.getCamera()) .camera(videoState.getCamera())
@@ -321,8 +328,4 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor {
return terminateGroupCall(currentState); return terminateGroupCall(currentState);
} }
public @NonNull GroupNetworkUnavailableActionProcessor getGroupNetworkUnavailableActionProcessor() {
return new GroupNetworkUnavailableActionProcessor(webRtcInteractor);
}
} }

View File

@@ -34,8 +34,8 @@ public class GroupConnectedActionProcessor extends GroupActionProcessor {
private static final String TAG = Log.tag(GroupConnectedActionProcessor.class); private static final String TAG = Log.tag(GroupConnectedActionProcessor.class);
public GroupConnectedActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { public GroupConnectedActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) {
super(webRtcInteractor, TAG); super(actionProcessorFactory, webRtcInteractor, TAG);
} }
@Override @Override

View File

@@ -25,8 +25,8 @@ public class GroupJoiningActionProcessor extends GroupActionProcessor {
private static final String TAG = Log.tag(GroupJoiningActionProcessor.class); private static final String TAG = Log.tag(GroupJoiningActionProcessor.class);
public GroupJoiningActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { public GroupJoiningActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) {
super(webRtcInteractor, TAG); super(actionProcessorFactory, webRtcInteractor, TAG);
} }
@Override @Override
@@ -94,7 +94,7 @@ public class GroupJoiningActionProcessor extends GroupActionProcessor {
.commit() .commit()
.changeLocalDeviceState() .changeLocalDeviceState()
.commit() .commit()
.actionProcessor(new GroupConnectedActionProcessor(webRtcInteractor)); .actionProcessor(actionProcessorFactory.createConnectedActionProcessor(webRtcInteractor));
} else if (device.getJoinState() == GroupCall.JoinState.JOINING) { } else if (device.getJoinState() == GroupCall.JoinState.JOINING) {
builder.changeCallInfoState() builder.changeCallInfoState()

View File

@@ -26,8 +26,13 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso
private static final String TAG = Log.tag(GroupNetworkUnavailableActionProcessor.class); 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); super(webRtcInteractor, TAG);
this.actionProcessorFactory = actionProcessorFactory;
} }
@Override @Override
@@ -38,7 +43,7 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
GroupPreJoinActionProcessor processor = createGroupPreJoinActionProcessor(); GroupPreJoinActionProcessor processor = actionProcessorFactory.createPreJoinActionProcessor(webRtcInteractor);
return processor.handlePreJoinCall(currentState.builder().actionProcessor(processor).build(), remotePeer); 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) { public @NonNull WebRtcServiceState handleNetworkChanged(@NonNull WebRtcServiceState currentState, boolean available) {
if (available) { if (available) {
return currentState.builder() return currentState.builder()
.actionProcessor(createGroupPreJoinActionProcessor()) .actionProcessor(actionProcessorFactory.createPreJoinActionProcessor(webRtcInteractor))
.changeCallInfoState() .changeCallInfoState()
.callState(WebRtcViewModel.State.CALL_PRE_JOIN) .callState(WebRtcViewModel.State.CALL_PRE_JOIN)
.build(); .build();
@@ -80,8 +85,4 @@ public class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcesso
return currentState; return currentState;
} }
} }
protected @NonNull GroupPreJoinActionProcessor createGroupPreJoinActionProcessor() {
return new GroupPreJoinActionProcessor(webRtcInteractor);
}
} }

View File

@@ -33,8 +33,8 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor {
private static final String TAG = Log.tag(GroupPreJoinActionProcessor.class); private static final String TAG = Log.tag(GroupPreJoinActionProcessor.class);
public GroupPreJoinActionProcessor(@NonNull WebRtcInteractor webRtcInteractor) { public GroupPreJoinActionProcessor(@NonNull MultiPeerActionProcessorFactory actionProcessorFactory, @NonNull WebRtcInteractor webRtcInteractor) {
super(webRtcInteractor, TAG); super(actionProcessorFactory, webRtcInteractor, TAG);
} }
@Override @Override
@@ -170,7 +170,7 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor {
} }
return currentState.builder() return currentState.builder()
.actionProcessor(new GroupJoiningActionProcessor(webRtcInteractor)) .actionProcessor(actionProcessorFactory.createJoiningActionProcessor(webRtcInteractor))
.changeCallInfoState() .changeCallInfoState()
.callState(WebRtcViewModel.State.CALL_OUTGOING) .callState(WebRtcViewModel.State.CALL_OUTGOING)
.groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING) .groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING)
@@ -207,7 +207,7 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor {
public @NonNull WebRtcServiceState handleNetworkChanged(@NonNull WebRtcServiceState currentState, boolean available) { public @NonNull WebRtcServiceState handleNetworkChanged(@NonNull WebRtcServiceState currentState, boolean available) {
if (!available) { if (!available) {
return currentState.builder() return currentState.builder()
.actionProcessor(getGroupNetworkUnavailableActionProcessor()) .actionProcessor(actionProcessorFactory.createNetworkUnavailableActionProcessor(webRtcInteractor))
.changeCallInfoState() .changeCallInfoState()
.callState(WebRtcViewModel.State.NETWORK_FAILURE) .callState(WebRtcViewModel.State.NETWORK_FAILURE)
.build(); .build();

View File

@@ -7,7 +7,6 @@ import org.signal.ringrtc.CallException;
import org.signal.ringrtc.CallManager; import org.signal.ringrtc.CallManager;
import org.signal.ringrtc.PeekInfo; import org.signal.ringrtc.PeekInfo;
import org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper; import org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper;
import org.thoughtcrime.securesms.database.CallTable;
import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.events.WebRtcViewModel;
import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.GroupId;
@@ -69,9 +68,9 @@ public class IdleActionProcessor extends WebRtcActionProcessor {
final WebRtcActionProcessor processor; final WebRtcActionProcessor processor;
if (remotePeer.getRecipient().isCallLink()) { if (remotePeer.getRecipient().isCallLink()) {
processor = new CallLinkPreJoinActionProcessor(webRtcInteractor); processor = MultiPeerActionProcessorFactory.CallLinkActionProcessorFactory.INSTANCE.createPreJoinActionProcessor(webRtcInteractor);
} else if (remotePeer.getRecipient().isPushV2Group()) { } else if (remotePeer.getRecipient().isPushV2Group()) {
processor = new GroupPreJoinActionProcessor(webRtcInteractor); processor = MultiPeerActionProcessorFactory.GroupActionProcessorFactory.INSTANCE.createPreJoinActionProcessor(webRtcInteractor);
} else { } else {
processor = new PreJoinActionProcessor(webRtcInteractor); processor = new PreJoinActionProcessor(webRtcInteractor);
} }

View File

@@ -223,7 +223,7 @@ public final class IncomingGroupCallActionProcessor extends DeviceAwareActionPro
} }
return currentState.builder() return currentState.builder()
.actionProcessor(new GroupJoiningActionProcessor(webRtcInteractor)) .actionProcessor(MultiPeerActionProcessorFactory.GroupActionProcessorFactory.INSTANCE.createJoiningActionProcessor(webRtcInteractor))
.changeCallInfoState() .changeCallInfoState()
.callState(WebRtcViewModel.State.CALL_OUTGOING) .callState(WebRtcViewModel.State.CALL_OUTGOING)
.groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING) .groupCallState(WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINING)

View File

@@ -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)
}
}
}