Skip to content

Commit 402b25b

Browse files
committed
Avoid crashing when the selection of the export directory fails (#86)
1 parent d48d278 commit 402b25b

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

app/src/main/java/org/fairscan/app/MainActivity.kt

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
4949
import androidx.lifecycle.lifecycleScope
5050
import kotlinx.coroutines.Dispatchers
5151
import kotlinx.coroutines.launch
52+
import org.fairscan.app.data.FileLogger
5253
import org.fairscan.app.ui.Navigation
5354
import org.fairscan.app.ui.Screen
5455
import org.fairscan.app.ui.components.rememberCameraPermissionState
@@ -195,7 +196,7 @@ class MainActivity : ComponentActivity() {
195196
LibrariesScreen(onBack = navigation.back)
196197
}
197198
is Screen.Overlay.Settings -> {
198-
SettingsScreenWrapper(settingsViewModel, navigation)
199+
SettingsScreenWrapper(settingsViewModel, navigation, appContainer.logger)
199200
}
200201
}
201202
}
@@ -217,21 +218,39 @@ class MainActivity : ComponentActivity() {
217218
}
218219

219220
@Composable
220-
private fun SettingsScreenWrapper(settingsViewModel: SettingsViewModel, nav: Navigation) {
221+
private fun SettingsScreenWrapper(
222+
settingsViewModel: SettingsViewModel,
223+
nav: Navigation,
224+
logger: FileLogger,
225+
) {
221226
val launcher = rememberLauncherForActivityResult(
222227
contract = ActivityResultContracts.OpenDocumentTree()
223228
) { uri ->
224229
if (uri != null) {
225230
val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
226231
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
227-
contentResolver.takePersistableUriPermission(uri, flags)
228-
settingsViewModel.setExportDirUri(uri.toString())
232+
try {
233+
contentResolver.takePersistableUriPermission(uri, flags)
234+
settingsViewModel.setExportDirUri(uri.toString())
235+
} catch (e: Exception) {
236+
logger.e("Settings", "Failed to set export dir to $uri", e)
237+
val text = getString(R.string.error_file_picker_result)
238+
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
239+
}
229240
}
230241
}
231242
val settingsUiState by settingsViewModel.uiState.collectAsStateWithLifecycle()
232243
SettingsScreen(
233244
settingsUiState,
234-
onChooseDirectoryClick = { launcher.launch(null) },
245+
onChooseDirectoryClick = {
246+
try {
247+
launcher.launch(null)
248+
} catch (e: Exception) {
249+
val message = getString(R.string.error_file_picker_launch)
250+
logger.e("Settings", message, e)
251+
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
252+
}
253+
},
235254
onResetExportDirClick = { settingsViewModel.setExportDirUri(null) },
236255
onExportFormatChanged = { format -> settingsViewModel.setExportFormat(format) },
237256
onBack = nav.back,

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
<string name="download_dirname">Downloads</string>
2121
<string name="end_scan">End scan</string>
2222
<string name="error">Error: %1$s</string>
23+
<!-- Rare error messages should not be translated -->
24+
<string name="error_file_picker_launch" translatable="false">Failed to launch system file picker on this device</string>
25+
<string name="error_file_picker_result" translatable="false">Failed to set export directory</string>
2326
<string name="error_no_app">No app found to open this file</string>
2427
<string name="error_no_document">No document detected</string>
2528
<string name="error_save">Failed to save file</string>

0 commit comments

Comments
 (0)