1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settingslib.widget; 18 19 import android.content.Context; 20 import android.content.res.Configuration; 21 import android.graphics.PorterDuff; 22 import android.graphics.PorterDuffColorFilter; 23 24 import androidx.annotation.NonNull; 25 26 import com.android.settingslib.widget.theme.R; 27 28 import com.airbnb.lottie.LottieAnimationView; 29 import com.airbnb.lottie.LottieProperty; 30 import com.airbnb.lottie.model.KeyPath; 31 32 import java.util.Map; 33 34 /** 35 * Util class which dynamically changes the color of tags in a lottie json file between Dark Theme 36 * (DT) and Light Theme (LT). This class assumes the json file is for Dark Theme. 37 */ 38 public class LottieColorUtils { 39 private static final Map<String, Integer> DARK_TO_LIGHT_THEME_COLOR_MAP; 40 private static final Map<String, Integer> MATERIAL_COLOR_MAP; 41 42 static { 43 DARK_TO_LIGHT_THEME_COLOR_MAP = Map.ofEntries( 44 Map.entry(".grey200", 45 com.android.settingslib.color.R.color.settingslib_color_grey800), 46 Map.entry(".grey600", 47 com.android.settingslib.color.R.color.settingslib_color_grey400), 48 Map.entry(".grey800", 49 com.android.settingslib.color.R.color.settingslib_color_grey300), 50 Map.entry(".grey900", 51 com.android.settingslib.color.R.color.settingslib_color_grey50), 52 Map.entry(".red100", 53 com.android.settingslib.color.R.color.settingslib_color_red500), 54 Map.entry(".red200", 55 com.android.settingslib.color.R.color.settingslib_color_red500), 56 Map.entry(".red400", 57 com.android.settingslib.color.R.color.settingslib_color_red600), 58 Map.entry(".black", 59 android.R.color.white), 60 Map.entry(".blue200", 61 com.android.settingslib.color.R.color.settingslib_color_blue700), 62 Map.entry(".blue400", 63 com.android.settingslib.color.R.color.settingslib_color_blue600), 64 Map.entry(".green100", 65 com.android.settingslib.color.R.color.settingslib_color_green500), 66 Map.entry(".green200", 67 com.android.settingslib.color.R.color.settingslib_color_green500), 68 Map.entry(".green400", 69 com.android.settingslib.color.R.color.settingslib_color_green600), 70 Map.entry(".cream", 71 com.android.settingslib.color.R.color.settingslib_color_charcoal)); 72 73 MATERIAL_COLOR_MAP = Map.ofEntries( 74 Map.entry(".primary", R.color.settingslib_materialColorPrimary), 75 Map.entry(".onPrimary", R.color.settingslib_materialColorOnPrimary), 76 Map.entry(".primaryContainer", R.color.settingslib_materialColorPrimaryContainer), 77 Map.entry(".onPrimaryContainer", 78 R.color.settingslib_materialColorOnPrimaryContainer), 79 Map.entry(".primaryInverse", R.color.settingslib_materialColorPrimaryInverse), 80 Map.entry(".primaryFixed", R.color.settingslib_materialColorPrimaryFixed), 81 Map.entry(".primaryFixedDim", R.color.settingslib_materialColorPrimaryFixedDim), 82 Map.entry(".onPrimaryFixed", R.color.settingslib_materialColorOnPrimaryFixed), 83 Map.entry(".onPrimaryFixedVariant", 84 R.color.settingslib_materialColorOnPrimaryFixedVariant), 85 Map.entry(".secondary", R.color.settingslib_materialColorSecondary), 86 Map.entry(".onSecondary", R.color.settingslib_materialColorOnSecondary), 87 Map.entry(".secondaryContainer", 88 R.color.settingslib_materialColorSecondaryContainer), 89 Map.entry(".onSecondaryContainer", 90 R.color.settingslib_materialColorOnSecondaryContainer), 91 Map.entry(".secondaryFixed", R.color.settingslib_materialColorSecondaryFixed), 92 Map.entry(".secondaryFixedDim", R.color.settingslib_materialColorSecondaryFixedDim), 93 Map.entry(".onSecondaryFixed", R.color.settingslib_materialColorOnSecondaryFixed), 94 Map.entry(".onSecondaryFixedVariant", 95 R.color.settingslib_materialColorOnSecondaryFixedVariant), 96 Map.entry(".tertiary", R.color.settingslib_materialColorTertiary), 97 Map.entry(".onTertiary", R.color.settingslib_materialColorOnTertiary), 98 Map.entry(".tertiaryContainer", R.color.settingslib_materialColorTertiaryContainer), 99 Map.entry(".onTertiaryContainer", 100 R.color.settingslib_materialColorOnTertiaryContainer), 101 Map.entry(".tertiaryFixed", R.color.settingslib_materialColorTertiaryFixed), 102 Map.entry(".tertiaryFixedDim", R.color.settingslib_materialColorTertiaryFixedDim), 103 Map.entry(".onTertiaryFixed", R.color.settingslib_materialColorOnTertiaryFixed), 104 Map.entry(".onTertiaryFixedVariant", 105 R.color.settingslib_materialColorOnTertiaryFixedVariant), 106 Map.entry(".error", R.color.settingslib_materialColorError), 107 Map.entry(".onError", R.color.settingslib_materialColorOnError), 108 Map.entry(".errorContainer", R.color.settingslib_materialColorErrorContainer), 109 Map.entry(".onErrorContainer", R.color.settingslib_materialColorOnErrorContainer), 110 Map.entry(".outline", R.color.settingslib_materialColorOutline), 111 Map.entry(".outlineVariant", R.color.settingslib_materialColorOutlineVariant), 112 Map.entry(".background", R.color.settingslib_materialColorBackground), 113 Map.entry(".onBackground", R.color.settingslib_materialColorOnBackground), 114 Map.entry(".surface", R.color.settingslib_materialColorSurface), 115 Map.entry(".onSurface", R.color.settingslib_materialColorOnSurface), 116 Map.entry(".surfaceVariant", R.color.settingslib_materialColorSurfaceVariant), 117 Map.entry(".onSurfaceVariant", R.color.settingslib_materialColorOnSurfaceVariant), 118 Map.entry(".surfaceInverse", R.color.settingslib_materialColorSurfaceInverse), 119 Map.entry(".onSurfaceInverse", R.color.settingslib_materialColorOnSurfaceInverse), 120 Map.entry(".surfaceBright", R.color.settingslib_materialColorSurfaceBright), 121 Map.entry(".surfaceDim", R.color.settingslib_materialColorSurfaceDim), 122 Map.entry(".surfaceContainer", R.color.settingslib_materialColorSurfaceContainer), 123 Map.entry(".surfaceContainerLow", 124 R.color.settingslib_materialColorSurfaceContainerLow), 125 Map.entry(".surfaceContainerLowest", 126 R.color.settingslib_materialColorSurfaceContainerLowest), 127 Map.entry(".surfaceContainerHigh", 128 R.color.settingslib_materialColorSurfaceContainerHigh), 129 Map.entry(".surfaceContainerHighest", 130 R.color.settingslib_materialColorSurfaceContainerHighest)); 131 } 132 LottieColorUtils()133 private LottieColorUtils() { 134 } 135 isDarkMode(Context context)136 private static boolean isDarkMode(Context context) { 137 return (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) 138 == Configuration.UI_MODE_NIGHT_YES; 139 } 140 141 /** Applies dynamic colors based on DT vs. LT. The LottieAnimationView should be Dark Theme. */ applyDynamicColors(Context context, LottieAnimationView lottieAnimationView)142 public static void applyDynamicColors(Context context, 143 LottieAnimationView lottieAnimationView) { 144 // Assume the default for the lottie is dark mode 145 if (isDarkMode(context)) { 146 return; 147 } 148 for (String key : DARK_TO_LIGHT_THEME_COLOR_MAP.keySet()) { 149 final int color = context.getColor(DARK_TO_LIGHT_THEME_COLOR_MAP.get(key)); 150 lottieAnimationView.addValueCallback( 151 new KeyPath("**", key, "**"), 152 LottieProperty.COLOR_FILTER, 153 frameInfo -> new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)); 154 } 155 } 156 157 /** Applies material colors. */ applyMaterialColor(@onNull Context context, @NonNull LottieAnimationView lottieAnimationView)158 public static void applyMaterialColor(@NonNull Context context, 159 @NonNull LottieAnimationView lottieAnimationView) { 160 for (String key : MATERIAL_COLOR_MAP.keySet()) { 161 final int color = context.getColor(MATERIAL_COLOR_MAP.get(key)); 162 lottieAnimationView.addValueCallback( 163 new KeyPath("**", key, "**"), 164 LottieProperty.COLOR_FILTER, 165 frameInfo -> new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)); 166 } 167 } 168 } 169