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 d48d86405..685aaa90a 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 64959a60b..446c44c50 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 d740a8caa..01b81827b 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 f5780bc7b..4fa5df3da 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 43d2ada09..340f8de85 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 ff0752214..92b47984e 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 12eb19f49..61c2fce37 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 9b4b03ae8..de598abce 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(), )