Specific message when no permission for export dir (#105)

This commit is contained in:
Pierre-Yves Nicolas
2026-01-28 20:36:41 +01:00
parent 0edd0f3748
commit 07753427e4
12 changed files with 31 additions and 2 deletions

View File

@@ -39,6 +39,7 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.fairscan.app.AppContainer
import org.fairscan.app.R
import org.fairscan.app.RecentDocument
import org.fairscan.app.data.FileManager
import org.fairscan.app.data.ImageRepository
@@ -194,6 +195,12 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit
viewModelScope.launch {
try {
save(context)
} catch (e: MissingExportDirPermissionException) {
logger.e("FairScan", "Missing export dir permission", e)
_uiState.update {
it.copy(errorMessage =
context.getString(R.string.error_export_dir_permission_lost))
}
} catch (e: Exception) {
logger.e("FairScan", "Failed to save PDF", e)
_events.emit(ExportEvent.SaveError)
@@ -223,6 +230,11 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit
}
} else {
// Use Storage Access Framework to save to the chosen directory
if (!context.contentResolver.persistedUriPermissions.any { perm ->
perm.uri == exportDir && perm.isWritePermission
}) {
throw MissingExportDirPermissionException(exportDir)
}
val safFile = saveViaSaf(context, file, exportDir, exportFormat)
SavedItem(safFile.uri, safFile.name ?: file.name, exportFormat)
}
@@ -373,3 +385,9 @@ data class ExportActions(
val save: () -> Unit,
val open: (SavedItem) -> Unit,
)
class MissingExportDirPermissionException(
val uri: Uri
) : IllegalStateException(
"Missing persisted write permission for export dir: $uri"
)

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">stažených</string>
<string name="end_scan">Ukončit skenování</string>
<string name="error">Chyba: %1$s</string>
<string name="error_export_dir_permission_lost">Vybraná složka pro export již není dostupná. Vyberte prosím jinou složku.</string>
<string name="error_no_app">Nebyla nalezena žádná aplikace pro otevření tohoto souboru</string>
<string name="error_no_document">Nebyl rozpoznán žádná dokument</string>
<string name="error_save">Soubor se nepodařilo uložit</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Downloads</string>
<string name="end_scan">Scan beenden</string>
<string name="error">Fehler: %1$s</string>
<string name="error_export_dir_permission_lost">Der ausgewählte Exportordner ist nicht mehr zugänglich. Bitte wählen Sie einen anderen Ordner.</string>
<string name="error_no_app">Keine App zum Öffnen dieser Datei gefunden</string>
<string name="error_no_document">Kein Dokument erkannt</string>
<string name="error_save">Datei konnte nicht gespeichert werden</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Descargas</string>
<string name="end_scan">Finalizar escaneo</string>
<string name="error">Error: %1$s</string>
<string name="error_export_dir_permission_lost">La carpeta de exportación seleccionada ya no es accesible. Por favor, elija otra carpeta.</string>
<string name="error_no_app">No se encontró ninguna aplicación para abrir este archivo</string>
<string name="error_no_document">No se detectó ningún documento</string>
<string name="error_save">No se pudo guardar el archivo</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Téléchargements</string>
<string name="end_scan">Terminer le scan</string>
<string name="error">Erreur : %1$s</string>
<string name="error_export_dir_permission_lost">Le dossier dexport sélectionné nest plus accessible. Veuillez choisir un autre dossier.</string>
<string name="error_no_app">Aucune application trouvée pour ouvrir ce fichier</string>
<string name="error_no_document">Aucun document détecté</string>
<string name="error_save">Échec de l\'enregistrement du fichier</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Download</string>
<string name="end_scan">Termina scansione</string>
<string name="error">Errore: %1$s</string>
<string name="error_export_dir_permission_lost">La cartella di esportazione selezionata non è più accessibile. Scegli unaltra cartella.</string>
<string name="error_no_app">Nessuna app trovata per aprire questo file</string>
<string name="error_no_document">Nessun documento rilevato</string>
<string name="error_save">Impossibile salvare il file</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Downloads</string>
<string name="end_scan">Finalizar digitalização</string>
<string name="error">Erro: %1$s</string>
<string name="error_export_dir_permission_lost">A pasta de exportação selecionada não está mais acessível. Escolha outra pasta.</string>
<string name="error_no_app">Nenhum app encontrado para abrir este arquivo</string>
<string name="error_no_document">Nenhum documento detectado</string>
<string name="error_save">Falha ao salvar o arquivo</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">Download</string>
<string name="end_scan">Закончить</string>
<string name="error">Ошибка: %1$s</string>
<string name="error_export_dir_permission_lost">Выбранная папка экспорта больше недоступна. Пожалуйста, выберите другую папку.</string>
<string name="error_no_app">Не найдено приложение для открытия этого файла</string>
<string name="error_no_document">Документ не обнаружен</string>
<string name="error_save">Не удалось сохранить файл</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">İndirilenler</string>
<string name="end_scan">Taramayı bitir</string>
<string name="error">Error: %1$s</string>
<string name="error_export_dir_permission_lost">Seçilen dışa aktarma dizini artık erişilebilir değil. Lütfen başka bir dizin seçin.</string>
<string name="error_no_app">No app found to open this file</string>
<string name="error_no_document">No document detected</string>
<string name="error_save">Failed to save file</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">下載 (Downloads)</string>
<string name="end_scan">結束掃描</string>
<string name="error">錯誤:%1$s</string>
<string name="error_export_dir_permission_lost">所選的匯出目錄已無法存取。請選擇其他目錄。</string>
<string name="error_no_app">找不到可開啟此檔案的應用程式</string>
<string name="error_no_document">未偵測到文件</string>
<string name="error_save">儲存檔案失敗</string>

View File

@@ -19,6 +19,7 @@
<string name="download_dirname">下载</string>
<string name="end_scan">结束扫描</string>
<string name="error">错误: %1$s</string>
<string name="error_export_dir_permission_lost">所选的导出目录已无法访问。请选择其他目录。</string>
<string name="error_no_app">未找到可打开此文件的应用</string>
<string name="error_no_document">未检测到任何文档</string>
<string name="error_save">无法保存文件</string>

View File

@@ -7,7 +7,7 @@
<string name="camera_permission_denied">Camera permission was denied</string>
<string name="camera_permission_rationale">The app requires camera access to scan documents. Captured images are stored only on this device and will be deleted when you close the current document.</string>
<string name="cancel">Cancel</string>
<string name="change_directory">Change directory</string>
<string name="change_directory">Change folder</string>
<string name="clear_text">Clear text</string>
<string name="contact">Contact</string>
<string name="copied_logs">Logs copied to clipboard</string>
@@ -20,6 +20,7 @@
<string name="download_dirname">Downloads</string>
<string name="end_scan">End scan</string>
<string name="error">Error: %1$s</string>
<string name="error_export_dir_permission_lost">The selected export folder is no longer accessible. Please choose another folder.</string>
<!-- Rare error messages should not be translated -->
<string name="error_file_picker_launch" translatable="false">Failed to launch system file picker on this device</string>
<string name="error_file_picker_result" translatable="false">Failed to set export directory</string>
@@ -28,7 +29,7 @@
<string name="error_save">Failed to save file</string>
<string name="export">Export</string>
<string name="export_as">Export as %1$s</string>
<string name="export_directory">Export directory</string>
<string name="export_directory">Export folder</string>
<string name="export_format">Export format</string>
<string name="export_quality">Export quality</string>
<string name="export_quality_low">Low</string>