diff --git a/app/src/main/java/org/fairscan/app/MainActivity.kt b/app/src/main/java/org/fairscan/app/MainActivity.kt index 3c21a09..406fc60 100644 --- a/app/src/main/java/org/fairscan/app/MainActivity.kt +++ b/app/src/main/java/org/fairscan/app/MainActivity.kt @@ -248,6 +248,9 @@ class MainActivity : ComponentActivity() { } } val settingsUiState by settingsViewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + settingsViewModel.refreshExportDirName() + } SettingsScreen( settingsUiState, onChooseDirectoryClick = { diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt index 3158298..c6442f4 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt @@ -37,10 +37,8 @@ class SettingsRepository(private val context: Context) { prefs[EXPORT_DIR_URI] } - val exportDirName: Flow = exportDirUri.map { uriString -> - uriString?.let { - DocumentFile.fromTreeUri(context, it.toUri())?.name - } + fun resolveExportDirName(uri: String): String? { + return DocumentFile.fromTreeUri(context, uri.toUri())?.name } val exportFormat: Flow = diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt index 17317b2..f1342d0 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt @@ -14,8 +14,6 @@ */ package org.fairscan.app.ui.screens.settings - -import android.content.Context import androidx.activity.compose.BackHandler import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable @@ -41,14 +39,12 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.core.net.toUri import org.fairscan.app.R import org.fairscan.app.domain.ExportQuality import org.fairscan.app.ui.components.BackButton @@ -92,7 +88,20 @@ private fun SettingsContent( onExportQualityChanged: (ExportQuality) -> Unit, modifier: Modifier = Modifier, ) { - val folderName = uiState.exportDirName ?: stringResource(R.string.download_dirname) + println(uiState) + val (folderLabel, folderLabelColor) = when { + uiState.exportDirUri == null -> + stringResource(R.string.download_dirname) to + MaterialTheme.colorScheme.onSurface + + uiState.exportDirName != null -> + uiState.exportDirName to + MaterialTheme.colorScheme.onSurface + + else -> + stringResource(R.string.export_folder_permission_lost) to + MaterialTheme.colorScheme.error + } Column( modifier @@ -102,13 +111,14 @@ private fun SettingsContent( ) { DirectorySettingItem( label = stringResource(R.string.export_directory), - folderName = folderName, - onClick = onChooseDirectoryClick + folderLabel, + folderLabelColor, + onClick = onChooseDirectoryClick, ) Spacer(Modifier.height(12.dp)) - if (uiState.exportDirName != null) { + if (uiState.exportDirUri != null) { OutlinedButton( onClick = onResetExportDirClick, border = BorderStroke(1.dp, MaterialTheme.colorScheme.primary), @@ -156,9 +166,11 @@ private fun SettingsContent( @Composable fun DirectorySettingItem( label: String, - folderName: String, + folderLabel: String, + folderLabelColor: Color, onClick: () -> Unit, -) { + + ) { Column { Text( text = label, @@ -181,8 +193,9 @@ fun DirectorySettingItem( verticalAlignment = Alignment.CenterVertically ) { Text( - text = folderName, - style = MaterialTheme.typography.bodyLarge + text = folderLabel, + style = MaterialTheme.typography.bodyLarge, + color = folderLabelColor, ) Icon( diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt index ea4577b..9287841 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt @@ -16,14 +16,18 @@ package org.fairscan.app.ui.screens.settings import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import org.fairscan.app.AppContainer import org.fairscan.app.domain.ExportQuality data class SettingsUiState( + val exportDirUri: String? = null, val exportDirName: String? = null, val exportFormat: ExportFormat = ExportFormat.PDF, val exportQuality: ExportQuality = ExportQuality.BALANCED, @@ -33,13 +37,18 @@ class SettingsViewModel(container: AppContainer) : ViewModel() { private val repo = container.settingsRepository + private val _dirName = MutableStateFlow(null) + val dirName: StateFlow = _dirName + val uiState = combine( - repo.exportDirName, + repo.exportDirUri, + dirName, repo.exportFormat, repo.exportQuality, - ) { dir, format, quality -> + ) { uri, name, format, quality -> SettingsUiState( - exportDirName = dir, + exportDirUri = uri, + exportDirName = name, exportFormat = format, exportQuality = quality, ) @@ -52,6 +61,7 @@ class SettingsViewModel(container: AppContainer) : ViewModel() { fun setExportDirUri(uri: String?) { viewModelScope.launch { repo.setExportDirUri(uri) + refreshExportDirName() } } @@ -66,4 +76,11 @@ class SettingsViewModel(container: AppContainer) : ViewModel() { repo.setExportQuality(quality) } } + + fun refreshExportDirName() { + viewModelScope.launch { + val uri = repo.exportDirUri.first() + _dirName.value = uri?.let { repo.resolveExportDirName(it) } + } + } } diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1895a93..eb5f441 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -28,6 +28,7 @@ Exportovat Exportovat jako %1$s Složka pro export + Ztracený přístup ke složce Formát exportu Kvalita exportu Nízká diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e80b051..6f71325 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -28,6 +28,7 @@ Exportieren Als %1$s exportieren Exportordner + Zugriff auf Ordner verloren Exportformat Exportqualität Niedrig diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 579e51b..746727a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -28,6 +28,7 @@ Exportar Exportar como %1$s Carpeta de exportación + Acceso a la carpeta perdido Formato de exportación Calidad de exportación Baja diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 69147a0..7cd9dff 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -28,6 +28,7 @@ Exporter Exporter en %1$s Dossier d’export + Accès au dossier perdu Format d’export Qualité d’export Basse diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5be54b5..0c52783 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -28,6 +28,7 @@ Esporta Esporta come %1$s Cartella di esportazione + Accesso alla cartella perso Formato di esportazione Qualità di esportazione Bassa diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 59eafc0..d55e05c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -28,6 +28,7 @@ Exportar Exportar como %1$s Diretório de exportação + Acesso à pasta perdido Formato de exportação Qualidade de exportação Baixa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2431668..8346b4c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -28,6 +28,7 @@ Экспорт Экспортировать как %1$s Папка экспорта + Доступ к папке потерян Формат экспорта Качество экспорта Низкое diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cc90d1e..8dc10ba 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -28,6 +28,7 @@ Dışa aktar %1$s olarak dışa aktar Dışa aktarma dizini + Klasör erişimi kaybedildi Dışa aktarma biçimi Dışa aktarma kalitesi Düşük diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0095ab9..6615c1c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -28,6 +28,7 @@ 匯出 匯出為 %1$s 匯出目錄 + 資料夾存取權限已遺失 匯出格式 匯出品質 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 94ad3e4..67208ee 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -28,6 +28,7 @@ 导出 导出为 %1$s 导出目录 + 文件夹访问权限已丢失 导出格式 导出质量 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 12218d4..3b34680 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,6 +32,7 @@ Export Export as %1$s Export folder + Folder access lost Export format Export quality Low