• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.google.android.apps.common.testing.accessibility.framework.suggestions;
2 
3 import static com.google.common.base.Preconditions.checkNotNull;
4 
5 import com.google.android.apps.common.testing.accessibility.framework.utils.contrast.ContrastUtils;
6 import com.google.common.collect.ImmutableBiMap;
7 import com.google.common.collect.ImmutableList;
8 import org.checkerframework.checker.nullness.qual.Nullable;
9 
10 /**
11  * Material Design color palette.
12  * {@see https://www.google.com/design/spec/style/color.html#color-color-palette}
13  */
14 public enum MaterialDesignColor {
15   RED(
16       "Red",
17       ImmutableBiMap.<Shade, Integer>builder()
18           .put(Shade.PRIMARY_050, 0xFFFFEBEE)
19           .put(Shade.PRIMARY_100, 0xFFFFCDD2)
20           .put(Shade.PRIMARY_200, 0xFFEF9A9A)
21           .put(Shade.PRIMARY_300, 0xFFE57373)
22           .put(Shade.PRIMARY_400, 0xFFEF5350)
23           .put(Shade.PRIMARY_500, 0xFFF44336)
24           .put(Shade.PRIMARY_600, 0xFFE53935)
25           .put(Shade.PRIMARY_700, 0xFFD32F2F)
26           .put(Shade.PRIMARY_800, 0xFFC62828)
27           .put(Shade.PRIMARY_900, 0xFFB71C1C)
28           .put(Shade.ACCENT_100, 0xFFFF8A80)
29           .put(Shade.ACCENT_200, 0xFFFF5252)
30           .put(Shade.ACCENT_400, 0xFFFF1744)
31           .put(Shade.ACCENT_700, 0xFFD50000)
32           .buildOrThrow()),
33 
34   PINK(
35       "Pink",
36       ImmutableBiMap.<Shade, Integer>builder()
37           .put(Shade.PRIMARY_050, 0xFFFCE4EC)
38           .put(Shade.PRIMARY_100, 0xFFF8BBD0)
39           .put(Shade.PRIMARY_200, 0xFFF48FB1)
40           .put(Shade.PRIMARY_300, 0xFFF06292)
41           .put(Shade.PRIMARY_400, 0xFFEC407A)
42           .put(Shade.PRIMARY_500, 0xFFE91E63)
43           .put(Shade.PRIMARY_600, 0xFFD81B60)
44           .put(Shade.PRIMARY_700, 0xFFC2185B)
45           .put(Shade.PRIMARY_800, 0xFFAD1457)
46           .put(Shade.PRIMARY_900, 0xFF880E4F)
47           .put(Shade.ACCENT_100, 0xFFFF80AB)
48           .put(Shade.ACCENT_200, 0xFFFF4081)
49           .put(Shade.ACCENT_400, 0xFFF50057)
50           .put(Shade.ACCENT_700, 0xFFC51162)
51           .buildOrThrow()),
52 
53   PURPLE(
54       "Purple",
55       ImmutableBiMap.<Shade, Integer>builder()
56           .put(Shade.PRIMARY_050, 0xFFF3E5F5)
57           .put(Shade.PRIMARY_100, 0xFFE1BEE7)
58           .put(Shade.PRIMARY_200, 0xFFCE93D8)
59           .put(Shade.PRIMARY_300, 0xFFBA68C8)
60           .put(Shade.PRIMARY_400, 0xFFAB47BC)
61           .put(Shade.PRIMARY_500, 0xFF9C27B0)
62           .put(Shade.PRIMARY_600, 0xFF8E24AA)
63           .put(Shade.PRIMARY_700, 0xFF7B1FA2)
64           .put(Shade.PRIMARY_800, 0xFF6A1B9A)
65           .put(Shade.PRIMARY_900, 0xFF4A148C)
66           .put(Shade.ACCENT_100, 0xFFEA80FC)
67           .put(Shade.ACCENT_200, 0xFFE040FB)
68           .put(Shade.ACCENT_400, 0xFFD500F9)
69           .put(Shade.ACCENT_700, 0xFFAA00FF)
70           .buildOrThrow()),
71 
72   DEEP_PURPLE(
73       "Deep Purple",
74       ImmutableBiMap.<Shade, Integer>builder()
75           .put(Shade.PRIMARY_050, 0xFFEDE7F6)
76           .put(Shade.PRIMARY_100, 0xFFD1C4E9)
77           .put(Shade.PRIMARY_200, 0xFFB39DDB)
78           .put(Shade.PRIMARY_300, 0xFF9575CD)
79           .put(Shade.PRIMARY_400, 0xFF7E57C2)
80           .put(Shade.PRIMARY_500, 0xFF673AB7)
81           .put(Shade.PRIMARY_600, 0xFF5E35B1)
82           .put(Shade.PRIMARY_700, 0xFF512DA8)
83           .put(Shade.PRIMARY_800, 0xFF4527A0)
84           .put(Shade.PRIMARY_900, 0xFF311B92)
85           .put(Shade.ACCENT_100, 0xFFB388FF)
86           .put(Shade.ACCENT_200, 0xFF7C4DFF)
87           .put(Shade.ACCENT_400, 0xFF651FFF)
88           .put(Shade.ACCENT_700, 0xFF6200EA)
89           .buildOrThrow()),
90 
91   INDIGO(
92       "Indigo",
93       ImmutableBiMap.<Shade, Integer>builder()
94           .put(Shade.PRIMARY_050, 0xFFE8EAF6)
95           .put(Shade.PRIMARY_100, 0xFFC5CAE9)
96           .put(Shade.PRIMARY_200, 0xFF9FA8DA)
97           .put(Shade.PRIMARY_300, 0xFF7986CB)
98           .put(Shade.PRIMARY_400, 0xFF5C6BC0)
99           .put(Shade.PRIMARY_500, 0xFF3F51B5)
100           .put(Shade.PRIMARY_600, 0xFF3949AB)
101           .put(Shade.PRIMARY_700, 0xFF303F9F)
102           .put(Shade.PRIMARY_800, 0xFF283593)
103           .put(Shade.PRIMARY_900, 0xFF1A237E)
104           .put(Shade.ACCENT_100, 0xFF8C9EFF)
105           .put(Shade.ACCENT_200, 0xFF536DFE)
106           .put(Shade.ACCENT_400, 0xFF3D5AFE)
107           .put(Shade.ACCENT_700, 0xFF304FFE)
108           .buildOrThrow()),
109 
110   BLUE(
111       "Blue",
112       ImmutableBiMap.<Shade, Integer>builder()
113           .put(Shade.PRIMARY_050, 0xFFE3F2FD)
114           .put(Shade.PRIMARY_100, 0xFFBBDEFB)
115           .put(Shade.PRIMARY_200, 0xFF90CAF9)
116           .put(Shade.PRIMARY_300, 0xFF64B5F6)
117           .put(Shade.PRIMARY_400, 0xFF42A5F5)
118           .put(Shade.PRIMARY_500, 0xFF2196F3)
119           .put(Shade.PRIMARY_600, 0xFF1E88E5)
120           .put(Shade.PRIMARY_700, 0xFF1976D2)
121           .put(Shade.PRIMARY_800, 0xFF1565C0)
122           .put(Shade.PRIMARY_900, 0xFF0D47A1)
123           .put(Shade.ACCENT_100, 0xFF82B1FF)
124           .put(Shade.ACCENT_200, 0xFF448AFF)
125           .put(Shade.ACCENT_400, 0xFF2979FF)
126           .put(Shade.ACCENT_700, 0xFF2962FF)
127           .buildOrThrow()),
128 
129   LIGHT_BLUE(
130       "Light Blue",
131       ImmutableBiMap.<Shade, Integer>builder()
132           .put(Shade.PRIMARY_050, 0xFFE1F5FE)
133           .put(Shade.PRIMARY_100, 0xFFB3E5FC)
134           .put(Shade.PRIMARY_200, 0xFF81D4FA)
135           .put(Shade.PRIMARY_300, 0xFF4FC3F7)
136           .put(Shade.PRIMARY_400, 0xFF29B6F6)
137           .put(Shade.PRIMARY_500, 0xFF03A9F4)
138           .put(Shade.PRIMARY_600, 0xFF039BE5)
139           .put(Shade.PRIMARY_700, 0xFF0288D1)
140           .put(Shade.PRIMARY_800, 0xFF0277BD)
141           .put(Shade.PRIMARY_900, 0xFF01579B)
142           .put(Shade.ACCENT_100, 0xFF80D8FF)
143           .put(Shade.ACCENT_200, 0xFF40C4FF)
144           .put(Shade.ACCENT_400, 0xFF00B0FF)
145           .put(Shade.ACCENT_700, 0xFF0091EA)
146           .buildOrThrow()),
147 
148   CYAN(
149       "Cyan",
150       ImmutableBiMap.<Shade, Integer>builder()
151           .put(Shade.PRIMARY_050, 0xFFE0F7FA)
152           .put(Shade.PRIMARY_100, 0xFFB2EBF2)
153           .put(Shade.PRIMARY_200, 0xFF80DEEA)
154           .put(Shade.PRIMARY_300, 0xFF4DD0E1)
155           .put(Shade.PRIMARY_400, 0xFF26C6DA)
156           .put(Shade.PRIMARY_500, 0xFF00BCD4)
157           .put(Shade.PRIMARY_600, 0xFF00ACC1)
158           .put(Shade.PRIMARY_700, 0xFF0097A7)
159           .put(Shade.PRIMARY_800, 0xFF00838F)
160           .put(Shade.PRIMARY_900, 0xFF006064)
161           .put(Shade.ACCENT_100, 0xFF84FFFF)
162           .put(Shade.ACCENT_200, 0xFF18FFFF)
163           .put(Shade.ACCENT_400, 0xFF00E5FF)
164           .put(Shade.ACCENT_700, 0xFF00B8D4)
165           .buildOrThrow()),
166 
167   TEAL(
168       "Teal",
169       ImmutableBiMap.<Shade, Integer>builder()
170           .put(Shade.PRIMARY_050, 0xFFE0F2F1)
171           .put(Shade.PRIMARY_100, 0xFFB2DFDB)
172           .put(Shade.PRIMARY_200, 0xFF80CBC4)
173           .put(Shade.PRIMARY_300, 0xFF4DB6AC)
174           .put(Shade.PRIMARY_400, 0xFF26A69A)
175           .put(Shade.PRIMARY_500, 0xFF009688)
176           .put(Shade.PRIMARY_600, 0xFF00897B)
177           .put(Shade.PRIMARY_700, 0xFF00796B)
178           .put(Shade.PRIMARY_800, 0xFF00695C)
179           .put(Shade.PRIMARY_900, 0xFF004D40)
180           .put(Shade.ACCENT_100, 0xFFA7FFEB)
181           .put(Shade.ACCENT_200, 0xFF64FFDA)
182           .put(Shade.ACCENT_400, 0xFF1DE9B6)
183           .put(Shade.ACCENT_700, 0xFF00BFA5)
184           .buildOrThrow()),
185 
186   GREEN(
187       "Green",
188       ImmutableBiMap.<Shade, Integer>builder()
189           .put(Shade.PRIMARY_050, 0xFFE8F5E9)
190           .put(Shade.PRIMARY_100, 0xFFC8E6C9)
191           .put(Shade.PRIMARY_200, 0xFFA5D6A7)
192           .put(Shade.PRIMARY_300, 0xFF81C784)
193           .put(Shade.PRIMARY_400, 0xFF66BB6A)
194           .put(Shade.PRIMARY_500, 0xFF4CAF50)
195           .put(Shade.PRIMARY_600, 0xFF43A047)
196           .put(Shade.PRIMARY_700, 0xFF388E3C)
197           .put(Shade.PRIMARY_800, 0xFF2E7D32)
198           .put(Shade.PRIMARY_900, 0xFF1B5E20)
199           .put(Shade.ACCENT_100, 0xFFB9F6CA)
200           .put(Shade.ACCENT_200, 0xFF69F0AE)
201           .put(Shade.ACCENT_400, 0xFF00E676)
202           .put(Shade.ACCENT_700, 0xFF00C853)
203           .buildOrThrow()),
204 
205   LIGHT_GREEN(
206       "Light Green",
207       ImmutableBiMap.<Shade, Integer>builder()
208           .put(Shade.PRIMARY_050, 0xFFF1F8E9)
209           .put(Shade.PRIMARY_100, 0xFFDCEDC8)
210           .put(Shade.PRIMARY_200, 0xFFC5E1A5)
211           .put(Shade.PRIMARY_300, 0xFFAED581)
212           .put(Shade.PRIMARY_400, 0xFF9CCC65)
213           .put(Shade.PRIMARY_500, 0xFF8BC34A)
214           .put(Shade.PRIMARY_600, 0xFF7CB342)
215           .put(Shade.PRIMARY_700, 0xFF689F38)
216           .put(Shade.PRIMARY_800, 0xFF558B2F)
217           .put(Shade.PRIMARY_900, 0xFF33691E)
218           .put(Shade.ACCENT_100, 0xFFCCFF90)
219           .put(Shade.ACCENT_200, 0xFFB2FF59)
220           .put(Shade.ACCENT_400, 0xFF76FF03)
221           .put(Shade.ACCENT_700, 0xFF64DD17)
222           .buildOrThrow()),
223 
224   LIME(
225       "Lime",
226       ImmutableBiMap.<Shade, Integer>builder()
227           .put(Shade.PRIMARY_050, 0xFFF9FBE7)
228           .put(Shade.PRIMARY_100, 0xFFF0F4C3)
229           .put(Shade.PRIMARY_200, 0xFFE6EE9C)
230           .put(Shade.PRIMARY_300, 0xFFDCE775)
231           .put(Shade.PRIMARY_400, 0xFFD4E157)
232           .put(Shade.PRIMARY_500, 0xFFCDDC39)
233           .put(Shade.PRIMARY_600, 0xFFC0CA33)
234           .put(Shade.PRIMARY_700, 0xFFAFB42B)
235           .put(Shade.PRIMARY_800, 0xFF9E9D24)
236           .put(Shade.PRIMARY_900, 0xFF827717)
237           .put(Shade.ACCENT_100, 0xFFF4FF81)
238           .put(Shade.ACCENT_200, 0xFFEEFF41)
239           .put(Shade.ACCENT_400, 0xFFC6FF00)
240           .put(Shade.ACCENT_700, 0xFFAEEA00)
241           .buildOrThrow()),
242 
243   YELLOW(
244       "Yellow",
245       ImmutableBiMap.<Shade, Integer>builder()
246           .put(Shade.PRIMARY_050, 0xFFFFFDE7)
247           .put(Shade.PRIMARY_100, 0xFFFFF9C4)
248           .put(Shade.PRIMARY_200, 0xFFFFF59D)
249           .put(Shade.PRIMARY_300, 0xFFFFF176)
250           .put(Shade.PRIMARY_400, 0xFFFFEE58)
251           .put(Shade.PRIMARY_500, 0xFFFFEB3B)
252           .put(Shade.PRIMARY_600, 0xFFFDD835)
253           .put(Shade.PRIMARY_700, 0xFFFBC02D)
254           .put(Shade.PRIMARY_800, 0xFFF9A825)
255           .put(Shade.PRIMARY_900, 0xFFF57F17)
256           .put(Shade.ACCENT_100, 0xFFFFFF8D)
257           .put(Shade.ACCENT_200, 0xFFFFFF00)
258           .put(Shade.ACCENT_400, 0xFFFFEA00)
259           .put(Shade.ACCENT_700, 0xFFFFD600)
260           .buildOrThrow()),
261 
262   AMBER(
263       "Amber",
264       ImmutableBiMap.<Shade, Integer>builder()
265           .put(Shade.PRIMARY_050, 0xFFFFF8E1)
266           .put(Shade.PRIMARY_100, 0xFFFFECB3)
267           .put(Shade.PRIMARY_200, 0xFFFFE082)
268           .put(Shade.PRIMARY_300, 0xFFFFD54F)
269           .put(Shade.PRIMARY_400, 0xFFFFCA28)
270           .put(Shade.PRIMARY_500, 0xFFFFC107)
271           .put(Shade.PRIMARY_600, 0xFFFFB300)
272           .put(Shade.PRIMARY_700, 0xFFFFA000)
273           .put(Shade.PRIMARY_800, 0xFFFF8F00)
274           .put(Shade.PRIMARY_900, 0xFFFF6F00)
275           .put(Shade.ACCENT_100, 0xFFFFE57F)
276           .put(Shade.ACCENT_200, 0xFFFFD740)
277           .put(Shade.ACCENT_400, 0xFFFFC400)
278           .put(Shade.ACCENT_700, 0xFFFFAB00)
279           .buildOrThrow()),
280 
281   ORANGE(
282       "Orange",
283       ImmutableBiMap.<Shade, Integer>builder()
284           .put(Shade.PRIMARY_050, 0xFFFFF3E0)
285           .put(Shade.PRIMARY_100, 0xFFFFE0B2)
286           .put(Shade.PRIMARY_200, 0xFFFFCC80)
287           .put(Shade.PRIMARY_300, 0xFFFFB74D)
288           .put(Shade.PRIMARY_400, 0xFFFFA726)
289           .put(Shade.PRIMARY_500, 0xFFFF9800)
290           .put(Shade.PRIMARY_600, 0xFFFB8C00)
291           .put(Shade.PRIMARY_700, 0xFFF57C00)
292           .put(Shade.PRIMARY_800, 0xFFEF6C00)
293           .put(Shade.PRIMARY_900, 0xFFE65100)
294           .put(Shade.ACCENT_100, 0xFFFFD180)
295           .put(Shade.ACCENT_200, 0xFFFFAB40)
296           .put(Shade.ACCENT_400, 0xFFFF9100)
297           .put(Shade.ACCENT_700, 0xFFFF6D00)
298           .buildOrThrow()),
299 
300   DEEP_ORANGE(
301       "Deep Orange",
302       ImmutableBiMap.<Shade, Integer>builder()
303           .put(Shade.PRIMARY_050, 0xFFFBE9E7)
304           .put(Shade.PRIMARY_100, 0xFFFFCCBC)
305           .put(Shade.PRIMARY_200, 0xFFFFAB91)
306           .put(Shade.PRIMARY_300, 0xFFFF8A65)
307           .put(Shade.PRIMARY_400, 0xFFFF7043)
308           .put(Shade.PRIMARY_500, 0xFFFF5722)
309           .put(Shade.PRIMARY_600, 0xFFF4511E)
310           .put(Shade.PRIMARY_700, 0xFFE64A19)
311           .put(Shade.PRIMARY_800, 0xFFD84315)
312           .put(Shade.PRIMARY_900, 0xFFBF360C)
313           .put(Shade.ACCENT_100, 0xFFFF9E80)
314           .put(Shade.ACCENT_200, 0xFFFF6E40)
315           .put(Shade.ACCENT_400, 0xFFFF3D00)
316           .put(Shade.ACCENT_700, 0xFFDD2C00)
317           .buildOrThrow()),
318 
319   BROWN(
320       "Brown",
321       ImmutableBiMap.<Shade, Integer>builder()
322           .put(Shade.PRIMARY_050, 0xFFEFEBE9)
323           .put(Shade.PRIMARY_100, 0xFFD7CCC8)
324           .put(Shade.PRIMARY_200, 0xFFBCAAA4)
325           .put(Shade.PRIMARY_300, 0xFFA1887F)
326           .put(Shade.PRIMARY_400, 0xFF8D6E63)
327           .put(Shade.PRIMARY_500, 0xFF795548)
328           .put(Shade.PRIMARY_600, 0xFF6D4C41)
329           .put(Shade.PRIMARY_700, 0xFF5D4037)
330           .put(Shade.PRIMARY_800, 0xFF4E342E)
331           .put(Shade.PRIMARY_900, 0xFF3E2723)
332           .buildOrThrow()),
333 
334   GREY(
335       "Grey",
336       ImmutableBiMap.<Shade, Integer>builder()
337           .put(Shade.PRIMARY_050, 0xFFFAFAFA)
338           .put(Shade.PRIMARY_100, 0xFFF5F5F5)
339           .put(Shade.PRIMARY_200, 0xFFEEEEEE)
340           .put(Shade.PRIMARY_300, 0xFFE0E0E0)
341           .put(Shade.PRIMARY_400, 0xFFBDBDBD)
342           .put(Shade.PRIMARY_500, 0xFF9E9E9E)
343           .put(Shade.PRIMARY_600, 0xFF757575)
344           .put(Shade.PRIMARY_700, 0xFF616161)
345           .put(Shade.PRIMARY_800, 0xFF424242)
346           .put(Shade.PRIMARY_900, 0xFF212121)
347           .buildOrThrow()),
348 
349   BLUE_GREY(
350       "Blue Grey",
351       ImmutableBiMap.<Shade, Integer>builder()
352           .put(Shade.PRIMARY_050, 0xFFECEFF1)
353           .put(Shade.PRIMARY_100, 0xFFCFD8DC)
354           .put(Shade.PRIMARY_200, 0xFFB0BEC5)
355           .put(Shade.PRIMARY_300, 0xFF90A4AE)
356           .put(Shade.PRIMARY_400, 0xFF78909C)
357           .put(Shade.PRIMARY_500, 0xFF607D8B)
358           .put(Shade.PRIMARY_600, 0xFF546E7A)
359           .put(Shade.PRIMARY_700, 0xFF455A64)
360           .put(Shade.PRIMARY_800, 0xFF37474F)
361           .put(Shade.PRIMARY_900, 0xFF263238)
362           .buildOrThrow()),
363 
364   BLACK("Black", ImmutableBiMap.of(Shade.PRIMARY_500, 0xFF000000)),
365 
366   WHITE("White", ImmutableBiMap.of(Shade.PRIMARY_500, 0xFFFFFFFF));
367 
368   /**
369    * Standard luminance scale to rank colors on.
370    * Some colors may not have every shade on this scale.
371    */
372   public enum Shade {
373     PRIMARY_050("50"),
374     PRIMARY_100("100"),
375     PRIMARY_200("200"),
376     PRIMARY_300("300"),
377     PRIMARY_400("400"),
378     PRIMARY_500("500"),
379     PRIMARY_600("600"),
380     PRIMARY_700("700"),
381     PRIMARY_800("800"),
382     PRIMARY_900("900"),
383     ACCENT_100("A100"),
384     ACCENT_200("A200"),
385     ACCENT_400("A400"),
386     ACCENT_700("A700");
387 
388     public static ImmutableList<Shade> primaryShades =
389         ImmutableList.of(
390             PRIMARY_050,
391             PRIMARY_100,
392             PRIMARY_200,
393             PRIMARY_300,
394             PRIMARY_400,
395             PRIMARY_500,
396             PRIMARY_600,
397             PRIMARY_700,
398             PRIMARY_800,
399             PRIMARY_900);
400 
401     public static ImmutableList<Shade> accentShades =
402         ImmutableList.of(ACCENT_100, ACCENT_200, ACCENT_400, ACCENT_700);
403 
404     private final String code;
405 
getCode()406     public String getCode() {
407       return code;
408     }
409 
Shade(String code)410     Shade(String code) {
411       this.code = code;
412     }
413   }
414 
415   private final String name;
416   private final ImmutableBiMap<Shade, Integer> colorMap;
417 
MaterialDesignColor(String name, ImmutableBiMap<Shade, Integer> colorMap)418   MaterialDesignColor(String name, ImmutableBiMap<Shade, Integer> colorMap) {
419     this.name = name;
420     this.colorMap = colorMap;
421   }
422 
getName()423   public String getName() {
424     return name;
425   }
426 
getColorMap()427   public ImmutableBiMap<Shade, Integer> getColorMap() {
428     return colorMap;
429   }
430 
431   /** Converts a rgb value to a {@link MaterialDesignColor}. */
fromColor(int color)432   public static @Nullable MaterialDesignColor fromColor(int color) {
433     for (MaterialDesignColor materialDesignColor : MaterialDesignColor.values()) {
434       if (materialDesignColor.getColorMap().containsValue(color)) {
435         return materialDesignColor;
436       }
437     }
438     return null;
439   }
440 
441   /** Determines whether a given color is in material design palette. */
isMaterialDesignColor(int color)442   public static boolean isMaterialDesignColor(int color) {
443     return fromColor(color) != null;
444   }
445 
446   /**
447    * Returns a {@link MaterialDesignColor} which contains the color closest to the given color in
448    * terms of color distance.
449    */
findClosestColor(int color)450   public static MaterialDesignColor findClosestColor(int color) {
451     MaterialDesignColor materialDesignColor = fromColor(color);
452     if (materialDesignColor != null) {
453       return materialDesignColor;
454     }
455 
456     double minColorDistance = Double.MAX_VALUE;
457     MaterialDesignColor closestColor = null;
458     for (MaterialDesignColor designColor : MaterialDesignColor.values()) {
459       for (int testColor : designColor.getColorMap().values()) {
460         double colorDistance = ContrastUtils.colorDifference(testColor, color);
461         if (minColorDistance > colorDistance) {
462           minColorDistance = colorDistance;
463           closestColor = designColor;
464         }
465       }
466     }
467     return checkNotNull(closestColor);
468   }
469 }
470