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