From 0b9bb48fdc444536f4b79cf2ae8faa646d448be7 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:46:52 +0200 Subject: [PATCH] fix: Properly save concatenated files --- .../locationtest/services/RecorderService.kt | 14 ++++++++++---- .../AudioRecorder/atoms/RecordingStatus.kt | 3 ++- .../locationtest/ui/screens/AudioRecorder.kt | 6 ++++-- .../app/myzel394/locationtest/ui/utils/file.kt | 16 +++++++++++----- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/app/myzel394/locationtest/services/RecorderService.kt b/app/src/main/java/app/myzel394/locationtest/services/RecorderService.kt index d35f9af..7e5d569 100644 --- a/app/src/main/java/app/myzel394/locationtest/services/RecorderService.kt +++ b/app/src/main/java/app/myzel394/locationtest/services/RecorderService.kt @@ -30,6 +30,7 @@ import java.io.File import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter +import java.time.format.DateTimeFormatter.ISO_DATE_TIME import java.util.Date import java.util.UUID @@ -100,10 +101,15 @@ class RecorderService: Service() { fun concatenateFiles(forceConcatenation: Boolean = false): File { val paths = filePaths.joinToString("|") - val outputFile = "$fileFolder/${recordingStart!!.format(DateTimeFormatter.ISO_DATE_TIME)}.${settings.fileExtension}" + val fileName = recordingStart!! + .format(DateTimeFormatter.ISO_DATE_TIME) + .toString() + .replace(":", "-") + .replace(".", "_") + val outputFile = File("$fileFolder/$fileName.${settings.fileExtension}") - if (File(outputFile).exists() && !forceConcatenation) { - return File(outputFile) + if (outputFile.exists() && !forceConcatenation) { + return outputFile } val command = "-i \"concat:$paths\" -acodec copy $outputFile" @@ -124,7 +130,7 @@ class RecorderService: Service() { throw Exception("Failed to concatenate audios") } - return File(outputFile) + return outputFile } private fun updateAmplitude() { diff --git a/app/src/main/java/app/myzel394/locationtest/ui/components/AudioRecorder/atoms/RecordingStatus.kt b/app/src/main/java/app/myzel394/locationtest/ui/components/AudioRecorder/atoms/RecordingStatus.kt index 914d52c..36ce0aa 100644 --- a/app/src/main/java/app/myzel394/locationtest/ui/components/AudioRecorder/atoms/RecordingStatus.kt +++ b/app/src/main/java/app/myzel394/locationtest/ui/components/AudioRecorder/atoms/RecordingStatus.kt @@ -44,6 +44,7 @@ import app.myzel394.locationtest.ui.components.atoms.Pulsating import app.myzel394.locationtest.ui.utils.formatDuration import app.myzel394.locationtest.ui.utils.rememberFileSaverDialog import kotlinx.coroutines.delay +import java.io.File import java.time.Duration import java.time.LocalDateTime import java.time.ZoneId @@ -51,9 +52,9 @@ import java.time.ZoneId @Composable fun RecordingStatus( service: RecorderService, + saveFile: (File) -> Unit, ) { val context = LocalContext.current - val saveFile = rememberFileSaverDialog("audio/*") var now by remember { mutableStateOf(LocalDateTime.now()) } diff --git a/app/src/main/java/app/myzel394/locationtest/ui/screens/AudioRecorder.kt b/app/src/main/java/app/myzel394/locationtest/ui/screens/AudioRecorder.kt index 0c87f76..af60398 100644 --- a/app/src/main/java/app/myzel394/locationtest/ui/screens/AudioRecorder.kt +++ b/app/src/main/java/app/myzel394/locationtest/ui/screens/AudioRecorder.kt @@ -45,6 +45,7 @@ import app.myzel394.locationtest.services.RecorderService import app.myzel394.locationtest.ui.components.AudioRecorder.atoms.RecordingStatus import app.myzel394.locationtest.ui.components.AudioRecorder.atoms.StartRecording import app.myzel394.locationtest.ui.enums.Screen +import app.myzel394.locationtest.ui.utils.rememberFileSaverDialog @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -53,6 +54,7 @@ fun AudioRecorder( ) { val context = LocalContext.current + val saveFile = rememberFileSaverDialog("audio/aac") var service by remember { mutableStateOf(null) } val connection = remember { object : ServiceConnection { @@ -78,7 +80,7 @@ fun AudioRecorder( topBar = { TopAppBar( title = { - Text(text = "Audio Recorder") + Text("Alibi") }, actions = { IconButton( @@ -101,7 +103,7 @@ fun AudioRecorder( .padding(padding), ) { if (isRecording && service != null) - RecordingStatus(service = service!!) + RecordingStatus(service = service!!, saveFile = saveFile) else StartRecording(connection = connection, service = service) } diff --git a/app/src/main/java/app/myzel394/locationtest/ui/utils/file.kt b/app/src/main/java/app/myzel394/locationtest/ui/utils/file.kt index 3502e59..b6759ac 100644 --- a/app/src/main/java/app/myzel394/locationtest/ui/utils/file.kt +++ b/app/src/main/java/app/myzel394/locationtest/ui/utils/file.kt @@ -3,6 +3,8 @@ package app.myzel394.locationtest.ui.utils import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import java.io.File @@ -10,22 +12,26 @@ import java.io.File fun rememberFileSaverDialog(mimeType: String): ((File) -> Unit) { val context = LocalContext.current - var file: File? = null + var file = remember { mutableStateOf(null) } - val launcher = rememberLauncherForActivityResult(contract = ActivityResultContracts.CreateDocument(mimeType)) { + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument(mimeType)) { + println("file") + println(file) it?.let { context.contentResolver.openOutputStream(it)?.use { outputStream -> - file!!.inputStream().use { inputStream -> + file.value!!.inputStream().use { inputStream -> inputStream.copyTo(outputStream) } } } - file = null + file.value = null } return { - file = it + println("eich") + println(it) + file.value = it launcher.launch(it.name) } }