11package com.pnuema.android.pdfviewer
22
33import android.graphics.Bitmap
4+ import androidx.compose.animation.AnimatedVisibility
5+ import androidx.compose.animation.fadeIn
6+ import androidx.compose.animation.fadeOut
47import androidx.compose.foundation.Image
58import androidx.compose.foundation.background
69import androidx.compose.foundation.layout.Arrangement
@@ -15,7 +18,6 @@ import androidx.compose.foundation.lazy.LazyListState
1518import androidx.compose.foundation.lazy.rememberLazyListState
1619import androidx.compose.material3.HorizontalDivider
1720import androidx.compose.material3.MaterialTheme
18- import androidx.compose.material3.Text
1921import androidx.compose.runtime.Composable
2022import androidx.compose.runtime.LaunchedEffect
2123import androidx.compose.runtime.derivedStateOf
@@ -25,7 +27,6 @@ import androidx.compose.ui.Alignment
2527import androidx.compose.ui.Modifier
2628import androidx.compose.ui.draw.clipToBounds
2729import androidx.compose.ui.geometry.Offset
28- import androidx.compose.ui.graphics.Color
2930import androidx.compose.ui.graphics.asImageBitmap
3031import androidx.compose.ui.layout.onGloballyPositioned
3132import androidx.compose.ui.platform.LocalContext
@@ -53,12 +54,7 @@ fun PdfViewer(
5354 color = MaterialTheme .colorScheme.outline
5455 )
5556 },
56- fetchFailedContent : @Composable (BoxScope .() -> Unit )? = {
57- Text (
58- text = "Failed to load",
59- color = Color .Black
60- )
61- },
57+ fetchFailedContent : @Composable (BoxScope .() -> Unit )? = {},
6258 onClick : ((Offset ) -> Unit )? = null,
6359 onLongClick : ((Offset ) -> Unit )? = null,
6460) {
@@ -111,38 +107,41 @@ fun PdfViewer(
111107 onClick : ((Offset ) -> Unit )? = null,
112108 onLongClick : ((Offset ) -> Unit )? = null,
113109) {
114- file?.let {
115- val context = LocalContext .current
116- val viewModel = viewModel<PdfViewerViewModel > {
117- PdfViewerViewModel (
118- context = context,
119- file = file,
120- options = options,
121- )
122- }
123-
124- val initFinished by viewModel.initFinished.collectAsStateWithLifecycle()
110+ // pdf viewer content
111+ Box (
112+ modifier = modifier
113+ .fillMaxSize()
114+ .background(options.backgroundColor),
115+ contentAlignment = Alignment .Center
116+ ) {
117+ file?.let {
118+ val context = LocalContext .current
119+ val viewModel = viewModel<PdfViewerViewModel > {
120+ PdfViewerViewModel (
121+ context = context,
122+ file = file,
123+ options = options,
124+ )
125+ }
125126
126- var zoomState = rememberZoomableState(ZoomSpec (maxZoomFactor = options.maxScale))
127- val lazyColumnState = rememberLazyListState()
128- val pageCount by viewModel.pageCount.collectAsStateWithLifecycle()
129- val currentVisibleItems = lazyColumnState.currentVisibleItems()
127+ val initFinished by viewModel.initFinished.collectAsStateWithLifecycle()
128+ var zoomState = rememberZoomableState(ZoomSpec (maxZoomFactor = options.maxScale))
129+ val lazyColumnState = rememberLazyListState()
130+ val pageCount by viewModel.pageCount.collectAsStateWithLifecycle()
131+ val currentVisibleItems = lazyColumnState.currentVisibleItems()
130132
131- LaunchedEffect (
132- key1 = currentVisibleItems + initFinished,
133- block = {
134- if (initFinished) {
135- viewModel.generatePagesForVisibleItems(currentVisibleItems)
133+ LaunchedEffect (
134+ key1 = currentVisibleItems,
135+ key2 = initFinished,
136+ block = {
137+ if (initFinished) {
138+ viewModel.generatePagesForVisibleItems(currentVisibleItems)
139+ }
136140 }
137- }
138- )
139- Box (
140- modifier = modifier
141- .background(options.backgroundColor),
142- contentAlignment = Alignment .Center
143- ) {
141+ )
142+
144143 LazyColumn (
145- modifier = modifier
144+ modifier = Modifier
146145 .fillMaxSize()
147146 .background(options.backgroundColor)
148147 .zoomable(
@@ -156,7 +155,7 @@ fun PdfViewer(
156155 },
157156 state = lazyColumnState,
158157 verticalArrangement = if (pageDivider == null )
159- // no divider so add all spacing between the pages
158+ // no divider so add all spacing between the pages
160159 Arrangement .spacedBy(options.spacingBetweenPages)
161160 else
162161 Arrangement .Top
@@ -181,16 +180,21 @@ fun PdfViewer(
181180 }
182181 }
183182
184- if (! initFinished) {
183+ // loading content is shown while the pdf generator is initializing / opening file
184+ AnimatedVisibility (
185+ visible = ! initFinished,
186+ enter = fadeIn(),
187+ exit = fadeOut()
188+ ) {
185189 loadingContent()
186190 }
187191 }
188192
189- } ? : run {
190- Box (
191- modifier = modifier
192- .background(options.backgroundColor ),
193- contentAlignment = Alignment . Center
193+ // loading content shown while file is null
194+ AnimatedVisibility (
195+ visible = file == null ,
196+ enter = fadeIn( ),
197+ exit = fadeOut()
194198 ) {
195199 loadingContent()
196200 }
0 commit comments