From 3b4ba3f02792e0b90b441c6655a44e9b33f1a716 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:40:06 +0100 Subject: [PATCH] Improve UX feedback during export preparation --- .../app/ui/screens/export/ExportScreen.kt | 16 +++++++++++++++- .../app/ui/screens/export/ExportViewModel.kt | 5 +++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/export/ExportScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/export/ExportScreen.kt index c1eb900..58f2cfc 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/export/ExportScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/export/ExportScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.OpenInNew @@ -37,6 +38,7 @@ import androidx.compose.material.icons.filled.Download import androidx.compose.material.icons.filled.Share import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -208,7 +210,19 @@ private fun TextFieldAndPdfInfos( ) { if (uiState.isGenerating) { - Text(stringResource(R.string.creating_export), fontStyle = FontStyle.Italic) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + strokeWidth = 2.dp + ) + Text( + text = stringResource(R.string.creating_export), + fontStyle = FontStyle.Italic + ) + } } else if (result != null) { val context = LocalContext.current val formattedFileSize = formatFileSize(result.sizeInBytes, context) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/export/ExportViewModel.kt b/app/src/main/java/org/fairscan/app/ui/screens/export/ExportViewModel.kt index 386c46d..2bf3a0e 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/export/ExportViewModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/export/ExportViewModel.kt @@ -96,7 +96,7 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit preparationJob = viewModelScope.launch { val exportQuality = settingsRepository.exportQuality.first() exportFormat = settingsRepository.exportFormat.first() - _uiState.update { it.copy(format = exportFormat) } + _uiState.update { it.copy(format = exportFormat, isGenerating = true) } try { val t1 = System.currentTimeMillis() val result = if (exportFormat == ExportFormat.JPEG) { @@ -108,7 +108,8 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit it.copy(isGenerating = false, result = result) } val t2 = System.currentTimeMillis() - Log.i("Export", "Generation time: ${t2-t1} ms") + val pageCount = result.pageCount + Log.i("Export", "Generation: $pageCount pages, $exportQuality, ${t2-t1} ms") } catch (e: Exception) { val message = "Failed to prepare $exportFormat export" logger.e("FairScan", message, e)