CameraScreen: click on a page to open it in DocumentScreen
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 <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) {
|
||||
)
|
||||
}
|
||||
},
|
||||
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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user