From 402b25b791976606d649ce05561d5ae2aebc450b Mon Sep 17 00:00:00 2001
From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com>
Date: Mon, 5 Jan 2026 20:53:35 +0100
Subject: [PATCH] Avoid crashing when the selection of the export directory
fails (#86)
---
.../java/org/fairscan/app/MainActivity.kt | 29 +++++++++++++++----
app/src/main/res/values/strings.xml | 3 ++
2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/app/src/main/java/org/fairscan/app/MainActivity.kt b/app/src/main/java/org/fairscan/app/MainActivity.kt
index 0ae44af..57314df 100644
--- a/app/src/main/java/org/fairscan/app/MainActivity.kt
+++ b/app/src/main/java/org/fairscan/app/MainActivity.kt
@@ -49,6 +49,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
+import org.fairscan.app.data.FileLogger
import org.fairscan.app.ui.Navigation
import org.fairscan.app.ui.Screen
import org.fairscan.app.ui.components.rememberCameraPermissionState
@@ -195,7 +196,7 @@ class MainActivity : ComponentActivity() {
LibrariesScreen(onBack = navigation.back)
}
is Screen.Overlay.Settings -> {
- SettingsScreenWrapper(settingsViewModel, navigation)
+ SettingsScreenWrapper(settingsViewModel, navigation, appContainer.logger)
}
}
}
@@ -217,21 +218,39 @@ class MainActivity : ComponentActivity() {
}
@Composable
- private fun SettingsScreenWrapper(settingsViewModel: SettingsViewModel, nav: Navigation) {
+ private fun SettingsScreenWrapper(
+ settingsViewModel: SettingsViewModel,
+ nav: Navigation,
+ logger: FileLogger,
+ ) {
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.OpenDocumentTree()
) { uri ->
if (uri != null) {
val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
- contentResolver.takePersistableUriPermission(uri, flags)
- settingsViewModel.setExportDirUri(uri.toString())
+ try {
+ contentResolver.takePersistableUriPermission(uri, flags)
+ settingsViewModel.setExportDirUri(uri.toString())
+ } catch (e: Exception) {
+ logger.e("Settings", "Failed to set export dir to $uri", e)
+ val text = getString(R.string.error_file_picker_result)
+ Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
+ }
}
}
val settingsUiState by settingsViewModel.uiState.collectAsStateWithLifecycle()
SettingsScreen(
settingsUiState,
- onChooseDirectoryClick = { launcher.launch(null) },
+ onChooseDirectoryClick = {
+ try {
+ launcher.launch(null)
+ } catch (e: Exception) {
+ val message = getString(R.string.error_file_picker_launch)
+ logger.e("Settings", message, e)
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+ }
+ },
onResetExportDirClick = { settingsViewModel.setExportDirUri(null) },
onExportFormatChanged = { format -> settingsViewModel.setExportFormat(format) },
onBack = nav.back,
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4d9306d..cf22aca 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,6 +20,9 @@
Downloads
End scan
Error: %1$s
+
+ Failed to launch system file picker on this device
+ Failed to set export directory
No app found to open this file
No document detected
Failed to save file