From 0e6eff9f8550861c7799730aa6bc9dc9e5d20150 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Tue, 8 Aug 2023 20:02:22 +0200 Subject: [PATCH] feat: Add pause / resume functionality --- .../alibi/services/AudioRecorderService.kt | 6 ++++ .../alibi/services/IntervalRecorderService.kt | 6 +++- .../molecules/RecordingStatus.kt | 29 +++++++++++++++++-- .../alibi/ui/models/AudioRecorderModel.kt | 11 +++++++ app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt index 02d2bce..b54f5b7 100644 --- a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt @@ -49,6 +49,12 @@ class AudioRecorderService: IntervalRecorderService() { recorder = newRecorder } + override fun pause() { + super.pause() + + resetRecorder() + } + override fun stop() { super.stop() diff --git a/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt index 1004adf..3710e64 100644 --- a/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt @@ -43,6 +43,7 @@ abstract class IntervalRecorderService: ExtraRecorderInformationService() { // Make overrideable open fun startNewCycle() { + counter += 1 deleteOldRecordings() } @@ -89,8 +90,11 @@ abstract class IntervalRecorderService: ExtraRecorderInformationService() { } override fun resume() { - super.resume() createTimer() + + // We first want to start our timers, so the `ExtraRecorderInformationService` can fetch + // amplitudes + super.resume() } override fun stop() { diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/RecordingStatus.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/RecordingStatus.kt index e382876..300450b 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/RecordingStatus.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AudioRecorder/molecules/RecordingStatus.kt @@ -21,10 +21,14 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Pause +import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Save import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon +import androidx.compose.material3.LargeFloatingActionButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -99,8 +103,6 @@ fun RecordingStatus( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - val distance = Duration.between(audioRecorder.recorderService!!.recordingStart, now).toMillis() - Pulsating { Box( modifier = Modifier @@ -111,7 +113,7 @@ fun RecordingStatus( } Spacer(modifier = Modifier.width(16.dp)) Text( - text = formatDuration(distance), + text = formatDuration(audioRecorder.recordingTime!!), style = MaterialTheme.typography.headlineLarge, ) } @@ -164,6 +166,27 @@ fun RecordingStatus( } } + val pauseLabel = stringResource(R.string.ui_audioRecorder_action_pause_label) + val resumeLabel = stringResource(R.string.ui_audioRecorder_action_resume_label) + LargeFloatingActionButton( + modifier = Modifier + .semantics { + contentDescription = if (audioRecorder.isPaused) resumeLabel else pauseLabel + }, + onClick = { + if (audioRecorder.isPaused) { + audioRecorder.resumeRecording() + } else { + audioRecorder.pauseRecording() + } + }, + ) { + Icon( + if (audioRecorder.isPaused) Icons.Default.PlayArrow else Icons.Default.Pause, + contentDescription = null, + ) + } + val alpha by animateFloatAsState(if (progressVisible) 1f else 0f, tween(1000)) val label = stringResource(R.string.ui_audioRecorder_action_save_label) diff --git a/app/src/main/java/app/myzel394/alibi/ui/models/AudioRecorderModel.kt b/app/src/main/java/app/myzel394/alibi/ui/models/AudioRecorderModel.kt index 9757662..23dabc9 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/models/AudioRecorderModel.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/models/AudioRecorderModel.kt @@ -30,6 +30,9 @@ class AudioRecorderModel: ViewModel() { val isInRecording: Boolean get() = recorderState !== RecorderState.IDLE && recordingTime != null + val isPaused: Boolean + get() = recorderState === RecorderState.PAUSED + val progress: Float get() = (recordingTime!! / recorderService!!.settings!!.maxDuration).toFloat() @@ -96,6 +99,14 @@ class AudioRecorderModel: ViewModel() { reset() } + fun pauseRecording() { + recorderService!!.changeState(RecorderState.PAUSED) + } + + fun resumeRecording() { + recorderService!!.changeState(RecorderState.RECORDING) + } + fun setMaxAmplitudesAmount(amount: Int) { recorderService?.amplitudesAmount = amount } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ce351a..58272dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,8 @@ Delete Delete Recording? Are you sure you want to delete this recording? + Pause Recording + Resume Recording Save Recording Alibi will continue recording in the background and store the last %s minutes at your request Processing