From dcb48b8cc86b7041fc7a7d33507fc0b2bb3d6580 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Tue, 24 Jun 2025 12:24:17 +0200 Subject: [PATCH] CameraScreen: click on a page to open it in DocumentScreen --- .../java/org/mydomain/myscan/MainActivity.kt | 5 +- .../java/org/mydomain/myscan/Navigation.kt | 2 +- .../org/mydomain/myscan/view/CameraScreen.kt | 49 +++++++++++-------- .../mydomain/myscan/view/DocumentScreen.kt | 4 +- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/mydomain/myscan/MainActivity.kt b/app/src/main/java/org/mydomain/myscan/MainActivity.kt index e65e02e..33a341e 100644 --- a/app/src/main/java/org/mydomain/myscan/MainActivity.kt +++ b/app/src/main/java/org/mydomain/myscan/MainActivity.kt @@ -56,13 +56,13 @@ class MainActivity : ComponentActivity() { MyScanTheme { Column { - when (currentScreen) { + when (val screen = currentScreen) { is Screen.Camera -> { Scaffold { innerPadding-> CameraScreen( viewModel, liveAnalysisState, onImageAnalyzed = { image -> viewModel.liveAnalysis(image) }, - onFinalizePressed = { viewModel.navigateTo(Screen.FinalizeDocument) }, + onFinalizePressed = { viewModel.navigateTo(Screen.FinalizeDocument()) }, modifier = Modifier.padding(innerPadding) ) } @@ -70,6 +70,7 @@ class MainActivity : ComponentActivity() { is Screen.FinalizeDocument -> { DocumentScreen ( pageIds, + initialPage = screen.initialPage, imageLoader = { id -> viewModel.getBitmap(id) }, toCameraScreen = { viewModel.navigateTo(Screen.Camera) }, onSavePressed = savePdf(viewModel, context), diff --git a/app/src/main/java/org/mydomain/myscan/Navigation.kt b/app/src/main/java/org/mydomain/myscan/Navigation.kt index 6083405..1558024 100644 --- a/app/src/main/java/org/mydomain/myscan/Navigation.kt +++ b/app/src/main/java/org/mydomain/myscan/Navigation.kt @@ -16,5 +16,5 @@ package org.mydomain.myscan sealed class Screen { object Camera : Screen() - object FinalizeDocument : Screen() + data class FinalizeDocument(val initialPage: Int = 0) : Screen() } diff --git a/app/src/main/java/org/mydomain/myscan/view/CameraScreen.kt b/app/src/main/java/org/mydomain/myscan/view/CameraScreen.kt index 415d7e6..dec3ff9 100644 --- a/app/src/main/java/org/mydomain/myscan/view/CameraScreen.kt +++ b/app/src/main/java/org/mydomain/myscan/view/CameraScreen.kt @@ -64,6 +64,7 @@ import kotlinx.coroutines.delay import org.mydomain.myscan.LiveAnalysisState import org.mydomain.myscan.MainViewModel import org.mydomain.myscan.MainViewModel.CaptureState +import org.mydomain.myscan.Screen import org.mydomain.myscan.ui.theme.MyScanTheme @Composable @@ -98,8 +99,12 @@ fun CameraScreen( captureController = captureController, onPreviewViewReady = { view -> previewView = view } ) }, - pageIds = pageIds, - imageLoader = { id -> viewModel.getBitmap(id) }, + pageList = { CameraCapturedPagesRow( + pageIds = pageIds, + imageLoader = { id -> viewModel.getBitmap(id) }, + onPageClick = { index -> viewModel.navigateTo(Screen.FinalizeDocument(index)) } + ) }, + pageCount = pageIds.size, liveAnalysisState = liveAnalysisState, onCapture = { Log.i("MyScan", "Pressed ") @@ -117,8 +122,8 @@ fun CameraScreen( private fun CameraScreenContent( modifier: Modifier, cameraPreview: @Composable () -> Unit, - pageIds: List, - imageLoader: (String) -> Bitmap?, + pageList: @Composable () -> Unit, + pageCount: Int, liveAnalysisState: LiveAnalysisState, onCapture: () -> Unit, onFinalizePressed: () -> Unit, @@ -136,8 +141,8 @@ private fun CameraScreenContent( .padding(16.dp) ) CameraScreenFooter( - pageIds = pageIds, - imageLoader = imageLoader, + pageList = pageList, + pageCount = pageCount, onFinalizePressed = onFinalizePressed, modifier = Modifier, ) @@ -224,12 +229,11 @@ fun MessageBox(inferenceTime: Long) { @Composable fun CameraScreenFooter( - pageIds: List, - imageLoader: (String) -> Bitmap?, + pageList: @Composable () -> Unit, + pageCount: Int, onFinalizePressed: () -> Unit, modifier: Modifier, ) { - val pageCount = pageIds.size Surface ( color = MaterialTheme.colorScheme.inverseOnSurface, tonalElevation = 4.dp, @@ -238,10 +242,7 @@ fun CameraScreenFooter( .height(180.dp) ) { Column { - CameraCapturedPagesRow( - pageIds = pageIds, - imageLoader = imageLoader - ) + pageList() Row ( modifier = Modifier .padding(horizontal = 16.dp, vertical = 8.dp) @@ -268,7 +269,8 @@ fun CameraScreenFooter( @Composable fun CameraCapturedPagesRow( pageIds: List, - imageLoader: (String) -> Bitmap? + imageLoader: (String) -> Bitmap?, + onPageClick: (Int) -> Unit, ) { if (pageIds.isEmpty()) return @@ -292,6 +294,7 @@ fun CameraCapturedPagesRow( bitmap = bitmap, contentDescription = "Page ${index + 1}", modifier = modifier + .clickable { onPageClick(index) } .clip(RoundedCornerShape(4.dp)) ) } @@ -332,16 +335,22 @@ private fun ScreenPreview(captureState: CaptureState) { ) } }, - pageIds = listOf(1, 2, 2, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it.jpg" }, - imageLoader = { id -> - context.assets.open(id).use { input -> - BitmapFactory.decodeStream(input) - } + pageList = { + CameraCapturedPagesRow( + pageIds = listOf(1, 2, 2, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it.jpg" }, + imageLoader = { id -> + context.assets.open(id).use { input -> + BitmapFactory.decodeStream(input) + } + }, + onPageClick = {} + ) }, + pageCount = 4, liveAnalysisState = LiveAnalysisState(), onCapture = {}, onFinalizePressed = {}, - captureState = captureState + captureState = captureState, ) } } diff --git a/app/src/main/java/org/mydomain/myscan/view/DocumentScreen.kt b/app/src/main/java/org/mydomain/myscan/view/DocumentScreen.kt index b7d3084..8c6c6a7 100644 --- a/app/src/main/java/org/mydomain/myscan/view/DocumentScreen.kt +++ b/app/src/main/java/org/mydomain/myscan/view/DocumentScreen.kt @@ -77,6 +77,7 @@ import org.mydomain.myscan.ui.theme.MyScanTheme @Composable fun DocumentScreen( pageIds: List, + initialPage: Int, imageLoader: (String) -> Bitmap?, toCameraScreen: () -> Unit, onSavePressed: () -> Unit, @@ -86,7 +87,7 @@ fun DocumentScreen( ) { // TODO Check how often images are loaded var showDialog = rememberSaveable { mutableStateOf(false) } - val currentPageIndex = rememberSaveable { mutableIntStateOf(0) } + val currentPageIndex = rememberSaveable { mutableIntStateOf(initialPage) } if (currentPageIndex.intValue >= pageIds.size) { currentPageIndex.intValue = pageIds.size - 1 } @@ -280,6 +281,7 @@ fun DocumentScreenPreview() { MyScanTheme { DocumentScreen( pageIds = listOf(1, 2, 2, 2).map { "gallica.bnf.fr-bpt6k5530456s-$it.jpg" }, + initialPage = 1, imageLoader = { id -> context.assets.open(id).use { input -> BitmapFactory.decodeStream(input)