Skip to content

Commit ce7a78b

Browse files
md-alramlawitosinonikute
authored andcommitted
Refactor: Improve recording state management in AudioRecorderViewModel
This commit refactors the recording state management in `AudioRecorderViewModel`. - Replaced `collectAsState` with `collectAsStateWithLifecycle` for better lifecycle awareness in `RecordingScreen`. - Moved screen state management (`ScreenState`) into `AudioRecorderViewModel` from `RecordingScreen`. - Simplified `onStartRecording` and `onStopRecording` by removing the `updateUI` callback and directly updating the screen state within the ViewModel. - Ensured `onStopRecording` and `finishRecorder` are called in `onCleared` of the ViewModel. - Initialized the recorder by calling `setupRecorder()` in the `init` block of `AudioRecorderViewModel`. - Removed `DisposableEffect` for recorder setup and teardown from `RecordingScreen` as it's now handled by the ViewModel's lifecycle.
1 parent 6f280ed commit ce7a78b

2 files changed

Lines changed: 26 additions & 21 deletions

File tree

shared/src/commonMain/kotlin/com/module/notelycompose/audio/presentation/AudioRecorderViewModel.kt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,38 @@ package com.module.notelycompose.audio.presentation
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5-
import com.module.notelycompose.audio.ui.recorder.AudioRecorderUiState
65
import com.module.notelycompose.audio.domain.AudioRecorderInteractor
76
import com.module.notelycompose.audio.domain.AudioRecorderPresentationState
7+
import com.module.notelycompose.audio.ui.recorder.AudioRecorderUiState
8+
import com.module.notelycompose.audio.ui.recorder.ScreenState
9+
import kotlinx.coroutines.flow.MutableStateFlow
810
import kotlinx.coroutines.flow.StateFlow
11+
import kotlinx.coroutines.flow.asStateFlow
12+
import kotlinx.coroutines.flow.update
13+
import kotlinx.coroutines.launch
914

1015
class AudioRecorderViewModel(
1116
private val interactor: AudioRecorderInteractor
1217
) : ViewModel() {
1318
val audioRecorderPresentationState: StateFlow<AudioRecorderPresentationState> =
1419
interactor.state
1520

16-
fun onStartRecording(noteId: Long?, updateUI: () -> Unit) {
21+
init {
22+
setupRecorder()
23+
}
24+
private val _screenState = MutableStateFlow(ScreenState.Initial)
25+
val uiState: StateFlow<ScreenState> = _screenState.asStateFlow()
26+
27+
fun onStartRecording(noteId: Long?) {
1728
interactor.initState()
18-
interactor.onStartRecording(noteId,viewModelScope, updateUI)
29+
interactor.onStartRecording(noteId,viewModelScope, {
30+
_screenState.update { ScreenState.Recording }
31+
})
1932
}
2033

21-
fun onStopRecording() {
22-
interactor.onStopRecording(viewModelScope)
34+
fun onStopRecording() = viewModelScope.launch {
35+
interactor.onStopRecording(this)
36+
_screenState.update { ScreenState.Success }
2337
}
2438

2539
fun setupRecorder() {
@@ -39,7 +53,10 @@ class AudioRecorderViewModel(
3953
}
4054

4155
override fun onCleared() {
56+
super.onCleared()
4257
interactor.onCleared()
58+
onStopRecording()
59+
finishRecorder()
4360
}
4461

4562
fun onRequestAudioPermission() {

shared/src/commonMain/kotlin/com/module/notelycompose/audio/ui/recorder/RecordingScreen.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ import androidx.compose.material3.IconButton
3636
import androidx.compose.material3.MaterialTheme
3737
import androidx.compose.material3.Text
3838
import androidx.compose.runtime.Composable
39-
import androidx.compose.runtime.DisposableEffect
4039
import androidx.compose.runtime.LaunchedEffect
41-
import androidx.compose.runtime.collectAsState
4240
import androidx.compose.runtime.getValue
4341
import androidx.compose.runtime.mutableStateOf
4442
import androidx.compose.runtime.remember
@@ -58,6 +56,7 @@ import androidx.compose.ui.platform.LocalWindowInfo
5856
import androidx.compose.ui.text.font.FontWeight
5957
import androidx.compose.ui.unit.dp
6058
import androidx.compose.ui.unit.sp
59+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
6160
import com.module.notelycompose.audio.presentation.AudioRecorderViewModel
6261
import com.module.notelycompose.core.debugPrintln
6362
import com.module.notelycompose.notes.presentation.detail.TextEditorViewModel
@@ -92,16 +91,8 @@ fun RecordingScreen(
9291
viewModel: AudioRecorderViewModel = koinViewModel(),
9392
editorViewModel: TextEditorViewModel
9493
) {
95-
val recordingState by viewModel.audioRecorderPresentationState.collectAsState()
96-
var screenState by remember { mutableStateOf(ScreenState.Initial) }
97-
98-
DisposableEffect(Unit){
99-
viewModel.setupRecorder()
100-
onDispose {
101-
viewModel.onStopRecording()
102-
viewModel.finishRecorder()
103-
}
104-
}
94+
val recordingState by viewModel.audioRecorderPresentationState.collectAsStateWithLifecycle()
95+
val screenState by viewModel.uiState.collectAsStateWithLifecycle()
10596

10697
Box(
10798
modifier = Modifier
@@ -115,9 +106,7 @@ fun RecordingScreen(
115106
ScreenState.Initial -> RecordingInitialScreen(
116107
onNavigateBack = navigateBack,
117108
onTapToRecord = {
118-
viewModel.onStartRecording(noteId) {
119-
screenState = ScreenState.Recording
120-
}
109+
viewModel.onStartRecording(noteId)
121110
},
122111
onStopRecording = viewModel::onStopRecording
123112
)
@@ -127,7 +116,6 @@ fun RecordingScreen(
127116
onStopRecording = {
128117
debugPrintln { "onStop recording" }
129118
viewModel.onStopRecording()
130-
screenState = ScreenState.Success
131119
},
132120
onNavigateBack = navigateBack,
133121
isRecordPaused = recordingState.isRecordPaused,

0 commit comments

Comments
 (0)