From db8431f52df763689cf8845c9e12725b3f8036e3 Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Tue, 8 Aug 2023 21:17:36 +0000 Subject: [PATCH] Support lottieDynamicProperties in Illustration widget Implementation follows LottieColorUtils#applyDynamicColors and copies settingslib colors. Change background in Illustration to transparent to follow IllustrationPreference. Bug: 293138315 Test: Manual Change-Id: If87751d1530a16cd43e6a87c1f5a63c6c9a52dfd --- .../SettingsLib/Spa/spa/res/values/colors.xml | 67 +++++++++++++++++++ .../spa/widget/illustration/Illustration.kt | 4 +- .../settingslib/spa/widget/ui/Lottie.kt | 39 +++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 packages/SettingsLib/Spa/spa/res/values/colors.xml diff --git a/packages/SettingsLib/Spa/spa/res/values/colors.xml b/packages/SettingsLib/Spa/spa/res/values/colors.xml new file mode 100644 index 0000000000000..ca4a0b2bbed6a --- /dev/null +++ b/packages/SettingsLib/Spa/spa/res/values/colors.xml @@ -0,0 +1,67 @@ + + + + + @android:color/white + + + #1a73e8 + #669df6 + #8ab4f8 + #d2e3fc + #e8f0fe + #1e8e3e + #34A853 + #5bb974 + #ceead6 + #e6f4ea + #d93025 + #B3261E + #ee675c + #fad2cf + #fce8e6 + #f9ab00 + #fcc934 + #feefc3 + #fef7e0 + #202124 + #3c4043 + #5f6368 + #80868b + #9AA0A6 + #bdc1c6 + #dadce0 + #e8eaed + #f1f3f4 + #f8f9fa + #e8710a + #fa903e + #fcad70 + #fedfc8 + #e52592 + #ff63b8 + #ff8bcb + #fdcfe8 + #9334e6 + #af5cf7 + #c58af9 + #e9d2fd + #12b5c8 + #4ecde6 + #78d9ec + #cbf0f8 + diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/illustration/Illustration.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/illustration/Illustration.kt index 7cc9bf7c9d508..6a2163c02b2fa 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/illustration/Illustration.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/illustration/Illustration.kt @@ -22,11 +22,11 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.widget.ui.ImageBox import com.android.settingslib.spa.widget.ui.Lottie @@ -81,7 +81,7 @@ fun Illustration( maxHeight = SettingsDimension.illustrationMaxHeight, ) .clip(RoundedCornerShape(SettingsDimension.illustrationCornerRadius)) - .background(color = MaterialTheme.colorScheme.surface) + .background(color = Color.Transparent) when (resourceType) { ResourceType.LOTTIE -> { diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Lottie.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Lottie.kt index 915c6e2456bcf..5f7fe850fa8f4 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Lottie.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Lottie.kt @@ -16,15 +16,24 @@ package com.android.settingslib.spa.widget.ui +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.res.colorResource +import com.airbnb.lottie.LottieProperty import com.airbnb.lottie.compose.LottieAnimation import com.airbnb.lottie.compose.LottieCompositionSpec import com.airbnb.lottie.compose.LottieConstants import com.airbnb.lottie.compose.animateLottieCompositionAsState import com.airbnb.lottie.compose.rememberLottieComposition +import com.airbnb.lottie.compose.rememberLottieDynamicProperties +import com.airbnb.lottie.compose.rememberLottieDynamicProperty +import com.android.settingslib.spa.R @Composable fun Lottie( @@ -38,6 +47,34 @@ fun Lottie( } } +object LottieColorUtils { + private val DARK_TO_LIGHT_THEME_COLOR_MAP = mapOf( + ".grey600" to R.color.settingslib_color_grey400, + ".grey800" to R.color.settingslib_color_grey300, + ".grey900" to R.color.settingslib_color_grey50, + ".red400" to R.color.settingslib_color_red600, + ".black" to android.R.color.white, + ".blue400" to R.color.settingslib_color_blue600, + ".green400" to R.color.settingslib_color_green600, + ".green200" to R.color.settingslib_color_green500, + ".red200" to R.color.settingslib_color_red500, + ) + + @Composable + private fun getDefaultPropertiesList() = + DARK_TO_LIGHT_THEME_COLOR_MAP.map { (key, colorRes) -> + val color = colorResource(colorRes).toArgb() + rememberLottieDynamicProperty( + property = LottieProperty.COLOR_FILTER, + keyPath = arrayOf("**", key, "**") + ){ PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP) } + } + + @Composable + fun getDefaultDynamicProperties() = + rememberLottieDynamicProperties(*getDefaultPropertiesList().toTypedArray()) +} + @Composable private fun BaseLottie(resId: Int) { val composition by rememberLottieComposition( @@ -47,8 +84,10 @@ private fun BaseLottie(resId: Int) { composition, iterations = LottieConstants.IterateForever, ) + val isLightMode = !isSystemInDarkTheme() LottieAnimation( composition = composition, + dynamicProperties = LottieColorUtils.getDefaultDynamicProperties().takeIf { isLightMode }, progress = { progress }, ) }