• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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