From 73f32868a2dd84d717a52e975a80a63f8649ee95 Mon Sep 17 00:00:00 2001 From: Rashad Sookram Date: Tue, 5 Apr 2022 13:29:49 -0400 Subject: [PATCH] Display audio levels in 1:1 calls. --- .../securesms/events/CallParticipant.kt | 3 +-- .../webrtc/ConnectedCallActionProcessor.java | 24 +++++++++++++++++++ .../webrtc/GroupConnectedActionProcessor.java | 5 +--- .../webrtc/IncomingCallActionProcessor.java | 2 +- .../webrtc/OutgoingCallActionProcessor.java | 2 +- .../service/webrtc/SignalCallManager.java | 2 +- .../service/webrtc/WebRtcActionProcessor.java | 4 ++++ .../webrtc/state/WebRtcEphemeralState.kt | 2 +- 8 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt index d48d86405f..685aaa90ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt @@ -88,9 +88,8 @@ data class CallParticipant constructor( * display in the UI. */ @JvmStatic - fun fromRawAudioLevel(raw: Int?): AudioLevel? { + fun fromRawAudioLevel(raw: Int): AudioLevel { return when { - raw == null -> null raw < 500 -> LOWEST raw < 2000 -> LOW raw < 8000 -> MEDIUM 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 64959a60bf..446c44c509 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 @@ -8,11 +8,17 @@ import androidx.annotation.Nullable; import org.signal.core.util.logging.Log; import org.signal.ringrtc.CallException; import org.signal.ringrtc.CallManager; +import org.thoughtcrime.securesms.events.CallParticipant; +import org.thoughtcrime.securesms.events.CallParticipantId; import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.ringrtc.RemotePeer; +import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; import org.thoughtcrime.securesms.webrtc.locks.LockManager; +import java.util.Collections; +import java.util.Optional; + /** * Handles action for a connected/ongoing call. At this point it's mostly responding * to user actions (local and remote) on video/mic and adjusting accordingly. @@ -75,6 +81,24 @@ public class ConnectedCallActionProcessor extends DeviceAwareActionProcessor { return currentState; } + @Override + protected @NonNull WebRtcEphemeralState handleAudioLevelsChanged(@NonNull WebRtcServiceState currentState, + @NonNull WebRtcEphemeralState ephemeralState, + int localLevel, + int remoteLevel) { + Optional callParticipantId = currentState.getCallInfoState() + .getRemoteCallParticipantsMap() + .keySet() + .stream() + .findFirst(); + + return ephemeralState.copy( + CallParticipant.AudioLevel.fromRawAudioLevel(localLevel), + callParticipantId.map(participantId -> Collections.singletonMap(participantId, CallParticipant.AudioLevel.fromRawAudioLevel(remoteLevel))) + .orElse(Collections.emptyMap()) + ); + } + @Override public @NonNull WebRtcServiceState handleCallReconnect(@NonNull WebRtcServiceState currentState, @NonNull CallManager.CallEvent event) { Log.i(TAG, "handleCallReconnect(): event: " + event); 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 d740a8caac..01b81827be 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 @@ -120,15 +120,12 @@ public class GroupConnectedActionProcessor extends GroupActionProcessor { for (CallParticipant participant : currentState.getCallInfoState().getRemoteCallParticipants()) { CallParticipantId callParticipantId = participant.getCallParticipantId(); - Integer audioLevel = null; if (remoteDeviceStates != null) { GroupCall.RemoteDeviceState state = remoteDeviceStates.get(callParticipantId.getDemuxId()); if (state != null) { - audioLevel = state.getAudioLevel(); + remoteAudioLevels.put(callParticipantId, CallParticipant.AudioLevel.fromRawAudioLevel(state.getAudioLevel())); } } - - remoteAudioLevels.put(callParticipantId, CallParticipant.AudioLevel.fromRawAudioLevel(audioLevel)); } return ephemeralState.copy(localAudioLevel, remoteAudioLevels); 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 f5780bc7b3..4fa5df3daf 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 @@ -106,7 +106,7 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor { callSetupState.getIceServers(), hideIp, NetworkUtil.getCallingBandwidthMode(context), - null, + AUDIO_LEVELS_INTERVAL, false); } catch (CallException e) { return callFailure(currentState, "Unable to proceed with call: ", e); 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 43d2ada09d..340f8de853 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 @@ -150,7 +150,7 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor { callSetupState.getIceServers(), callSetupState.isAlwaysTurnServers(), NetworkUtil.getCallingBandwidthMode(context), - null, + AUDIO_LEVELS_INTERVAL, currentState.getCallSetupState(activePeer).isEnableVideoOnCreate()); } catch (CallException e) { return callFailure(currentState, "Unable to proceed with call: ", e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index ff07522142..92b47984e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -524,7 +524,7 @@ private void processStateless(@NonNull Function1 serviceState.getActionProcessor().handleAudioLevelsChanged(serviceState, s, capturedLevel, receivedLevel)); } @Override 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 12eb19f49a..61c2fce378 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 @@ -462,6 +462,10 @@ public abstract class WebRtcActionProcessor { return currentState; } + protected @NonNull WebRtcEphemeralState handleAudioLevelsChanged(@NonNull WebRtcServiceState currentState, @NonNull WebRtcEphemeralState ephemeralState, int localLevel, int remoteLevel) { + return ephemeralState; + } + public @NonNull WebRtcServiceState handleCallReconnect(@NonNull WebRtcServiceState currentState, @NonNull CallManager.CallEvent event) { Log.i(tag, "handleCallReconnect not processed"); return currentState; diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcEphemeralState.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcEphemeralState.kt index 9b4b03ae86..de598abcef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcEphemeralState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcEphemeralState.kt @@ -7,6 +7,6 @@ import org.thoughtcrime.securesms.events.CallParticipantId * The state of the call system which contains data which changes frequently. */ data class WebRtcEphemeralState( - val localAudioLevel: CallParticipant.AudioLevel? = null, + val localAudioLevel: CallParticipant.AudioLevel = CallParticipant.AudioLevel.LOWEST, val remoteAudioLevels: Map = emptyMap(), )