CameraScreen: click on a page to open it in DocumentScreen

This commit is contained in:
Pierre-Yves Nicolas
2025-06-24 12:24:17 +02:00
parent ef2a49cf76
commit dcb48b8cc8
4 changed files with 36 additions and 24 deletions

View File

@@ -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),

View File

@@ -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()
}

View File

@@ -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 }
) },
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 <Capture>")
@@ -117,8 +122,8 @@ fun CameraScreen(
private fun CameraScreenContent(
modifier: Modifier,
cameraPreview: @Composable () -> Unit,
pageIds: List<String>,
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<String>,
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<String>,
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) {
)
}
},
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,
)
}
}

View File

@@ -77,6 +77,7 @@ import org.mydomain.myscan.ui.theme.MyScanTheme
@Composable
fun DocumentScreen(
pageIds: List<String>,
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)