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.
*/
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():")

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.
*/
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():")

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.
*/
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)
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -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();

View file

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

View file

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

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