Made LottieCompositionResult only have a value property to avoid multiple ways to do the same thing
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieCompositionResult.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieCompositionResult.kt
index 3b241c7..aef7a4a 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieCompositionResult.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieCompositionResult.kt
@@ -5,7 +5,8 @@
import kotlinx.coroutines.CompletableDeferred
/**
- * A [LottieCompositionResult] subclass is returned from [lottieComposition].
+ * A [LottieCompositionResult] subclass is returned from [lottieComposition]. It can be completed with a result
+ * or exception only one time.
*
* This class implements State<LottieComposition> so you either use it like:
* ```
@@ -16,23 +17,23 @@
*
* @see lottieComposition
*/
+@Stable
class LottieCompositionResult internal constructor(): State<LottieComposition?> {
private val compositionDeferred = CompletableDeferred<LottieComposition>()
- var composition by mutableStateOf<LottieComposition?>(null)
+
+ override var value: LottieComposition? by mutableStateOf(null)
private set
+
var error by mutableStateOf<Throwable?>(null)
private set
- override val value: LottieComposition?
- get() = invoke()
+ val isLoading by derivedStateOf { value == null && error == null }
- val isLoading by derivedStateOf { composition == null && error == null }
-
- val isComplete by derivedStateOf { composition != null || error != null }
+ val isComplete by derivedStateOf { value != null || error != null }
val isFailure by derivedStateOf { error != null }
- val isSuccess by derivedStateOf { composition != null }
+ val isSuccess by derivedStateOf { value != null }
/**
* This can throw if the [LottieComposition] fails to load.
@@ -66,7 +67,7 @@
internal fun complete(composition: LottieComposition) {
if (isComplete) return
- this.composition = composition
+ this.value = composition
compositionDeferred.complete(composition)
}
@@ -77,14 +78,4 @@
this.error = error
compositionDeferred.completeExceptionally(error)
}
-
- /**
- * This is an operator so an instance of [LottieCompositionResult] can be called like a function
- * instead of calling [invoke] by name.
- *
- * @return the composition if successful or null of it is is still loading or failed to load.
- */
- operator fun invoke(): LottieComposition? {
- return composition
- }
}
\ No newline at end of file
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/lottieComposition.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/lottieComposition.kt
index 6681f54..090b4ee 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/lottieComposition.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/lottieComposition.kt
@@ -33,7 +33,7 @@
* It is passed the failed count (the number of times it has failed) and the exception
* from the previous attempt to load the composition. [onRetry] is a suspending function
* so you can do things like add a backoff delay or await an internet connection before
- * retrying again.
+ * retrying again. [rememberLottieRetrySignal] can be used to handle explicit retires.
*/
@Composable
fun lottieComposition(
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/BasicUsageExamplesPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/BasicUsageExamplesPage.kt
index acf1eb6..3045941 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/BasicUsageExamplesPage.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/BasicUsageExamplesPage.kt
@@ -91,8 +91,8 @@
compositionResult.isFailure -> {
Text("Animation failed to load")
}
- else -> {
- LottieAnimation(compositionResult())
+ compositionResult.isSuccess -> {
+ LottieAnimation(compositionResult.value)
}
}
}
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/TransitionsExamplesPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/TransitionsExamplesPage.kt
index cc5cd67..65a01de 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/TransitionsExamplesPage.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/examples/TransitionsExamplesPage.kt
@@ -52,7 +52,7 @@
// This version of animateLottieComposition takes a MutableState<Float> as a parameter
// and then suspends until one iteration through the animation is complete.
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
clipSpec = LottieClipSpec.MinAndMaxProgress(0f, 0.301f),
cancellationBehavior = LottieCancellationBehavior.AtEnd,
@@ -62,7 +62,7 @@
// To loop a segment, just wrap this in a while loop.
while (isActive) {
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
clipSpec = LottieClipSpec.MinAndMaxProgress(0.301f, 2f / 3f),
cancellationBehavior = LottieCancellationBehavior.AtEnd,
@@ -71,7 +71,7 @@
}
2 -> {
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
clipSpec = LottieClipSpec.MinAndMaxProgress(2f / 3f, 1f),
cancellationBehavior = LottieCancellationBehavior.AtEnd,
@@ -79,7 +79,7 @@
}
}
}
- LottieAnimation(compositionResult(), progress)
+ LottieAnimation(compositionResult.value, progress)
}
@Composable
@@ -107,7 +107,7 @@
when (state) {
0 -> {
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
cancellationBehavior = LottieCancellationBehavior.AtEnd,
)
@@ -115,7 +115,7 @@
1 -> {
while (isActive) {
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
cancellationBehavior = LottieCancellationBehavior.AtEnd,
)
@@ -123,12 +123,12 @@
}
else -> {
animateLottieComposition(
- compositionResult(),
+ compositionResult.value,
progress,
cancellationBehavior = LottieCancellationBehavior.AtEnd,
)
}
}
}
- LottieAnimation(compositionResult(), progress)
+ LottieAnimation(compositionResult.value, progress)
}
\ No newline at end of file
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt
index cab2071..52f637d 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt
@@ -82,13 +82,18 @@
Scaffold(
scaffoldState = scaffoldState,
- topBar = { PlayerPageTopAppBar(state, compositionResult()) },
+ topBar = { PlayerPageTopAppBar(state, compositionResult.value) },
) {
- PlayerPageContent(state, compositionResult, animationBackgroundColor)
+ PlayerPageContent(
+ state,
+ compositionResult.value,
+ compositionResult.isLoading,
+ animationBackgroundColor
+ )
}
if (state.showWarningsDialog) {
- WarningDialog(warnings = compositionResult()?.warnings ?: emptyList(), onDismiss = { state.showWarningsDialog = false })
+ WarningDialog(warnings = compositionResult.value?.warnings ?: emptyList(), onDismiss = { state.showWarningsDialog = false })
}
}
@@ -155,20 +160,21 @@
@Composable
fun PlayerPageContent(
state: PlayerPageState,
- compositionResult: LottieCompositionResult,
+ composition: LottieComposition?,
+ isLoading: Boolean,
animationBackgroundColor: Color?,
) {
var backgroundColor by remember(animationBackgroundColor) { mutableStateOf(animationBackgroundColor) }
val dummyBitmapStrokeWidth = with(LocalDensity.current) { 3.dp.toPx() }
- val imageAssetDelegate = remember(compositionResult()) {
- if (compositionResult()?.images?.any { (_, asset) -> asset.hasBitmap() } == true) {
+ val imageAssetDelegate = remember(composition) {
+ if (composition?.images?.any { (_, asset) -> asset.hasBitmap() } == true) {
null
} else {
ImageAssetDelegate { if (it.hasBitmap()) null else it.toDummyBitmap(dummyBitmapStrokeWidth) }
}
}
val progress = animateLottieComposition(
- compositionResult(),
+ composition,
state.isPlaying,
restartOnPlay = false,
repeatCount = state.repeatCount,
@@ -187,7 +193,7 @@
.fillMaxWidth()
) {
LottieAnimation(
- compositionResult(),
+ composition,
progress.value,
imageAssetDelegate = imageAssetDelegate,
modifier = Modifier
@@ -195,7 +201,7 @@
.align(Alignment.Center)
.maybeDrawBorder(state.borderToolbar)
)
- if (compositionResult.isLoading) {
+ if (isLoading) {
DebouncedCircularProgressIndicator(
color = Teal,
modifier = Modifier
@@ -213,7 +219,7 @@
)
}
ExpandVisibility(!state.focusMode) {
- PlayerControlsRow(compositionResult(), progress, state)
+ PlayerControlsRow(composition, progress, state)
}
ExpandVisibility(!state.focusMode) {
Toolbar(state)
@@ -266,9 +272,11 @@
onValueChange = { progress.value = it },
modifier = Modifier.weight(1f)
)
- IconButton(onClick = {
- state.repeatCount = if (state.repeatCount == Integer.MAX_VALUE) 1 else Integer.MAX_VALUE
- }) {
+ IconButton(
+ onClick = {
+ state.repeatCount = if (state.repeatCount == Integer.MAX_VALUE) 1 else Integer.MAX_VALUE
+ },
+ ) {
Icon(
Icons.Filled.Repeat,
tint = if (state.repeatCount == Integer.MAX_VALUE) Teal else Color.Black,