Fix voice message recording not starting after permission is granted

This commit is contained in:
Karsten Knappe 2026-01-29 11:31:35 +00:00
parent 3d75b92ec3
commit efa6aa289d
2 changed files with 14 additions and 1 deletions

View file

@ -69,6 +69,7 @@ class DefaultVoiceMessageComposerPresenter(
} }
private val permissionsPresenter = permissionsPresenterFactory.create(Manifest.permission.RECORD_AUDIO) private val permissionsPresenter = permissionsPresenterFactory.create(Manifest.permission.RECORD_AUDIO)
private var pendingEvent: VoiceMessageRecorderEvent.Start? = null
private val mediaSender = mediaSenderFactory.create(timelineMode) private val mediaSender = mediaSenderFactory.create(timelineMode)
@Composable @Composable
@ -88,6 +89,15 @@ class DefaultVoiceMessageComposerPresenter(
player.setMedia(recording.file.path) player.setMedia(recording.file.path)
} }
LaunchedEffect(permissionState.permissionGranted) {
if (permissionState.permissionGranted) {
pendingEvent?.let {
localCoroutineScope.startRecording()
pendingEvent = null
}
}
}
fun handleLifecycleEvent(event: Lifecycle.Event) { fun handleLifecycleEvent(event: Lifecycle.Event) {
when (event) { when (event) {
Lifecycle.Event.ON_PAUSE -> { Lifecycle.Event.ON_PAUSE -> {
@ -102,6 +112,7 @@ class DefaultVoiceMessageComposerPresenter(
} }
fun handleVoiceMessageRecorderEvent(event: VoiceMessageRecorderEvent) { fun handleVoiceMessageRecorderEvent(event: VoiceMessageRecorderEvent) {
pendingEvent = null
when (event) { when (event) {
VoiceMessageRecorderEvent.Start -> { VoiceMessageRecorderEvent.Start -> {
Timber.v("Voice message record button pressed") Timber.v("Voice message record button pressed")
@ -111,6 +122,7 @@ class DefaultVoiceMessageComposerPresenter(
} }
else -> { else -> {
Timber.i("Voice message permission needed") Timber.i("Voice message permission needed")
pendingEvent = VoiceMessageRecorderEvent.Start
permissionState.eventSink(PermissionsEvent.RequestPermissions) permissionState.eventSink(PermissionsEvent.RequestPermissions)
} }
} }

View file

@ -551,9 +551,10 @@ class DefaultVoiceMessageComposerPresenterTest {
// Dialog is hidden, user accepts permissions // Dialog is hidden, user accepts permissions
assertThat(awaitItem().showPermissionRationaleDialog).isFalse() assertThat(awaitItem().showPermissionRationaleDialog).isFalse()
// Permission is granted, recording starts automatically
permissionsPresenter.setPermissionGranted() permissionsPresenter.setPermissionGranted()
awaitItem().eventSink(VoiceMessageComposerEvent.RecorderEvent(VoiceMessageRecorderEvent.Start)) skipItems(1)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.voiceMessageState).isEqualTo(RECORDING_STATE) assertThat(finalState.voiceMessageState).isEqualTo(RECORDING_STATE)
voiceRecorder.assertCalls(started = 1) voiceRecorder.assertCalls(started = 1)