More Compose work
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 5a457bf..189f87c 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
@@ -84,7 +84,11 @@
     state: LottieAnimationState,
     modifier: Modifier = Modifier
 ) {
-    val drawable = remember { LottieDrawable() }
+    val drawable = remember {
+        LottieDrawable().apply {
+            enableMergePathsForKitKatAndAbove(true)
+        }
+    }
     val isStarted by isStarted()
     val isPlaying = state.isPlaying && isStarted
 
@@ -121,6 +125,8 @@
 
     if (composition == null || composition.duration == 0f) return
     drawable.progress = state.progress
+    drawable.setOutlineMasksAndMattes(state.outlineMasksAndMattes)
+    drawable.isApplyingOpacityToLayersEnabled = state.applyOpacityToLayers
 
     Canvas(
         modifier = Modifier
diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationState.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationState.kt
index 32964da..12386f7 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationState.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimationState.kt
@@ -35,6 +35,27 @@
 
     var speed by mutableStateOf(1f)
 
+    /**
+     * Enable this to debug slow animations by outlining masks and mattes. The performance overhead of the masks and mattes will
+     * be proportional to the surface area of all of the masks/mattes combined.
+     * <p>
+     * DO NOT leave this enabled in production.
+     */
+    var outlineMasksAndMattes by mutableStateOf(false)
+
+
+    /**
+     * Sets whether to apply opacity to the each layer instead of shape.
+     * <p>
+     * Opacity is normally applied directly to a shape. In cases where translucent shapes overlap, applying opacity to a layer will be more accurate
+     * at the expense of performance.
+     * <p>
+     * The default value is false.
+     * <p>
+     * Note: This process is very expensive and will incur additional performance overhead.
+     */
+    var applyOpacityToLayers by mutableStateOf(false)
+
     internal fun updateFrame(frame: Int) {
         _frame.value = frame
     }
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index ee145cc..9364c21 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -257,7 +257,10 @@
    *
    * DO NOT leave this enabled in production.
    */
-  void setOutlineMasksAndMattes(boolean outline) {
+  public void setOutlineMasksAndMattes(boolean outline) {
+    if (outlineMasksAndMattes == outline) {
+      return;
+    }
     outlineMasksAndMattes = outline;
     if (compositionLayer != null) {
       compositionLayer.setOutlineMasksAndMattes(outline);
diff --git a/sample-compose/build.gradle b/sample-compose/build.gradle
index bcf8d44..2374a1a 100644
--- a/sample-compose/build.gradle
+++ b/sample-compose/build.gradle
@@ -14,7 +14,7 @@
     minSdkVersion 21
     targetSdkVersion 30
     versionCode 1
-    versionName "1.0"
+    versionName VERSION_NAME
 
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt
index 543c0c7..5db00fb 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt
@@ -37,6 +37,7 @@
 import com.airbnb.lottie.sample.compose.ui.Teal
 import com.airbnb.lottie.sample.compose.ui.toColorSafe
 import com.airbnb.lottie.sample.compose.utils.NavControllerAmbient
+import com.airbnb.lottie.sample.compose.utils.drawTopBorder
 import com.airbnb.lottie.sample.compose.utils.getBase64String
 
 class ComposeActivity : AppCompatActivity() {
@@ -96,12 +97,12 @@
                             ) { entry ->
                                 val arguments = entry.arguments ?: error("No arguments provided to ${Route.Player}")
                                 val spec = when {
-                                    arguments.containsKey("url") -> LottieAnimationSpec.Url(arguments.getBase64String("url") ?: error("url must be a string"))
-                                    arguments.containsKey("file") -> LottieAnimationSpec.File(arguments.getBase64String("file") ?: error("file must be a string"))
-                                    arguments.containsKey("asset") -> LottieAnimationSpec.Asset(arguments.getBase64String("asset") ?: error("asset must be a string"))
+                                    arguments.getString("url") != null -> LottieAnimationSpec.Url(arguments.getBase64String("url"))
+                                    arguments.getString("file") != null -> LottieAnimationSpec.File(arguments.getBase64String("file"))
+                                    arguments.getString("asset") != null -> LottieAnimationSpec.Asset(arguments.getBase64String("asset"))
                                     else -> error("You must specify a url, file, or asset")
                                 }
-                                val backgroundColor = when (arguments.containsKey("backgroundColor")) {
+                                val backgroundColor = when (arguments.getString("backgroundColor") != null) {
                                     true -> arguments.getBase64String("backgroundColor").toColorSafe()
                                     else -> null
                                 }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt
index 96bab82..68212c5 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt
@@ -37,14 +37,14 @@
     ) {
         val fullRoute = "$route?url={url}&file={file}&asset={asset}&backgroundColor={backgroundColor}"
 
-        fun forUrl(url: String, backgroundColor: String?) = when (backgroundColor) {
+        fun forUrl(url: String, backgroundColor: String? = null) = when (backgroundColor) {
             null -> "${route}?url=${url.toBase64()}"
             else -> "${route}?url=${url.toBase64()}&backgroundColor=${backgroundColor.toBase64()}"
         }
 
-        fun forFile(file: String) = "${route}?file=$file"
+        fun forFile(file: String) = "${route}?file=${file.toBase64()}"
 
-        fun forAsset(asset: String) = "${route}?asset=$asset"
+        fun forAsset(asset: String) = "${route}?asset=${asset.toBase64()}"
     }
 }
 
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt
index 34ed88d..2fd3bb6 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt
@@ -32,7 +32,7 @@
         Row(
             verticalAlignment = Alignment.CenterVertically,
             modifier = Modifier
-                .padding(8.dp)
+                .padding(16.dp)
                 .fillMaxWidth()
         ) {
             CoilImage(
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt
index f0ca565..1120a94 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt
@@ -9,6 +9,7 @@
 import androidx.compose.foundation.lazy.LazyColumnForIndexed
 import androidx.compose.material.FloatingActionButton
 import androidx.compose.material.Icon
+import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.Surface
 import androidx.compose.material.TextField
 import androidx.compose.material.icons.Icons
@@ -18,9 +19,11 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.navigation.compose.navigate
 import androidx.ui.tooling.preview.Preview
+import com.airbnb.lottie.sample.compose.R
 import com.airbnb.lottie.sample.compose.Route
 import com.airbnb.lottie.sample.compose.api.AnimationDataV2
 import com.airbnb.lottie.sample.compose.api.LottieFilesApi
@@ -38,7 +41,7 @@
 import kotlinx.coroutines.launch
 
 data class LottieFilesSearchState(
-    val query: String = "Loading",
+    val query: String = "",
     val results: List<AnimationDataV2> = emptyList(),
     val currentPage: Int = 1,
     val lastPage: Int = 0,
@@ -125,7 +128,7 @@
 @Composable
 fun LottieFilesSearchPage(
     state: LottieFilesSearchState,
-    setQuery: (String) -> Unit,
+    onQueryChanged: (String) -> Unit,
     fetchNextPage: () -> Unit,
     onAnimationClicked: (AnimationDataV2) -> Unit,
     modifier: Modifier = Modifier,
@@ -134,11 +137,11 @@
         Column(
             modifier = Modifier.then(modifier)
         ) {
-            TextField(
+            OutlinedTextField(
                 value = state.query,
-                onValueChange = { query -> setQuery(query) },
-                label = { Text("Query") },
-                modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp)
+                onValueChange = onQueryChanged,
+                label = { Text(stringResource(R.string.query)) },
+                modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
             )
             LazyColumnForIndexed(
                 state.results,
@@ -182,7 +185,7 @@
     Surface(color = Color.White) {
         LottieFilesSearchPage(
             state = state,
-            setQuery = {},
+            onQueryChanged = {},
             fetchNextPage = {},
             onAnimationClicked = {}
         )
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 2246bfb..3e71a6f 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
@@ -1,5 +1,6 @@
 package com.airbnb.lottie.sample.compose.player
 
+import android.os.Build
 import androidx.activity.OnBackPressedDispatcher
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.ScrollableRow
@@ -32,6 +33,7 @@
 import androidx.compose.material.icons.filled.PlayArrow
 import androidx.compose.material.icons.filled.RemoveRedEye
 import androidx.compose.material.icons.filled.Repeat
+import androidx.compose.material.icons.filled.Warning
 import androidx.compose.material.rememberScaffoldState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedTask
@@ -39,6 +41,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.onCommit
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
@@ -61,6 +64,7 @@
 import com.airbnb.lottie.compose.rememberLottieAnimationState
 import com.airbnb.lottie.compose.rememberLottieComposition
 import com.airbnb.lottie.sample.compose.BackPressedDispatcherAmbient
+import com.airbnb.lottie.sample.compose.BuildConfig
 import com.airbnb.lottie.sample.compose.R
 import com.airbnb.lottie.sample.compose.composables.DebouncedCircularProgressIndicator
 import com.airbnb.lottie.sample.compose.composables.SeekBar
@@ -68,7 +72,6 @@
 import com.airbnb.lottie.sample.compose.utils.drawTopBorder
 import com.airbnb.lottie.sample.compose.utils.maybeBackground
 import com.airbnb.lottie.sample.compose.utils.maybeDrawBorder
-import com.airbnb.lottie.sample.compose.utils.quantityStringResource
 import kotlin.math.ceil
 import kotlin.math.roundToInt
 
@@ -81,8 +84,11 @@
     val compositionResult = rememberLottieComposition(spec)
     val animationState = rememberLottieAnimationState(autoPlay = true, repeatCount = Integer.MAX_VALUE)
     val scaffoldState = rememberScaffoldState()
+    val outlineMasksAndMattes = remember { mutableStateOf(false) }
+    val applyOpacityToLayers = remember { mutableStateOf(false) }
     var focusMode by remember { mutableStateOf(false) }
     var backgroundColor by remember { mutableStateOf(animationBackgroundColor) }
+    var showWarningsDialog by remember { mutableStateOf(false) }
 
     val borderToolbar = remember { mutableStateOf(false) }
     val speedToolbar = remember { mutableStateOf(false) }
@@ -100,6 +106,13 @@
         }
     }
 
+    onCommit(outlineMasksAndMattes.value) {
+        animationState.outlineMasksAndMattes = outlineMasksAndMattes.value
+    }
+    onCommit(applyOpacityToLayers.value) {
+        animationState.applyOpacityToLayers = applyOpacityToLayers.value
+    }
+
     Scaffold(
         scaffoldState = scaffoldState,
         topBar = {
@@ -115,6 +128,16 @@
                     }
                 },
                 actions = {
+                    if (compositionResult()?.warnings?.isNotEmpty() == true) {
+                        IconButton(
+                            onClick = { showWarningsDialog = true }
+                        ) {
+                            Icon(
+                                Icons.Filled.Warning,
+                                tint = Color.Black,
+                            )
+                        }
+                    }
                     IconButton(
                         onClick = { focusMode = !focusMode },
                     ) {
@@ -172,11 +195,16 @@
                     border = borderToolbar,
                     speed = speedToolbar,
                     backgroundColor = backgroundColorToolbar,
-                    warnings = compositionResult()?.warnings ?: emptyList()
+                    outlineMasksAndMattes = outlineMasksAndMattes,
+                    applyOpacityToLayers = applyOpacityToLayers,
                 )
             }
         }
     }
+
+    if (showWarningsDialog) {
+        WarningDialog(warnings = compositionResult()?.warnings ?: emptyList(), onDismiss = { showWarningsDialog = false })
+    }
 }
 
 @Composable
@@ -190,43 +218,56 @@
     val progress = (totalTime / 100.0) * ((animationState.progress * 100.0).roundToInt())
     val progressFormatted = ("%.1f").format(progress)
 
-    Row(
-        verticalAlignment = Alignment.CenterVertically,
+    Box(
         modifier = Modifier
-            .drawTopBorder()
+            .fillMaxWidth()
     ) {
-        Box(
-            alignment = Alignment.Center
+        Row(
+            verticalAlignment = Alignment.CenterVertically,
+            modifier = Modifier
+                .drawTopBorder()
         ) {
-            IconButton(
-                onClick = { animationState.toggleIsPlaying() },
+            Box(
+                alignment = Alignment.Center
             ) {
-                Icon(if (animationState.isPlaying) Icons.Filled.Pause else Icons.Filled.PlayArrow)
+                IconButton(
+                    onClick = { animationState.toggleIsPlaying() },
+                ) {
+                    Icon(if (animationState.isPlaying) Icons.Filled.Pause else Icons.Filled.PlayArrow)
+                }
+                Text(
+                    "${animationState.frame}/${ceil(composition?.durationFrames ?: 0f).toInt()}\n${progressFormatted}/$totalTimeFormatted",
+                    style = TextStyle(fontSize = 8.sp),
+                    textAlign = TextAlign.Center,
+                    modifier = Modifier
+                        .padding(top = 48.dp, bottom = 8.dp)
+                )
             }
-            Text(
-                "${animationState.frame}/${ceil(composition?.durationFrames ?: 0f).toInt()}\n${progressFormatted}/$totalTimeFormatted",
-                style = TextStyle(fontSize = 8.sp),
-                textAlign = TextAlign.Center,
-                modifier = Modifier
-                    .padding(top = 48.dp, bottom = 8.dp)
+            SeekBar(
+                progress = animationState.progress,
+                onProgressChanged = {
+                    animationState.progress = it
+                },
+                modifier = Modifier.weight(1f)
             )
+            IconButton(onClick = {
+                val repeatCount = if (animationState.repeatCount == Integer.MAX_VALUE) 0 else Integer.MAX_VALUE
+                animationState.repeatCount = repeatCount
+            }) {
+                Icon(
+                    Icons.Filled.Repeat,
+                    tint = if (animationState.repeatCount > 0) Teal else Color.Black,
+                )
+            }
         }
-        SeekBar(
-            progress = animationState.progress,
-            onProgressChanged = {
-                animationState.progress = it
-            },
-            modifier = Modifier.weight(1f)
+        Text(
+            BuildConfig.VERSION_NAME,
+            fontSize = 6.sp,
+            color = Color.Gray,
+            modifier = Modifier
+                .align(Alignment.BottomCenter)
+                .padding(bottom = 12.dp)
         )
-        IconButton(onClick = {
-            val repeatCount = if (animationState.repeatCount == Integer.MAX_VALUE) 0 else Integer.MAX_VALUE
-            animationState.repeatCount = repeatCount
-        }) {
-            Icon(
-                Icons.Filled.Repeat,
-                tint = if (animationState.repeatCount > 0) Teal else Color.Black,
-            )
-        }
     }
 }
 
@@ -321,34 +362,34 @@
     border: MutableState<Boolean>,
     speed: MutableState<Boolean>,
     backgroundColor: MutableState<Boolean>,
-    warnings: List<String>,
+    outlineMasksAndMattes: MutableState<Boolean>,
+    applyOpacityToLayers: MutableState<Boolean>,
 ) {
-    var showWarningsDialog by remember { mutableStateOf(false) }
-
-    if (showWarningsDialog) {
-        WarningDialog(warnings = warnings, onDismiss = { showWarningsDialog = false })
-    }
-
     ScrollableRow(
         contentPadding = PaddingValues(start = 16.dp, top = 12.dp, end = 16.dp, bottom = 12.dp),
         modifier = Modifier
             .drawTopBorder()
             .fillMaxWidth()
     ) {
-        if (warnings.isNotEmpty()) {
-            ToolbarChip(
-                iconRes = R.drawable.ic_warning,
-                label = quantityStringResource(R.plurals.toolbar_item_warning, warnings.size, warnings.size),
-                isActivated = true,
-                onClick = { showWarningsDialog = true },
-                modifier = Modifier.padding(end = 8.dp)
-            )
-        }
         ToolbarChip(
-            iconRes = R.drawable.ic_border,
-            label = stringResource(R.string.toolbar_item_border),
-            isActivated = border.value,
-            onClick = { border.value = it },
+            iconRes = R.drawable.ic_masks_and_mattes,
+            label = stringResource(R.string.toolbar_item_masks),
+            isActivated = outlineMasksAndMattes.value,
+            onClick = { outlineMasksAndMattes.value = it },
+            modifier = Modifier.padding(end = 8.dp)
+        )
+        ToolbarChip(
+            iconRes = R.drawable.ic_layers,
+            label = stringResource(R.string.toolbar_item_opacity_layers),
+            isActivated = applyOpacityToLayers.value,
+            onClick = { applyOpacityToLayers.value = it },
+            modifier = Modifier.padding(end = 8.dp)
+        )
+        ToolbarChip(
+            iconRes = R.drawable.ic_color,
+            label = stringResource(R.string.toolbar_item_color),
+            isActivated = backgroundColor.value,
+            onClick = { backgroundColor.value = it },
             modifier = Modifier.padding(end = 8.dp)
         )
         ToolbarChip(
@@ -359,10 +400,10 @@
             modifier = Modifier.padding(end = 8.dp)
         )
         ToolbarChip(
-            iconRes = R.drawable.ic_color,
-            label = stringResource(R.string.toolbar_item_color),
-            isActivated = backgroundColor.value,
-            onClick = { backgroundColor.value = it },
+            iconRes = R.drawable.ic_border,
+            label = stringResource(R.string.toolbar_item_border),
+            isActivated = border.value,
+            onClick = { border.value = it },
             modifier = Modifier.padding(end = 8.dp)
         )
     }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt
index 6b4e27f..40b86e1 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt
@@ -14,7 +14,9 @@
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.Divider
 import androidx.compose.material.Icon
+import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.Surface
+import androidx.compose.material.TextButton
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -27,7 +29,9 @@
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.vectorResource
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.compose.ui.window.Dialog
+import androidx.navigation.compose.navArgument
 import androidx.ui.tooling.preview.Preview
 import com.airbnb.lottie.sample.compose.R
 import com.airbnb.lottie.sample.compose.Route
@@ -39,6 +43,7 @@
 @Composable
 fun PreviewPage() {
     var showingAssetsDialog by remember { mutableStateOf(false) }
+    var showingUrlDialog by remember { mutableStateOf(false) }
     val navController = findNavController()
 
     Column {
@@ -50,7 +55,7 @@
 
         }
         PreviewRow(R.drawable.ic_network, R.string.enter_url) {
-
+            showingUrlDialog = true
         }
         PreviewRow(R.drawable.ic_storage, R.string.load_from_assets) {
             showingAssetsDialog = true
@@ -64,13 +69,20 @@
             navController.navigate(Route.Player.forAsset(assetName))
         }
     )
+    UrlDialog(
+        showingUrlDialog,
+        onDismiss = { showingUrlDialog = false },
+        onUrlSelected = { url ->
+            navController.navigate(Route.Player.forUrl(url))
+        }
+    )
 }
 
 @Composable
 private fun PreviewRow(
     @DrawableRes iconRes: Int,
     @StringRes textRes: Int,
-    onClick: () -> Unit
+    onClick: () -> Unit,
 ) {
     Surface(
         modifier = Modifier.clickable(onClick = onClick)
@@ -109,7 +121,6 @@
     Dialog(onDismissRequest = onDismiss) {
         Surface(
             shape = RoundedCornerShape(4.dp),
-
         ) {
             Column(
                 modifier = Modifier
@@ -127,6 +138,40 @@
 }
 
 @Composable
+fun UrlDialog(isShowing: Boolean, onDismiss: () -> Unit, onUrlSelected: (url: String) -> Unit) {
+    if (!isShowing) return
+    var url by remember { mutableStateOf("") }
+    Dialog(onDismissRequest = {
+        url = ""
+        onDismiss()
+    }) {
+        Surface(
+            shape = RoundedCornerShape(4.dp),
+        ) {
+            Column(
+                modifier = Modifier.padding(16.dp)
+            ) {
+                Text(
+                    stringResource(R.string.enter_url),
+                    fontSize = 18.sp,
+                )
+                OutlinedTextField(
+                    value = url,
+                    onValueChange = { url = it },
+                    label = { Text(stringResource(R.string.url)) },
+                )
+                TextButton(
+                    onClick = { onUrlSelected(url) },
+                    modifier = Modifier.align(Alignment.End)
+                ) {
+                    Text(stringResource(R.string.ok))
+                }
+            }
+        }
+    }
+}
+
+@Composable
 private fun AssetRow(name: String, onClick: () -> Unit) {
     Surface(
         modifier = Modifier
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ui/Color.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ui/Color.kt
index f535838..9dcba77 100644
--- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ui/Color.kt
+++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ui/Color.kt
@@ -10,8 +10,6 @@
 val TealDark = Color(0xFF484848)
 val Teal = Color(0xFF009587)
 
-val bottomBarBackground = Color(0xFFF7F7F7)
-
 @ColorInt
 fun String?.toColorSafe(): Color {
     var bgColor = this ?: "#ffffff"
diff --git a/sample-compose/src/main/res/drawable/ic_layers.xml b/sample-compose/src/main/res/drawable/ic_layers.xml
new file mode 100644
index 0000000..5a8a75a
--- /dev/null
+++ b/sample-compose/src/main/res/drawable/ic_layers.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z"/>
+</vector>
diff --git a/sample-compose/src/main/res/drawable/ic_masks_and_mattes.xml b/sample-compose/src/main/res/drawable/ic_masks_and_mattes.xml
new file mode 100644
index 0000000..9c219d4
--- /dev/null
+++ b/sample-compose/src/main/res/drawable/ic_masks_and_mattes.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="#FF000000">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z"/>
+</vector>
diff --git a/sample-compose/src/main/res/drawable/ic_warning.xml b/sample-compose/src/main/res/drawable/ic_warning.xml
deleted file mode 100644
index be51d26..0000000
--- a/sample-compose/src/main/res/drawable/ic_warning.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="16dp"
-    android:height="16dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#ff7e7e7e"
-        android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
-</vector>
diff --git a/sample-compose/src/main/res/values/strings.xml b/sample-compose/src/main/res/values/strings.xml
index 00faace..eedfa5b 100644
--- a/sample-compose/src/main/res/values/strings.xml
+++ b/sample-compose/src/main/res/values/strings.xml
@@ -9,9 +9,11 @@
     <string name="tab_recent">Recent</string>
     <string name="tab_popular">Popular</string>
     <string name="tab_search">Search</string>
+    <string name="query">Query</string>
     <string name="tab_preview">Preview</string>
     <string name="scan_qr_code">Scan a QR code</string>
     <string name="open_file">Open a file</string>
+    <string name="url">URL</string>
     <string name="enter_url">Enter a URL to a json or zip file</string>
     <string name="load_from_assets">Load from assets</string>
 
@@ -20,8 +22,11 @@
         <item quantity="other">%1$d warnings</item>
     </plurals>
     <string name="toolbar_item_border">Border</string>
+    <string name="toolbar_item_masks">Outline Masks</string>
     <string name="toolbar_item_speed">Speed</string>
     <string name="toolbar_item_color">Background</string>
+    <string name="toolbar_item_outline_masks">Outline Masks</string>
+    <string name="toolbar_item_opacity_layers">Apply Opacity To Layers</string>
 
     <string name="failed_to_load">Failed to load composition</string>
     <string name="ok">OK</string>