Skip to content

Commit b2bbc41

Browse files
committed
add fade animations to loading states, remove default load failed content, use singular surrounding container
1 parent f93c810 commit b2bbc41

1 file changed

Lines changed: 47 additions & 43 deletions

File tree

  • pdfviewer/src/main/kotlin/com/pnuema/android/pdfviewer

pdfviewer/src/main/kotlin/com/pnuema/android/pdfviewer/PdfViewer.kt

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.pnuema.android.pdfviewer
22

33
import android.graphics.Bitmap
4+
import androidx.compose.animation.AnimatedVisibility
5+
import androidx.compose.animation.fadeIn
6+
import androidx.compose.animation.fadeOut
47
import androidx.compose.foundation.Image
58
import androidx.compose.foundation.background
69
import androidx.compose.foundation.layout.Arrangement
@@ -15,7 +18,6 @@ import androidx.compose.foundation.lazy.LazyListState
1518
import androidx.compose.foundation.lazy.rememberLazyListState
1619
import androidx.compose.material3.HorizontalDivider
1720
import androidx.compose.material3.MaterialTheme
18-
import androidx.compose.material3.Text
1921
import androidx.compose.runtime.Composable
2022
import androidx.compose.runtime.LaunchedEffect
2123
import androidx.compose.runtime.derivedStateOf
@@ -25,7 +27,6 @@ import androidx.compose.ui.Alignment
2527
import androidx.compose.ui.Modifier
2628
import androidx.compose.ui.draw.clipToBounds
2729
import androidx.compose.ui.geometry.Offset
28-
import androidx.compose.ui.graphics.Color
2930
import androidx.compose.ui.graphics.asImageBitmap
3031
import androidx.compose.ui.layout.onGloballyPositioned
3132
import 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

Comments
 (0)