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,