From 29d4e5a86a543810fd78ca7a3b137ad12bfcd72c Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Mon, 1 Jan 2024 14:53:42 +0100 Subject: [PATCH] feat: Add doctor; Add check for file saver dialog --- .../java/app/myzel394/alibi/helpers/Doctor.kt | 14 +++++ .../alibi/services/AudioRecorderService.kt | 7 +-- .../alibi/services/IntervalRecorderService.kt | 3 +- .../alibi/services/VideoRecorderService.kt | 2 +- .../myzel394/alibi/ui/LockedAppHandlers.kt | 52 +++++++++++++++++++ .../Tiles/VideoRecorderQualityTile.kt | 1 + .../alibi/ui/models/VideoRecorderModel.kt | 1 + .../alibi/ui/screens/RecorderScreen.kt | 1 - app/src/main/res/values/strings.xml | 2 + 9 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/app/myzel394/alibi/helpers/Doctor.kt diff --git a/app/src/main/java/app/myzel394/alibi/helpers/Doctor.kt b/app/src/main/java/app/myzel394/alibi/helpers/Doctor.kt new file mode 100644 index 0000000..e61920a --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/helpers/Doctor.kt @@ -0,0 +1,14 @@ +package app.myzel394.alibi.helpers + +import android.content.Context +import android.content.Intent + +data class Doctor( + val context: Context +) { + fun checkIfFileSaverDialogIsAvailable(): Boolean { + val fileSaver = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + + return fileSaver.resolveActivity(context.packageManager) != null + } +} \ No newline at end of file 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 b82b4bd..604ec98 100644 --- a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt @@ -231,9 +231,10 @@ class AudioRecorderService : // ==== Microphone related ==== private fun resetRecorder() { runCatching { - recorder?.let { - it.stop() - it.release() + recorder?.apply { + stop() + reset() + release() } clearAudioDevice() batchesFolder.cleanup() 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 a1daed6..ed8f9c7 100644 --- a/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/IntervalRecorderService.kt @@ -40,9 +40,10 @@ abstract class IntervalRecorderService : override fun start() { super.start() + batchesFolder.initFolders() + if (!batchesFolder.checkIfFolderIsAccessible()) { - // TODO: Add handler onBatchesFolderNotAccessible() } diff --git a/app/src/main/java/app/myzel394/alibi/services/VideoRecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/VideoRecorderService.kt index 0ca1659..d9f50a2 100644 --- a/app/src/main/java/app/myzel394/alibi/services/VideoRecorderService.kt +++ b/app/src/main/java/app/myzel394/alibi/services/VideoRecorderService.kt @@ -305,7 +305,7 @@ class VideoRecorderService : } class CameraControl( - private val camera: Camera, + val camera: Camera ) { fun enableTorch() { camera.cameraControl.enableTorch(true) diff --git a/app/src/main/java/app/myzel394/alibi/ui/LockedAppHandlers.kt b/app/src/main/java/app/myzel394/alibi/ui/LockedAppHandlers.kt index 5db781c..663c92d 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/LockedAppHandlers.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/LockedAppHandlers.kt @@ -1,12 +1,25 @@ package app.myzel394.alibi.ui import androidx.appcompat.app.AppCompatDelegate +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Error +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import app.myzel394.alibi.R import app.myzel394.alibi.dataStore import app.myzel394.alibi.db.AppSettings +import app.myzel394.alibi.helpers.Doctor // Handlers that can safely be run when the app is locked (biometric authentication required) @Composable @@ -29,4 +42,43 @@ fun LockedAppHandlers() { } } } + + var showFileSaverUnavailableDialog by remember { mutableStateOf(false) } + + LaunchedEffect(Unit) { + val doctor = Doctor(context) + + if (!doctor.checkIfFileSaverDialogIsAvailable()) { + showFileSaverUnavailableDialog = true + } + } + + if (showFileSaverUnavailableDialog) { + AlertDialog( + icon = { + Icon( + Icons.Default.Error, + contentDescription = null + ) + }, + onDismissRequest = { + showFileSaverUnavailableDialog = false + }, + title = { + Text(stringResource(R.string.ui_severeError_fileSaverUnavailable_title)) + }, + text = { + Text(stringResource(R.string.ui_severeError_fileSaverUnavailable_text)) + }, + confirmButton = { + TextButton( + onClick = { + showFileSaverUnavailableDialog = false + } + ) { + Text(text = stringResource(R.string.dialog_close_neutral_label)) + } + } + ) + } } \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/Tiles/VideoRecorderQualityTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/Tiles/VideoRecorderQualityTile.kt index f872d05..baa8c86 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/Tiles/VideoRecorderQualityTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/Tiles/VideoRecorderQualityTile.kt @@ -2,6 +2,7 @@ package app.myzel394.alibi.ui.components.SettingsScreen.Tiles import android.media.MediaRecorder import androidx.camera.video.Quality +import androidx.camera.video.Recorder import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.HighQuality import androidx.compose.material3.Button 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 be787f8..55ffbe2 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 @@ -13,6 +13,7 @@ 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.Doctor import app.myzel394.alibi.helpers.VideoBatchesFolder import app.myzel394.alibi.services.VideoRecorderService import app.myzel394.alibi.ui.RECORDER_MEDIA_SELECTED_VALUE diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/RecorderScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/RecorderScreen.kt index cb5d969..977b04d 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/RecorderScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/RecorderScreen.kt @@ -30,7 +30,6 @@ import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.RecordingInformation import app.myzel394.alibi.ui.components.RecorderScreen.organisms.RecorderEventsHandler import app.myzel394.alibi.ui.components.RecorderScreen.organisms.VideoRecordingStatus -import app.myzel394.alibi.ui.effects.rememberSettings import app.myzel394.alibi.ui.models.AudioRecorderModel import app.myzel394.alibi.ui.models.VideoRecorderModel diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1372b63..fce7f8c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -177,4 +177,6 @@ To access the DCIM folder, you need to grant Alibi the permission to access external storage. Alibi will only use this permission to write your recordings to the DCIM folder. Grant permission Alibi couldn\'t access or write to the batches folder. Try to choose a different folder or use the internal storage instead. The recording has been aborted. + File Manager app not found + Alibi couldn\'t find a file manager app on your phone. Please install a file manager app and try again. If this message still appears, you can try using a custom batches folder in the advanced settings section. Alibi may not fully work on your device. \ No newline at end of file