diff --git a/app/src/main/java/org/fairscan/app/MainViewModel.kt b/app/src/main/java/org/fairscan/app/MainViewModel.kt index cf2c36c..65a4e2b 100644 --- a/app/src/main/java/org/fairscan/app/MainViewModel.kt +++ b/app/src/main/java/org/fairscan/app/MainViewModel.kt @@ -42,7 +42,6 @@ import org.fairscan.app.ui.screens.document.DocumentUiState import org.fairscan.app.ui.state.DocumentUiModel import org.fairscan.app.ui.state.PageThumbnail import org.fairscan.imageprocessing.ColorMode -import java.lang.IllegalStateException import kotlin.math.min @OptIn(ExperimentalCoroutinesApi::class) @@ -76,16 +75,17 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode ) private val _currentPageIndex = MutableStateFlow(0) - + private val _loadingPageId = MutableStateFlow(null) private val currentPageUiState: Flow = - combine(_currentPageIndex, _pages) { index, pages -> pages.getOrNull(index) } - .mapLatest { page -> + combine(_currentPageIndex, _pages, _loadingPageId) { index, pages, loadingId -> + val page = pages.getOrNull(index) + Pair(page, loadingId) + } + .mapLatest { (page,loadingId) -> page?.let { - CurrentPageUiState( - page.id, - imageRepository.jpegBytes(it.key())?.toBitmap(), - page.colorMode - ) + val isLoading = (it.id == loadingId) + val bitmap = imageRepository.jpegBytes(it.key())?.toBitmap() + CurrentPageUiState(it.id, bitmap, it.colorMode, isLoading) } } .flowOn(Dispatchers.IO) @@ -158,6 +158,7 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode viewModelScope.launch { val currentPage = currentPage() currentPage.colorMode?.let { + _loadingPageId.value = currentPage.id val newColorMode = if (it == ColorMode.COLOR) ColorMode.GRAYSCALE else ColorMode.COLOR val pages = withContext(Dispatchers.IO) { @@ -165,6 +166,7 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode imageRepository.pages() } _pages.value = pages + _loadingPageId.value = null } } } diff --git a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt index 994347e..5930fdf 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentScreen.kt @@ -41,6 +41,7 @@ import androidx.compose.material.icons.filled.RotateRight import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.Delete import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api @@ -181,6 +182,16 @@ private fun DocumentPreview( ) } } + if (uiState.currentPage?.isLoading ?: false) { + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.surface.copy(alpha = 0.4f)), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() + } + } uiState.currentPage?.colorMode?.let { ColorModeButton( currentColorMode = it, diff --git a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentUiState.kt b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentUiState.kt index 086633c..4d2e140 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentUiState.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/document/DocumentUiState.kt @@ -28,4 +28,5 @@ data class CurrentPageUiState( val id: String, val bitmap: Bitmap?, val colorMode: ColorMode?, + val isLoading: Boolean = false, )