From 4f9f65d0b1c648365d36c95c00779800f0bb5016 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sat, 16 Dec 2023 23:09:10 +0100 Subject: [PATCH] fix: Only start recording if recordingstate is idle --- .../alibi/services/RecorderService.kt | 2 +- .../java/app/myzel394/alibi/ui/Navigation.kt | 2 ++ .../alibi/ui/models/AudioRecorderModel.kt | 10 ++++++-- .../alibi/ui/models/BaseRecorderModel.kt | 25 ++++++++++--------- .../alibi/ui/models/VideoRecorderModel.kt | 9 +++++-- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/services/RecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/RecorderService.kt index 0330800..463010d 100644 --- a/app/src/main/java/app/myzel394/alibi/services/RecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/RecorderService.kt @@ -29,7 +29,7 @@ abstract class RecorderService : LifecycleService() { private lateinit var recordingTimeTimer: ScheduledExecutorService private var notificationDetails: RecorderNotificationHelper.NotificationDetails? = null - var state = RecorderState.STOPPED + var state = RecorderState.IDLE private set var onStateChange: ((RecorderState) -> Unit)? = null diff --git a/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt b/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt index 1224257..d9a73dd 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt @@ -51,9 +51,11 @@ fun Navigation( DisposableEffect(Unit) { audioRecorder.bindToService(context) + videoRecorder.bindToService(context) onDispose { audioRecorder.unbindFromService(context) + videoRecorder.unbindFromService(context) } } 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 4d679c7..aedac2e 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 @@ -8,6 +8,7 @@ import androidx.compose.runtime.setValue import androidx.documentfile.provider.DocumentFile import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.RecordingInformation +import app.myzel394.alibi.enums.RecorderState import app.myzel394.alibi.helpers.AudioBatchesFolder import app.myzel394.alibi.services.AudioRecorderService import app.myzel394.alibi.ui.utils.MicrophoneInfo @@ -47,8 +48,13 @@ class AudioRecorderModel : onAmplitudeChange() } - service.clearAllRecordings() - service.startRecording() + // `onServiceConnected` may be called when reconnecting to the service, + // so we only want to actually start the recording if the service is idle and thus + // not already recording + if (service.state == RecorderState.IDLE) { + service.clearAllRecordings() + service.startRecording() + } recorderState = service.state recordingTime = service.recordingTime diff --git a/app/src/main/java/app/myzel394/alibi/ui/models/BaseRecorderModel.kt b/app/src/main/java/app/myzel394/alibi/ui/models/BaseRecorderModel.kt index ad9f195..19c1c23 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/models/BaseRecorderModel.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/models/BaseRecorderModel.kt @@ -105,6 +105,17 @@ abstract class BaseRecorderModel, B : BatchesF protected open fun handleIntent(intent: Intent) = intent + private fun stopOldServices(context: Context) { + runCatching { + context.unbindService(connection) + } + + val intent = Intent(context, intentClass) + runCatching { + context.stopService(intent) + } + } + // If override, call `super` AFTER setting the settings open fun startRecording( context: Context, @@ -113,10 +124,7 @@ abstract class BaseRecorderModel, B : BatchesF this.settings = settings // Clean up - runCatching { - recorderService?.clearAllRecordings() - context.unbindService(connection) - } + stopOldServices(context) notificationDetails = settings.notificationSettings.let { if (it == null) @@ -147,10 +155,6 @@ abstract class BaseRecorderModel, B : BatchesF suspend fun stopRecording(context: Context) { recorderService!!.stopRecording() - - runCatching { - context.unbindService(connection) - } } fun pauseRecording() { @@ -164,11 +168,8 @@ abstract class BaseRecorderModel, B : BatchesF fun destroyService(context: Context) { recorderService!!.destroy() reset() - val intent = Intent(context, intentClass) - runCatching { - context.stopService(intent) - } + stopOldServices(context) } // Bind functions used to manually bind to the service if the app diff --git a/app/src/main/java/app/myzel394/alibi/ui/models/VideoRecorderModel.kt b/app/src/main/java/app/myzel394/alibi/ui/models/VideoRecorderModel.kt index 3e29ace..9868527 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/models/VideoRecorderModel.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/models/VideoRecorderModel.kt @@ -39,8 +39,13 @@ class VideoRecorderModel : } override fun onServiceConnected(service: VideoRecorderService) { - service.clearAllRecordings() - service.startRecording() + // `onServiceConnected` may be called when reconnecting to the service, + // so we only want to actually start the recording if the service is idle and thus + // not already recording + if (service.state == RecorderState.IDLE) { + service.clearAllRecordings() + service.startRecording() + } recorderState = service.state recordingTime = service.recordingTime