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