Refactoring: move Scaffold into CameraScreen

This commit is contained in:
Pierre-Yves Nicolas
2025-06-24 15:05:15 +02:00
parent 1159b77c6e
commit 46e84da804
2 changed files with 58 additions and 65 deletions

View File

@@ -26,10 +26,7 @@ import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.FileProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -54,35 +51,32 @@ class MainActivity : ComponentActivity() {
val pageIds by viewModel.pageIds.collectAsStateWithLifecycle()
val context = LocalContext.current
MyScanTheme {
Column {
when (val screen = currentScreen) {
is Screen.Camera -> {
Scaffold { innerPadding->
CameraScreen(
viewModel, liveAnalysisState,
onImageAnalyzed = { image -> viewModel.liveAnalysis(image) },
onFinalizePressed = { viewModel.navigateTo(Screen.FinalizeDocument()) },
modifier = Modifier.padding(innerPadding)
)
}
}
is Screen.FinalizeDocument -> {
DocumentScreen (
pageIds,
initialPage = screen.initialPage,
imageLoader = { id -> viewModel.getBitmap(id) },
toCameraScreen = { viewModel.navigateTo(Screen.Camera) },
onSavePressed = savePdf(viewModel, context),
onSharePressed = sharePdf(viewModel, context),
onStartNew = {
viewModel.startNewDocument()
viewModel.navigateTo(Screen.Camera) },
onDeleteImage = { id -> viewModel.deletePage(id) }
)
}
Column {
when (val screen = currentScreen) {
is Screen.Camera -> {
CameraScreen(
viewModel,
liveAnalysisState,
onImageAnalyzed = { image -> viewModel.liveAnalysis(image) },
onFinalizePressed = { viewModel.navigateTo(Screen.FinalizeDocument()) },
)
}
is Screen.FinalizeDocument -> {
DocumentScreen (
pageIds,
initialPage = screen.initialPage,
imageLoader = { id -> viewModel.getBitmap(id) },
toCameraScreen = { viewModel.navigateTo(Screen.Camera) },
onSavePressed = savePdf(viewModel, context),
onSharePressed = sharePdf(viewModel, context),
onStartNew = {
viewModel.startNewDocument()
viewModel.navigateTo(Screen.Camera) },
onDeleteImage = { id -> viewModel.deletePage(id) }
)
}
}
}
}
}
}

View File

@@ -40,6 +40,7 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -77,7 +78,6 @@ fun CameraScreen(
liveAnalysisState: LiveAnalysisState,
onImageAnalyzed: (ImageProxy) -> Unit,
onFinalizePressed: () -> Unit,
modifier: Modifier,
) {
var previewView by remember { mutableStateOf<PreviewView?>(null) }
val pageIds by viewModel.pageIds.collectAsStateWithLifecycle()
@@ -101,9 +101,7 @@ fun CameraScreen(
listState.animateScrollToItem(pageIds.lastIndex)
}
}
CameraScreenContent(
modifier,
CameraScreenScaffold(
cameraPreview = {
CameraPreview(
onImageAnalyzed = onImageAnalyzed,
@@ -132,42 +130,44 @@ fun CameraScreen(
}
@Composable
private fun CameraScreenContent(
modifier: Modifier,
private fun CameraScreenScaffold(
cameraPreview: @Composable () -> Unit,
pageList: @Composable () -> Unit,
cameraUiState: CameraUiState,
onCapture: () -> Unit,
onFinalizePressed: () -> Unit,
) {
Box(modifier = modifier.fillMaxSize()) {
CameraPreviewWithOverlay(cameraPreview, cameraUiState)
MessageBox(cameraUiState.liveAnalysisState.inferenceTime)
Scaffold { innerPadding ->
Box(modifier = Modifier.padding(innerPadding).fillMaxSize()) {
CameraPreviewWithOverlay(cameraPreview, cameraUiState)
MessageBox(cameraUiState.liveAnalysisState.inferenceTime)
Column (Modifier.align(Alignment.BottomCenter)) {
CaptureButton(
onClick = onCapture,
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(16.dp)
)
CameraScreenFooter(
pageList = pageList,
pageCount = cameraUiState.pageCount,
onFinalizePressed = onFinalizePressed,
modifier = Modifier,
)
}
cameraUiState.captureState.processedImage?.let {
Surface (
color = Color.Black.copy(alpha = 0.3f),
modifier = Modifier.fillMaxSize())
{}
Image(
bitmap = it.asImageBitmap(),
contentDescription = null,
modifier = Modifier.fillMaxSize().padding(24.dp)
)
Column(Modifier.align(Alignment.BottomCenter)) {
CaptureButton(
onClick = onCapture,
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(16.dp)
)
CameraScreenFooter(
pageList = pageList,
pageCount = cameraUiState.pageCount,
onFinalizePressed = onFinalizePressed,
modifier = Modifier,
)
}
cameraUiState.captureState.processedImage?.let {
Surface(
color = Color.Black.copy(alpha = 0.3f),
modifier = Modifier.fillMaxSize()
)
{}
Image(
bitmap = it.asImageBitmap(),
contentDescription = null,
modifier = Modifier.fillMaxSize().padding(24.dp)
)
}
}
}
}
@@ -292,8 +292,7 @@ fun CameraScreenPreviewWithProcessedImage() {
private fun ScreenPreview(captureState: CaptureState) {
val context = LocalContext.current
MyScanTheme {
CameraScreenContent(
modifier = Modifier,
CameraScreenScaffold(
cameraPreview = {
Box(
modifier = Modifier