From f0ea529ef62e28995b06d36a9e6e8c0eaa81c9ea Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 6 Apr 2023 15:42:45 +0200 Subject: [PATCH 1/3] keep screen on while recording voicebroadcast --- vector/src/main/java/im/vector/app/core/di/VoiceModule.kt | 5 ++++- .../voicebroadcast/recording/VoiceBroadcastRecorderQ.kt | 5 ++++- .../usecase/GetVoiceBroadcastStateEventLiveUseCase.kt | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt index 40fb4ecea75..638cfa3f453 100644 --- a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt @@ -23,6 +23,7 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker import im.vector.app.features.voicebroadcast.listening.VoiceBroadcastPlayer import im.vector.app.features.voicebroadcast.listening.VoiceBroadcastPlayerImpl import im.vector.app.features.voicebroadcast.recording.VoiceBroadcastRecorder @@ -41,12 +42,14 @@ abstract class VoiceModule { context: Context, sessionHolder: ActiveSessionHolder, getVoiceBroadcastStateEventLiveUseCase: GetVoiceBroadcastStateEventLiveUseCase, + playbackTracker: AudioMessagePlaybackTracker ): VoiceBroadcastRecorder? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { VoiceBroadcastRecorderQ( context = context, sessionHolder = sessionHolder, - getVoiceBroadcastEventUseCase = getVoiceBroadcastStateEventLiveUseCase + getVoiceBroadcastEventUseCase = getVoiceBroadcastStateEventLiveUseCase, + playbackTracker = playbackTracker ) } else { null diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt index b400bb5871a..3ccf9e491f5 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt @@ -21,6 +21,7 @@ import android.media.MediaRecorder import android.os.Build import androidx.annotation.RequiresApi import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker import im.vector.app.features.session.coroutineScope import im.vector.app.features.voice.AbstractVoiceRecorderQ import im.vector.app.features.voicebroadcast.model.VoiceBroadcast @@ -44,7 +45,8 @@ import java.util.concurrent.TimeUnit class VoiceBroadcastRecorderQ( context: Context, private val sessionHolder: ActiveSessionHolder, - private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventLiveUseCase + private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventLiveUseCase, + private val playbackTracker: AudioMessagePlaybackTracker ) : AbstractVoiceRecorderQ(context), VoiceBroadcastRecorder { private val session get() = sessionHolder.getActiveSession() @@ -103,6 +105,7 @@ class VoiceBroadcastRecorderQ( override fun startRecord(roomId: String) { super.startRecord(roomId) + playbackTracker.updateCurrentRecording(AudioMessagePlaybackTracker.RECORDING_ID, emptyList()) observeConnectionState() } diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/usecase/GetVoiceBroadcastStateEventLiveUseCase.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/usecase/GetVoiceBroadcastStateEventLiveUseCase.kt index 22fb0df6f9d..a27b1689f73 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/usecase/GetVoiceBroadcastStateEventLiveUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/usecase/GetVoiceBroadcastStateEventLiveUseCase.kt @@ -47,8 +47,7 @@ class GetVoiceBroadcastStateEventLiveUseCase @Inject constructor( ) { fun execute(voiceBroadcast: VoiceBroadcast): Flow> { - val room = session.getRoom(voiceBroadcast.roomId) ?: error("Unknown roomId: ${voiceBroadcast.roomId}") - return getMostRecentVoiceBroadcastEventFlow(room, voiceBroadcast) + return getMostRecentVoiceBroadcastEventFlow(voiceBroadcast) .onEach { event -> Timber.d( "## VoiceBroadcast | " + @@ -61,7 +60,8 @@ class GetVoiceBroadcastStateEventLiveUseCase @Inject constructor( /** * Get a flow of the most recent event for the given voice broadcast. */ - private fun getMostRecentVoiceBroadcastEventFlow(room: Room, voiceBroadcast: VoiceBroadcast): Flow> { + private fun getMostRecentVoiceBroadcastEventFlow(voiceBroadcast: VoiceBroadcast): Flow> { + val room = session.getRoom(voiceBroadcast.roomId) ?: error("Unknown roomId: ${voiceBroadcast.roomId}") val startedEventFlow = room.flow().liveTimelineEvent(voiceBroadcast.voiceBroadcastId) // observe started event changes return startedEventFlow From e6b192131ea97807c0f5ceb9f092dd59d03b12be Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 6 Apr 2023 19:17:17 +0200 Subject: [PATCH 2/3] Add changelog --- changelog.d/8313.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8313.bugfix diff --git a/changelog.d/8313.bugfix b/changelog.d/8313.bugfix new file mode 100644 index 00000000000..b5246781017 --- /dev/null +++ b/changelog.d/8313.bugfix @@ -0,0 +1 @@ +Keep screen on while recording voicebroadcast From b2cbffce308bd6de74e8f915d11468ae4f5e77d9 Mon Sep 17 00:00:00 2001 From: yostyle Date: Wed, 12 Apr 2023 11:30:22 +0200 Subject: [PATCH 3/3] Add stop recorder tracker --- .../main/java/im/vector/app/core/di/VoiceModule.kt | 5 +---- .../home/room/detail/composer/AudioMessageHelper.kt | 2 +- .../timeline/helper/AudioMessagePlaybackTracker.kt | 2 +- .../listening/VoiceBroadcastPlayerImpl.kt | 2 +- .../recording/VoiceBroadcastRecorderQ.kt | 5 +---- .../recording/usecase/StartVoiceBroadcastUseCase.kt | 12 +++++++++--- .../usecase/StartVoiceBroadcastUseCaseTest.kt | 1 + 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt index 638cfa3f453..40fb4ecea75 100644 --- a/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/VoiceModule.kt @@ -23,7 +23,6 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker import im.vector.app.features.voicebroadcast.listening.VoiceBroadcastPlayer import im.vector.app.features.voicebroadcast.listening.VoiceBroadcastPlayerImpl import im.vector.app.features.voicebroadcast.recording.VoiceBroadcastRecorder @@ -42,14 +41,12 @@ abstract class VoiceModule { context: Context, sessionHolder: ActiveSessionHolder, getVoiceBroadcastStateEventLiveUseCase: GetVoiceBroadcastStateEventLiveUseCase, - playbackTracker: AudioMessagePlaybackTracker ): VoiceBroadcastRecorder? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { VoiceBroadcastRecorderQ( context = context, sessionHolder = sessionHolder, - getVoiceBroadcastEventUseCase = getVoiceBroadcastStateEventLiveUseCase, - playbackTracker = playbackTracker + getVoiceBroadcastEventUseCase = getVoiceBroadcastStateEventLiveUseCase ) } else { null diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt index c55f8ec047b..149f0fb0aa7 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt @@ -239,7 +239,7 @@ class AudioMessageHelper @Inject constructor( val percentage = currentPosition.toFloat() / totalDuration playbackTracker.updatePlayingAtPlaybackTime(id, currentPosition, percentage) } else { - playbackTracker.stopPlayback(id) + playbackTracker.stopPlaybackOrRecorder(id) stopPlaybackTicker() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/AudioMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/AudioMessagePlaybackTracker.kt index c598a99af74..00382b5a3f2 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/AudioMessagePlaybackTracker.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/AudioMessagePlaybackTracker.kt @@ -100,7 +100,7 @@ class AudioMessagePlaybackTracker @Inject constructor() { } } - fun stopPlayback(id: String) { + fun stopPlaybackOrRecorder(id: String) { val state = getPlaybackState(id) if (state !is Listener.State.Error) { setState(id, Listener.State.Idle) diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/VoiceBroadcastPlayerImpl.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/VoiceBroadcastPlayerImpl.kt index 5bb890b07c2..5a910210899 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/VoiceBroadcastPlayerImpl.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/listening/VoiceBroadcastPlayerImpl.kt @@ -527,7 +527,7 @@ class VoiceBroadcastPlayerImpl @Inject constructor( State.Idle -> { // restart the playback time if player completed with less than 1s remaining time if (percentage == null || (playlist.duration - position) < 1000) { - playbackTracker.stopPlayback(id) + playbackTracker.stopPlaybackOrRecorder(id) } else { playbackTracker.updatePausedAtPlaybackTime(id, position, percentage) } diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt index 3ccf9e491f5..b400bb5871a 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/VoiceBroadcastRecorderQ.kt @@ -21,7 +21,6 @@ import android.media.MediaRecorder import android.os.Build import androidx.annotation.RequiresApi import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker import im.vector.app.features.session.coroutineScope import im.vector.app.features.voice.AbstractVoiceRecorderQ import im.vector.app.features.voicebroadcast.model.VoiceBroadcast @@ -45,8 +44,7 @@ import java.util.concurrent.TimeUnit class VoiceBroadcastRecorderQ( context: Context, private val sessionHolder: ActiveSessionHolder, - private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventLiveUseCase, - private val playbackTracker: AudioMessagePlaybackTracker + private val getVoiceBroadcastEventUseCase: GetVoiceBroadcastStateEventLiveUseCase ) : AbstractVoiceRecorderQ(context), VoiceBroadcastRecorder { private val session get() = sessionHolder.getActiveSession() @@ -105,7 +103,6 @@ class VoiceBroadcastRecorderQ( override fun startRecord(roomId: String) { super.startRecord(roomId) - playbackTracker.updateCurrentRecording(AudioMessagePlaybackTracker.RECORDING_ID, emptyList()) observeConnectionState() } diff --git a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/usecase/StartVoiceBroadcastUseCase.kt b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/usecase/StartVoiceBroadcastUseCase.kt index d807c67f746..3b0644f6d21 100644 --- a/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/usecase/StartVoiceBroadcastUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/voicebroadcast/recording/usecase/StartVoiceBroadcastUseCase.kt @@ -20,6 +20,7 @@ import android.content.Context import androidx.core.content.FileProvider import im.vector.app.core.resources.BuildMeta import im.vector.app.features.attachments.toContentAttachmentData +import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker import im.vector.app.features.session.coroutineScope import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants import im.vector.app.features.voicebroadcast.VoiceBroadcastFailure @@ -54,6 +55,7 @@ import javax.inject.Inject class StartVoiceBroadcastUseCase @Inject constructor( private val session: Session, private val voiceBroadcastRecorder: VoiceBroadcastRecorder?, + private val playbackTracker: AudioMessagePlaybackTracker, private val context: Context, private val buildMeta: BuildMeta, private val getRoomLiveVoiceBroadcastsUseCase: GetRoomLiveVoiceBroadcastsUseCase, @@ -106,10 +108,14 @@ class StartVoiceBroadcastUseCase @Inject constructor( } override fun onStateUpdated(state: VoiceBroadcastRecorder.State) { - if (state == VoiceBroadcastRecorder.State.Error) { - session.coroutineScope.launch { - pauseVoiceBroadcastUseCase.execute(room.roomId) + when (state) { + VoiceBroadcastRecorder.State.Recording -> playbackTracker.updateCurrentRecording(AudioMessagePlaybackTracker.RECORDING_ID, emptyList()) + VoiceBroadcastRecorder.State.Idle -> playbackTracker.stopPlaybackOrRecorder(AudioMessagePlaybackTracker.RECORDING_ID) + VoiceBroadcastRecorder.State.Error -> { + playbackTracker.stopPlaybackOrRecorder(AudioMessagePlaybackTracker.RECORDING_ID) + session.coroutineScope.launch { pauseVoiceBroadcastUseCase.execute(room.roomId) } } + else -> Unit } } }) diff --git a/vector/src/test/java/im/vector/app/features/voicebroadcast/usecase/StartVoiceBroadcastUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/voicebroadcast/usecase/StartVoiceBroadcastUseCaseTest.kt index 9aa0ddf3b29..a9a49034fcb 100644 --- a/vector/src/test/java/im/vector/app/features/voicebroadcast/usecase/StartVoiceBroadcastUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/voicebroadcast/usecase/StartVoiceBroadcastUseCaseTest.kt @@ -57,6 +57,7 @@ class StartVoiceBroadcastUseCaseTest { StartVoiceBroadcastUseCase( session = fakeSession, voiceBroadcastRecorder = fakeVoiceBroadcastRecorder, + playbackTracker = mockk(), context = FakeContext().instance, buildMeta = mockk(), getRoomLiveVoiceBroadcastsUseCase = fakeGetRoomLiveVoiceBroadcastsUseCase,