From 31155275e84122b9b518244a372b44aa6f29e8b7 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:02:01 +0200 Subject: [PATCH] CameraScreen: cancel import when leaving the screen --- .../app/ui/screens/camera/CameraScreen.kt | 6 ++++++ .../app/ui/screens/camera/CameraViewModel.kt | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt index bc66037..2729668 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt @@ -176,6 +176,12 @@ fun CameraScreen( cameraViewModel.resetLiveAnalysis() } + DisposableEffect(Unit) { + onDispose { + cameraViewModel.cancelImport() + } + } + val listState = rememberLazyListState() LaunchedEffect(document.pageCount()) { if (!document.isEmpty()) { diff --git a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt index 4cd6dd4..9194ca9 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt @@ -21,6 +21,8 @@ import androidx.camera.core.ImageProxy import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -58,6 +60,7 @@ class CameraViewModel(appContainer: AppContainer): ViewModel() { private val _importState = MutableStateFlow(ImportState.Idle) val importState: StateFlow = _importState + private var importJob: Job? = null private val _isTorchEnabled = MutableStateFlow(false) val isTorchEnabled: StateFlow = _isTorchEnabled @@ -191,15 +194,19 @@ class CameraViewModel(appContainer: AppContainer): ViewModel() { } fun importPhotos(uris: List) { + importJob?.cancel() if (uris.isEmpty()) { _importState.value = ImportState.Idle return } - viewModelScope.launch { + importJob = viewModelScope.launch { _importState.value = ImportState.Importing(0, uris.size) uris.forEachIndexed { index, uri -> + ensureActive() val photoToImport = imageLoader.load(uri) + ensureActive() val page = processCapturedImage(photoToImport, 0) + ensureActive() page?.let { _events.emit(CameraEvent.ImageCaptured(it)) } @@ -213,6 +220,12 @@ class CameraViewModel(appContainer: AppContainer): ViewModel() { _importState.value = ImportState.Selecting resetLiveAnalysis() } + + fun cancelImport() { + importJob?.cancel() + importJob = null + _importState.value = ImportState.Idle + } } sealed class CaptureState {