From 6605f44eecbcd9f408919d3da67c28240b05dbe1 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:38:39 +0100 Subject: [PATCH] feat: Add custom save folder to AppSettings --- .../java/app/myzel394/alibi/db/AppSettings.kt | 29 +++++++++++++++++++ .../alibi/helpers/AudioRecorderExporter.kt | 4 +++ 2 files changed, 33 insertions(+) diff --git a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt index 505f1a7..8c612e7 100644 --- a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt +++ b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt @@ -1,8 +1,10 @@ package app.myzel394.alibi.db +import android.content.Context import android.media.MediaRecorder import android.os.Build import app.myzel394.alibi.R +import app.myzel394.alibi.helpers.AudioRecorderExporter import com.arthenica.ffmpegkit.FFmpegKit import com.arthenica.ffmpegkit.ReturnCode import kotlinx.serialization.Serializable @@ -94,6 +96,7 @@ data class AudioRecorderSettings( val encoder: Int? = null, val showAllMicrophones: Boolean = false, val deleteRecordingsImmediately: Boolean = false, + val saveFolder: String? = null, ) { fun getOutputFormat(): Int { if (outputFormat != null) { @@ -161,6 +164,28 @@ data class AudioRecorderSettings( else MediaRecorder.AudioEncoder.AMR_NB + fun getSaveFolder(context: Context): File { + val defaultFolder = AudioRecorderExporter.getFolder(context) + + if (saveFolder == null) { + return defaultFolder + } + + runCatching { + return File(saveFolder!!).apply { + if (!AudioRecorderExporter.canFolderBeUsed(this)) { + throw SecurityException("Can't write to folder") + } + + if (!exists()) { + mkdirs() + } + } + } + + return defaultFolder + } + fun setIntervalDuration(duration: Long): AudioRecorderSettings { if (duration < 10 * 1000L || duration > 60 * 60 * 1000L) { throw Exception("Interval duration must be between 10 seconds and 1 hour") @@ -229,6 +254,10 @@ data class AudioRecorderSettings( return copy(deleteRecordingsImmediately = deleteRecordingsImmediately) } + fun setSaveFolder(saveFolder: String?): AudioRecorderSettings { + return copy(saveFolder = saveFolder) + } + fun isEncoderCompatible(encoder: Int): Boolean { if (outputFormat == null || outputFormat == MediaRecorder.OutputFormat.DEFAULT) { return true diff --git a/app/src/main/java/app/myzel394/alibi/helpers/AudioRecorderExporter.kt b/app/src/main/java/app/myzel394/alibi/helpers/AudioRecorderExporter.kt index 5c1d54c..c2f2fe8 100644 --- a/app/src/main/java/app/myzel394/alibi/helpers/AudioRecorderExporter.kt +++ b/app/src/main/java/app/myzel394/alibi/helpers/AudioRecorderExporter.kt @@ -114,5 +114,9 @@ data class AudioRecorderExporter( fun hasRecordingsAvailable(context: Context) = getFolder(context).listFiles()?.isNotEmpty() ?: false + + // Write required for saving the audio files + // Read required for concatenating the audio files + fun canFolderBeUsed(file: File) = file.canRead() && file.canWrite() } } \ No newline at end of file