Merge remote-tracking branch 'origin/master' into gpeal/lottie-animation-layout-modifier
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
index 7f8b83a..bb7a84c 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimation.kt
@@ -4,7 +4,6 @@
 import androidx.annotation.FloatRange
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -76,7 +75,7 @@
 
     Canvas(
         modifier = modifier
-            .fillMaxSize()
+            .lottieLayout(composition)
     ) {
         drawIntoCanvas { canvas ->
             val compositionSize = Size(composition.bounds.width().toFloat(), composition.bounds.height().toFloat())
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt
new file mode 100644
index 0000000..c5d326d
--- /dev/null
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationLayoutModifier.kt
@@ -0,0 +1,50 @@
+package com.airbnb.lottie.compose
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.constrainHeight
+import androidx.compose.ui.unit.constrainWidth
+import com.airbnb.lottie.LottieComposition
+
+internal fun Modifier.lottieLayout(
+    composition: LottieComposition,
+): Modifier {
+    return this.then(LottieAnimationLayoutModifier(composition))
+}
+
+private class LottieAnimationLayoutModifier(
+    private val composition: LottieComposition,
+) : LayoutModifier {
+    override fun MeasureScope.measure(measurable: Measurable, constraints: Constraints): MeasureResult {
+        val wrappedConstraints = modifyConstraints(constraints)
+        val placeable = measurable.measure(wrappedConstraints)
+        return layout(placeable.width, placeable.height) {
+            placeable.placeRelative(0, 0)
+        }
+    }
+
+    /**
+     * If there is a fixed size on either the width or height, use that.
+     * If there is not, use the composition size but constraint it to the constraints.
+     */
+    private fun modifyConstraints(constraints: Constraints): Constraints {
+        val width = when {
+            constraints.hasFixedWidth -> constraints.maxWidth
+            else -> constraints.constrainWidth(composition.bounds.width())
+        }
+        val height = when {
+            constraints.hasFixedHeight -> constraints.maxHeight
+            else -> constraints.constrainHeight(composition.bounds.height())
+        }
+        return Constraints(
+            minWidth = width,
+            maxWidth = width,
+            minHeight = height,
+            maxHeight = height,
+        )
+    }
+}
\ No newline at end of file