Add ability to remove pages that failed to scan
This commit is contained in:
parent
78e95ad05c
commit
cf406d5860
1 changed files with 31 additions and 7 deletions
|
@ -38,6 +38,7 @@ class MainActivity : ComponentActivity() {
|
||||||
ScanScreen(
|
ScanScreen(
|
||||||
addButtonClicked = { viewModel.requestScan(scansDirectory) },
|
addButtonClicked = { viewModel.requestScan(scansDirectory) },
|
||||||
shareButtonClicked = { sharePdf(viewModel.pages.replayCache.first()) },
|
shareButtonClicked = { sharePdf(viewModel.pages.replayCache.first()) },
|
||||||
|
removePage = viewModel::removePage,
|
||||||
pagesFlow = viewModel.pages
|
pagesFlow = viewModel.pages
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -61,6 +62,7 @@ class MainActivity : ComponentActivity() {
|
||||||
fun ScanScreen(
|
fun ScanScreen(
|
||||||
addButtonClicked: () -> Unit,
|
addButtonClicked: () -> Unit,
|
||||||
shareButtonClicked: () -> Unit,
|
shareButtonClicked: () -> Unit,
|
||||||
|
removePage: (Page) -> Unit,
|
||||||
pagesFlow: SharedFlow<List<Page>>
|
pagesFlow: SharedFlow<List<Page>>
|
||||||
) {
|
) {
|
||||||
val pages = pagesFlow.collectAsState(initial = emptyList())
|
val pages = pagesFlow.collectAsState(initial = emptyList())
|
||||||
|
@ -87,7 +89,7 @@ fun ScanScreen(
|
||||||
if (pages.value.isEmpty()) {
|
if (pages.value.isEmpty()) {
|
||||||
EmptyDocumentView()
|
EmptyDocumentView()
|
||||||
} else {
|
} else {
|
||||||
PageList(pages.value)
|
PageList(pages.value, removePage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +113,7 @@ fun EmptyDocumentView() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun PageList(pages: List<Page>) {
|
fun PageList(pages: List<Page>, removePage: (Page) -> Unit) {
|
||||||
LazyColumn(modifier = Modifier.fillMaxSize()) {
|
LazyColumn(modifier = Modifier.fillMaxSize()) {
|
||||||
itemsIndexed(items = pages) { index, page ->
|
itemsIndexed(items = pages) { index, page ->
|
||||||
val topPadding = if (index == 0) 16.dp else 8.dp
|
val topPadding = if (index == 0) 16.dp else 8.dp
|
||||||
|
@ -122,14 +124,14 @@ fun PageList(pages: List<Page>) {
|
||||||
.padding(start = 16.dp, end = 16.dp, top = topPadding, bottom = bottomPadding)
|
.padding(start = 16.dp, end = 16.dp, top = topPadding, bottom = bottomPadding)
|
||||||
.aspectRatio(8.5f / 11),
|
.aspectRatio(8.5f / 11),
|
||||||
) {
|
) {
|
||||||
PagePreview(page = page)
|
PagePreview(page = page, removePage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun PagePreview(page: Page) {
|
fun PagePreview(page: Page, removePage: (Page) -> Unit) {
|
||||||
val (pageBitmap, setPageBitmap) = remember { mutableStateOf<Bitmap?>(null) }
|
val (pageBitmap, setPageBitmap) = remember { mutableStateOf<Bitmap?>(null) }
|
||||||
LaunchedEffect(page.file) {
|
LaunchedEffect(page.file) {
|
||||||
setPageBitmap(page.loadBitmap().first)
|
setPageBitmap(page.loadBitmap().first)
|
||||||
|
@ -140,6 +142,20 @@ fun PagePreview(page: Page) {
|
||||||
bitmap = it.asImageBitmap(),
|
bitmap = it.asImageBitmap(),
|
||||||
contentDescription = null
|
contentDescription = null
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
?: page.error?.let {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally
|
||||||
|
) {
|
||||||
|
Text(it.localizedMessage ?: "An unknown error has occurred")
|
||||||
|
TextButton(
|
||||||
|
onClick = { removePage(page) }
|
||||||
|
) {
|
||||||
|
Text("Remove page")
|
||||||
|
}
|
||||||
|
}
|
||||||
} ?: LoadingPage()
|
} ?: LoadingPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +173,7 @@ fun LoadingPage() {
|
||||||
@Composable
|
@Composable
|
||||||
fun DefaultPreview() {
|
fun DefaultPreview() {
|
||||||
SkergeTheme {
|
SkergeTheme {
|
||||||
ScanScreen({}, {}, MutableSharedFlow())
|
ScanScreen({}, {}, {}, MutableSharedFlow())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,6 +181,14 @@ fun DefaultPreview() {
|
||||||
@Composable
|
@Composable
|
||||||
fun LoadingPagePreview() {
|
fun LoadingPagePreview() {
|
||||||
SkergeTheme {
|
SkergeTheme {
|
||||||
LoadingPage()
|
PagePreview(Page()) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun ErrorPagePreview() {
|
||||||
|
SkergeTheme {
|
||||||
|
PagePreview(Page(error = Exception("Error message here"))) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue