From 4474d1fc9e8e02b79c33881b9bf0fd104e8a0b17 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 19 Feb 2025 10:20:51 -0400 Subject: [PATCH] Add proper timeout for call state changes. --- .../components/webrtc/v2/CallScreen.kt | 1 - .../webrtc/v2/ComposeCallScreenMediator.kt | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallScreen.kt index a86c8210b2..61556716cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallScreen.kt @@ -384,7 +384,6 @@ private fun LargeLocalVideoRenderer( localParticipant = localParticipant, modifier = Modifier .fillMaxSize() - .clip(MaterialTheme.shapes.extraLarge) ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt index fbe10ce09a..344f93c079 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt @@ -15,6 +15,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest @@ -32,6 +35,7 @@ import org.thoughtcrime.securesms.events.WebRtcViewModel import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState import org.thoughtcrime.securesms.webrtc.CallParticipantsViewState +import kotlin.time.Duration.Companion.seconds /** * Compose call screen wrapper @@ -254,7 +258,7 @@ class ComposeCallScreenMediator(activity: WebRtcCallActivity, viewModel: WebRtcC } override fun onCallStateUpdate(callControlsChange: CallControlsChange) { - callScreenViewModel.callScreenState.update { it.copy(callControlsChange = callControlsChange) } + callScreenViewModel.emitCallControlsChange(callControlsChange) } override fun dismissCallOverflowPopup() { @@ -298,10 +302,23 @@ class ComposeCallScreenMediator(activity: WebRtcCallActivity, viewModel: WebRtcC ) ) + private var callControlsChangeJob: Job? = null + val callParticipantListUpdate = MutableStateFlow(CallParticipantListUpdate.computeDeltaUpdate(emptyList(), emptyList())) fun emitControllerEvent(controllerEvent: CallScreenController.Event) { viewModelScope.launch { callScreenControllerEvents.emit(controllerEvent) } } + + fun emitCallControlsChange(callControlsChange: CallControlsChange) { + viewModelScope.launch { + callControlsChangeJob?.cancelAndJoin() + callControlsChangeJob = launch { + callScreenState.update { it.copy(callControlsChange = callControlsChange) } + delay(2.seconds) + callScreenState.update { it.copy(callControlsChange = null) } + } + } + } } }