Skip to content

Commit 6e30861

Browse files
committed
DocumentScreen: Landscape mode
1 parent d0a77cf commit 6e30861

File tree

5 files changed

+190
-152
lines changed

5 files changed

+190
-152
lines changed

app/src/main/java/org/mydomain/myscan/view/Buttons.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ fun SecondaryActionButton(
7474
}
7575

7676
@Composable
77-
fun BackButton(onClick: () -> Unit) {
78-
IconButton(onClick = onClick) {
77+
fun BackButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
78+
IconButton(onClick = onClick, modifier = modifier) {
7979
Icon(
8080
Icons.AutoMirrored.Filled.ArrowBack,
8181
contentDescription = stringResource(R.string.back)

app/src/main/java/org/mydomain/myscan/view/CameraScreen.kt

Lines changed: 23 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,21 @@ import androidx.compose.foundation.background
2929
import androidx.compose.foundation.border
3030
import androidx.compose.foundation.clickable
3131
import androidx.compose.foundation.interaction.MutableInteractionSource
32-
import androidx.compose.foundation.layout.Arrangement
3332
import androidx.compose.foundation.layout.Box
34-
import androidx.compose.foundation.layout.Column
35-
import androidx.compose.foundation.layout.Row
36-
import androidx.compose.foundation.layout.WindowInsets
3733
import androidx.compose.foundation.layout.fillMaxHeight
3834
import androidx.compose.foundation.layout.fillMaxSize
3935
import androidx.compose.foundation.layout.fillMaxWidth
4036
import androidx.compose.foundation.layout.height
4137
import androidx.compose.foundation.layout.padding
42-
import androidx.compose.foundation.layout.safeDrawing
4338
import androidx.compose.foundation.layout.size
4439
import androidx.compose.foundation.layout.width
45-
import androidx.compose.foundation.layout.windowInsetsPadding
4640
import androidx.compose.foundation.lazy.LazyListState
4741
import androidx.compose.foundation.lazy.rememberLazyListState
4842
import androidx.compose.foundation.shape.CircleShape
4943
import androidx.compose.foundation.shape.RoundedCornerShape
5044
import androidx.compose.material.icons.Icons
5145
import androidx.compose.material.icons.automirrored.filled.Article
52-
import androidx.compose.material3.BottomAppBar
5346
import androidx.compose.material3.MaterialTheme
54-
import androidx.compose.material3.Scaffold
5547
import androidx.compose.material3.Surface
5648
import androidx.compose.material3.Text
5749
import androidx.compose.runtime.Composable
@@ -193,37 +185,31 @@ private fun CameraScreenScaffold(
193185
thumbnailCoords: MutableState<Offset>,
194186
toAboutScreen: () -> Unit,
195187
) {
196-
val documentBar : @Composable () -> Unit = {
197-
DocumentBar(
198-
pageListState = pageListState,
199-
pageCount = cameraUiState.pageCount,
200-
onFinalizePressed = onFinalizePressed,
201-
onDebugModeSwitched = onDebugModeSwitched,
202-
isLandscape = cameraUiState.isLandscape
203-
)
204-
}
205-
Box {
206-
if (!cameraUiState.isLandscape) {
207-
Scaffold(
208-
bottomBar = documentBar
209-
) { padding ->
210-
val modifier = Modifier.padding(bottom = padding.calculateBottomPadding()).fillMaxSize()
211-
CameraPreviewBox(cameraPreview, cameraUiState, onCapture, modifier)
188+
var tapCount by remember { mutableStateOf(0) }
189+
var lastTapTime by remember { mutableStateOf(0L) }
190+
val tapThreshold = 500L
191+
val onPageCountClick = {
192+
val currentTime = System.currentTimeMillis()
193+
if (currentTime - lastTapTime < tapThreshold) {
194+
tapCount++
195+
if (tapCount >= 3) {
196+
onDebugModeSwitched()
197+
tapCount = 0
212198
}
213199
} else {
214-
Scaffold { innerPadding ->
215-
Row(
216-
modifier = Modifier.padding(innerPadding).fillMaxSize()
217-
) {
218-
CameraPreviewBox(cameraPreview, cameraUiState, onCapture, Modifier)
219-
documentBar()
220-
}
221-
}
200+
tapCount = 1
201+
}
202+
lastTapTime = currentTime
203+
}
204+
205+
Box {
206+
MyScaffold(
207+
toAboutScreen = toAboutScreen,
208+
pageListState = pageListState,
209+
bottomBar = { Bar(cameraUiState.pageCount, onPageCountClick, onFinalizePressed) }
210+
) {
211+
modifier -> CameraPreviewBox(cameraPreview, cameraUiState, onCapture, modifier)
222212
}
223-
AboutScreenNavButton(
224-
onClick = toAboutScreen,
225-
modifier = Modifier.align(Alignment.TopEnd).windowInsetsPadding(WindowInsets.safeDrawing)
226-
)
227213
if (cameraUiState.captureState is CaptureState.CapturePreview) {
228214
CapturedImage(cameraUiState.captureState.processed.asImageBitmap(), thumbnailCoords)
229215
}
@@ -410,61 +396,6 @@ fun MessageBox(inferenceTime: Long) {
410396
)
411397
}
412398

413-
@Composable
414-
fun DocumentBar(
415-
pageListState: CommonPageListState,
416-
pageCount: Int,
417-
onFinalizePressed: () -> Unit,
418-
onDebugModeSwitched: () -> Unit,
419-
isLandscape: Boolean,
420-
) {
421-
var tapCount by remember { mutableStateOf(0) }
422-
var lastTapTime by remember { mutableStateOf(0L) }
423-
val tapThreshold = 500L
424-
val onPageCountClick = {
425-
val currentTime = System.currentTimeMillis()
426-
if (currentTime - lastTapTime < tapThreshold) {
427-
tapCount++
428-
if (tapCount >= 3) {
429-
onDebugModeSwitched()
430-
tapCount = 0
431-
}
432-
} else {
433-
tapCount = 1
434-
}
435-
lastTapTime = currentTime
436-
}
437-
438-
Column (
439-
horizontalAlignment = Alignment.CenterHorizontally,
440-
modifier = Modifier.background(MaterialTheme.colorScheme.surfaceContainer)
441-
) {
442-
CommonPageList(pageListState, Modifier.weight(1f))
443-
BottomAppBar(
444-
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
445-
) {
446-
if (isLandscape) {
447-
Column(
448-
horizontalAlignment = Alignment.CenterHorizontally,
449-
modifier = Modifier.fillMaxWidth()
450-
) {
451-
Bar(pageCount, onPageCountClick, onFinalizePressed)
452-
}
453-
} else {
454-
Row(
455-
modifier = Modifier
456-
.padding(horizontal = 16.dp, vertical = 1.dp)
457-
.fillMaxWidth(),
458-
verticalAlignment = Alignment.CenterVertically,
459-
horizontalArrangement = Arrangement.SpaceBetween
460-
) {
461-
Bar(pageCount, onPageCountClick, onFinalizePressed)
462-
}
463-
}
464-
}
465-
}
466-
}
467-
468399
@Composable
469400
private fun Bar(
470401
pageCount: Int,
@@ -479,7 +410,7 @@ private fun Bar(
479410
MainActionButton(
480411
onClick = onFinalizePressed,
481412
enabled = pageCount > 0,
482-
text = "Document",
413+
text = stringResource(R.string.document),
483414
icon = Icons.AutoMirrored.Filled.Article,
484415
)
485416
}

app/src/main/java/org/mydomain/myscan/view/DocumentScreen.kt

Lines changed: 32 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import androidx.compose.foundation.background
2222
import androidx.compose.foundation.layout.Arrangement
2323
import androidx.compose.foundation.layout.Box
2424
import androidx.compose.foundation.layout.Column
25-
import androidx.compose.foundation.layout.PaddingValues
2625
import androidx.compose.foundation.layout.Row
2726
import androidx.compose.foundation.layout.Spacer
2827
import androidx.compose.foundation.layout.fillMaxSize
@@ -40,11 +39,8 @@ import androidx.compose.material3.AlertDialog
4039
import androidx.compose.material3.BottomAppBar
4140
import androidx.compose.material3.ExperimentalMaterial3Api
4241
import androidx.compose.material3.MaterialTheme
43-
import androidx.compose.material3.Scaffold
4442
import androidx.compose.material3.Text
4543
import androidx.compose.material3.TextButton
46-
import androidx.compose.material3.TopAppBar
47-
import androidx.compose.material3.TopAppBarDefaults
4844
import androidx.compose.runtime.Composable
4945
import androidx.compose.runtime.LaunchedEffect
5046
import androidx.compose.runtime.MutableIntState
@@ -95,28 +91,29 @@ fun DocumentScreen(
9591
BackHandler {
9692
navigation.back()
9793
}
98-
Scaffold (
99-
topBar = {
100-
TopAppBar(
101-
colors = TopAppBarDefaults.topAppBarColors(
102-
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
103-
titleContentColor = MaterialTheme.colorScheme.onSurface,
104-
),
105-
title = { Text(stringResource(R.string.document)) },
106-
navigationIcon = { BackButton(navigation.back) },
107-
actions = {
108-
AboutScreenNavButton(onClick = navigation.toAboutScreen)
109-
}
94+
95+
MyScaffold(
96+
toAboutScreen = navigation.toAboutScreen,
97+
pageListState = CommonPageListState(
98+
pageIds,
99+
imageLoader,
100+
onPageClick = { index -> currentPageIndex.intValue = index },
101+
currentPageIndex = currentPageIndex.intValue,
102+
listState = rememberLazyListState(),
103+
),
104+
onBack = navigation.back,
105+
bottomBar = {
106+
BottomBar(showPdfDialog, showNewDocDialog)
107+
},
108+
pageListButton = {
109+
SecondaryActionButton(
110+
icon = Icons.Default.Add,
111+
onClick = navigation.toCameraScreen,
112+
contentDescription = stringResource(R.string.add_page),
110113
)
111114
},
112-
bottomBar = {
113-
Column {
114-
PageList(pageIds, imageLoader, currentPageIndex, navigation.toCameraScreen)
115-
BottomBar(showPdfDialog, showNewDocDialog)
116-
}
117-
}
118-
) { padding ->
119-
DocumentPreview(pageIds, imageLoader, currentPageIndex, onDeleteImage, padding)
115+
) { modifier ->
116+
DocumentPreview(pageIds, imageLoader, currentPageIndex, onDeleteImage, modifier)
120117
if (showNewDocDialog.value) {
121118
NewDocumentDialog(onConfirm = onStartNew, showNewDocDialog)
122119
}
@@ -135,14 +132,12 @@ private fun DocumentPreview(
135132
imageLoader: (String) -> Bitmap?,
136133
currentPageIndex: MutableIntState,
137134
onDeleteImage: (String) -> Unit,
138-
padding: PaddingValues,
135+
modifier: Modifier,
139136
) {
140137
val imageId = pageIds[currentPageIndex.intValue]
141138
Column (
142-
modifier = Modifier
143-
.fillMaxSize()
139+
modifier = modifier
144140
.background(MaterialTheme.colorScheme.surfaceContainerLow)
145-
.padding(padding)
146141
) {
147142
Box (
148143
modifier = Modifier.fillMaxSize()
@@ -175,13 +170,13 @@ private fun DocumentPreview(
175170
contentDescription = stringResource(R.string.delete_page),
176171
onClick = { onDeleteImage(imageId) },
177172
modifier = Modifier
178-
.align(Alignment.TopEnd)
173+
.align(Alignment.BottomEnd)
179174
.padding(8.dp)
180175
)
181176
Text("${currentPageIndex.intValue + 1} / ${pageIds.size}",
182177
color = MaterialTheme.colorScheme.inverseOnSurface,
183178
modifier = Modifier
184-
.align(Alignment.TopStart)
179+
.align(Alignment.BottomStart)
185180
.padding(all = 16.dp)
186181
.background(
187182
color = MaterialTheme.colorScheme.inverseSurface.copy(alpha = 0.5f),
@@ -193,34 +188,6 @@ private fun DocumentPreview(
193188
}
194189
}
195190

196-
@Composable
197-
private fun PageList(
198-
pageIds: List<String>,
199-
imageLoader: (String) -> Bitmap?,
200-
currentPageIndex: MutableState<Int>,
201-
toCameraScreen: () -> Unit
202-
) {
203-
Box {
204-
CommonPageList(
205-
CommonPageListState(
206-
pageIds,
207-
imageLoader,
208-
onPageClick = { index -> currentPageIndex.value = index },
209-
currentPageIndex = currentPageIndex.value,
210-
listState = rememberLazyListState()
211-
)
212-
)
213-
SecondaryActionButton(
214-
icon = Icons.Default.Add,
215-
onClick = toCameraScreen,
216-
contentDescription = stringResource(R.string.add_page),
217-
modifier = Modifier
218-
.align(Alignment.CenterEnd)
219-
.padding(8.dp)
220-
)
221-
}
222-
}
223-
224191
@Composable
225192
private fun BottomBar(
226193
showPdfDialog: MutableState<Boolean>,
@@ -296,3 +263,10 @@ fun DocumentScreenPreview() {
296263
)
297264
}
298265
}
266+
267+
@Preview(showBackground = true, widthDp = 640, heightDp = 320)
268+
@Composable
269+
fun DocumentScreenPreviewInLandscapeMode() {
270+
DocumentScreenPreview()
271+
}
272+

app/src/main/java/org/mydomain/myscan/view/PageList.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ fun CommonPageList(
6767
val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE
6868
if (isLandscape) {
6969
LazyColumn (
70+
horizontalAlignment = Alignment.CenterHorizontally,
7071
modifier = modifier
7172
) {
7273
itemsIndexed(state.pageIds) { index, id ->

0 commit comments

Comments
 (0)