From 62596b38c78e4bc569777ce2371f43ea1064bb0f Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 14 Oct 2022 16:40:22 +0200 Subject: [PATCH] Pause recording when the composer is not visible anymore --- .../detail/composer/MessageComposerFragment.kt | 16 ++++++++++++---- .../detail/composer/MessageComposerViewModel.kt | 15 +++++++++++++++ .../detail/composer/MessageComposerViewState.kt | 9 +++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt index b3abfa480e..4721b81571 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt @@ -227,10 +227,18 @@ class MessageComposerFragment : VectorBaseFragment(), A override fun onPause() { super.onPause() - if (withState(messageComposerViewModel) { it.isVoiceRecording } && requireActivity().isChangingConfigurations) { - // we're rotating, maintain any active recordings - } else { - messageComposerViewModel.handle(MessageComposerAction.OnEntersBackground(composer.text.toString())) + withState(messageComposerViewModel) { + when { + it.isVoiceRecording && requireActivity().isChangingConfigurations -> { + // we're rotating, maintain any active recordings + } + // TODO remove this when there will be a recording indicator outside of the timeline + // Pause voice broadcast if the timeline is not shown anymore + it.isVoiceBroadcasting && !requireActivity().isChangingConfigurations -> timelineViewModel.handle(VoiceBroadcastAction.Pause) + else -> { + messageComposerViewModel.handle(MessageComposerAction.OnEntersBackground(composer.text.toString())) + } + } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt index 6f1210a584..eef06d11b7 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.detail.composer +import androidx.lifecycle.asFlow import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -40,8 +41,11 @@ import im.vector.app.features.home.room.detail.toMessageType import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants +import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session @@ -90,6 +94,7 @@ class MessageComposerViewModel @AssistedInject constructor( init { loadDraftIfAny() observePowerLevelAndEncryption() + observeVoiceBroadcast() subscribeToStateInternal() } @@ -182,6 +187,16 @@ class MessageComposerViewModel @AssistedInject constructor( } } + private fun observeVoiceBroadcast() { + room.stateService().getStateEventLive(VoiceBroadcastConstants.STATE_ROOM_VOICE_BROADCAST_INFO, QueryStringValue.Equals(session.myUserId)) + .asFlow() + .unwrap() + .mapNotNull { it.asVoiceBroadcastEvent()?.content?.voiceBroadcastState } + .setOnEach { + copy(voiceBroadcastState = it) + } + } + private fun handleEnterQuoteMode(action: MessageComposerAction.EnterQuoteMode) { room.getTimelineEvent(action.eventId)?.let { timelineEvent -> setState { copy(sendMode = SendMode.Quote(timelineEvent, currentComposerText)) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt index 47a7122584..0df1dbebd8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewState.kt @@ -19,6 +19,7 @@ package im.vector.app.features.home.room.detail.composer import com.airbnb.mvrx.MavericksState import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView +import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import kotlin.random.Random @@ -67,6 +68,7 @@ data class MessageComposerViewState( val startsThread: Boolean = false, val sendMode: SendMode = SendMode.Regular("", false), val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.Idle, + val voiceBroadcastState: VoiceBroadcastState? = null, val text: CharSequence? = null, ) : MavericksState { @@ -77,6 +79,13 @@ data class MessageComposerViewState( is VoiceMessageRecorderView.RecordingUiState.Recording -> true } + val isVoiceBroadcasting = when (voiceBroadcastState) { + VoiceBroadcastState.STARTED, + VoiceBroadcastState.PAUSED, + VoiceBroadcastState.RESUMED -> true + else -> false + } + val isVoiceMessageIdle = !isVoiceRecording val isComposerVisible = canSendMessage.boolean() && !isVoiceRecording