Merge "Base color API updates" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ec1d4f483d
@@ -80,6 +80,7 @@ internal class HueSubtract(val amountDegrees: Double) : Hue {
|
||||
internal class HueVibrantSecondary() : Hue {
|
||||
val hueToRotations = listOf(Pair(0, 18), Pair(41, 15), Pair(61, 10), Pair(101, 12),
|
||||
Pair(131, 15), Pair(181, 18), Pair(251, 15), Pair(301, 12), Pair(360, 12))
|
||||
|
||||
override fun get(sourceColor: Cam): Double {
|
||||
return getHueRotation(sourceColor.hue, hueToRotations)
|
||||
}
|
||||
@@ -88,6 +89,7 @@ internal class HueVibrantSecondary() : Hue {
|
||||
internal class HueVibrantTertiary() : Hue {
|
||||
val hueToRotations = listOf(Pair(0, 35), Pair(41, 30), Pair(61, 20), Pair(101, 25),
|
||||
Pair(131, 30), Pair(181, 35), Pair(251, 30), Pair(301, 25), Pair(360, 25))
|
||||
|
||||
override fun get(sourceColor: Cam): Double {
|
||||
return getHueRotation(sourceColor.hue, hueToRotations)
|
||||
}
|
||||
@@ -96,6 +98,7 @@ internal class HueVibrantTertiary() : Hue {
|
||||
internal class HueExpressiveSecondary() : Hue {
|
||||
val hueToRotations = listOf(Pair(0, 45), Pair(21, 95), Pair(51, 45), Pair(121, 20),
|
||||
Pair(151, 45), Pair(191, 90), Pair(271, 45), Pair(321, 45), Pair(360, 45))
|
||||
|
||||
override fun get(sourceColor: Cam): Double {
|
||||
return getHueRotation(sourceColor.hue, hueToRotations)
|
||||
}
|
||||
@@ -104,6 +107,7 @@ internal class HueExpressiveSecondary() : Hue {
|
||||
internal class HueExpressiveTertiary() : Hue {
|
||||
val hueToRotations = listOf(Pair(0, 120), Pair(21, 120), Pair(51, 20), Pair(121, 45),
|
||||
Pair(151, 20), Pair(191, 15), Pair(271, 20), Pair(321, 120), Pair(360, 120))
|
||||
|
||||
override fun get(sourceColor: Cam): Double {
|
||||
return getHueRotation(sourceColor.hue, hueToRotations)
|
||||
}
|
||||
@@ -148,11 +152,11 @@ internal class TonalSpec(val hue: Hue = HueSource(), val chroma: Chroma) {
|
||||
}
|
||||
|
||||
internal class CoreSpec(
|
||||
val a1: TonalSpec,
|
||||
val a2: TonalSpec,
|
||||
val a3: TonalSpec,
|
||||
val n1: TonalSpec,
|
||||
val n2: TonalSpec
|
||||
val a1: TonalSpec,
|
||||
val a2: TonalSpec,
|
||||
val a3: TonalSpec,
|
||||
val n1: TonalSpec,
|
||||
val n2: TonalSpec
|
||||
)
|
||||
|
||||
enum class Style(internal val coreSpec: CoreSpec) {
|
||||
@@ -214,51 +218,86 @@ enum class Style(internal val coreSpec: CoreSpec) {
|
||||
)),
|
||||
}
|
||||
|
||||
class TonalPalette {
|
||||
val shadeKeys = listOf(10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)
|
||||
val allShades: List<Int>
|
||||
val allShadesMapped: Map<Int, Int>
|
||||
val baseColor: Int
|
||||
|
||||
internal constructor(spec: TonalSpec, seedColor: Int) {
|
||||
val seedCam = Cam.fromInt(seedColor)
|
||||
allShades = spec.shades(seedCam)
|
||||
allShadesMapped = shadeKeys.zip(allShades).toMap()
|
||||
|
||||
val h = spec.hue.get(seedCam).toFloat()
|
||||
val c = spec.chroma.get(seedCam).toFloat()
|
||||
baseColor = ColorUtils.CAMToColor(h, c, CamUtils.lstarFromInt(seedColor))
|
||||
}
|
||||
|
||||
val s10: Int get() = this.allShades[0]
|
||||
val s50: Int get() = this.allShades[1]
|
||||
val s100: Int get() = this.allShades[2]
|
||||
val s200: Int get() = this.allShades[3]
|
||||
val s300: Int get() = this.allShades[4]
|
||||
val s400: Int get() = this.allShades[5]
|
||||
val s500: Int get() = this.allShades[6]
|
||||
val s600: Int get() = this.allShades[7]
|
||||
val s700: Int get() = this.allShades[8]
|
||||
val s800: Int get() = this.allShades[9]
|
||||
val s900: Int get() = this.allShades[10]
|
||||
val s1000: Int get() = this.allShades[11]
|
||||
}
|
||||
|
||||
class ColorScheme(
|
||||
@ColorInt val seed: Int,
|
||||
val darkTheme: Boolean,
|
||||
val style: Style = Style.TONAL_SPOT
|
||||
@ColorInt val seed: Int,
|
||||
val darkTheme: Boolean,
|
||||
val style: Style = Style.TONAL_SPOT
|
||||
) {
|
||||
|
||||
val accent1: List<Int>
|
||||
val accent2: List<Int>
|
||||
val accent3: List<Int>
|
||||
val neutral1: List<Int>
|
||||
val neutral2: List<Int>
|
||||
val accent1: TonalPalette
|
||||
val accent2: TonalPalette
|
||||
val accent3: TonalPalette
|
||||
val neutral1: TonalPalette
|
||||
val neutral2: TonalPalette
|
||||
|
||||
constructor(@ColorInt seed: Int, darkTheme: Boolean) :
|
||||
this(seed, darkTheme, Style.TONAL_SPOT)
|
||||
|
||||
@JvmOverloads
|
||||
constructor(
|
||||
wallpaperColors: WallpaperColors,
|
||||
darkTheme: Boolean,
|
||||
style: Style = Style.TONAL_SPOT
|
||||
wallpaperColors: WallpaperColors,
|
||||
darkTheme: Boolean,
|
||||
style: Style = Style.TONAL_SPOT
|
||||
) :
|
||||
this(getSeedColor(wallpaperColors, style != Style.CONTENT), darkTheme, style)
|
||||
|
||||
val allHues: List<TonalPalette>
|
||||
get() {
|
||||
return listOf(accent1, accent2, accent3, neutral1, neutral2)
|
||||
}
|
||||
|
||||
val allAccentColors: List<Int>
|
||||
get() {
|
||||
val allColors = mutableListOf<Int>()
|
||||
allColors.addAll(accent1)
|
||||
allColors.addAll(accent2)
|
||||
allColors.addAll(accent3)
|
||||
allColors.addAll(accent1.allShades)
|
||||
allColors.addAll(accent2.allShades)
|
||||
allColors.addAll(accent3.allShades)
|
||||
return allColors
|
||||
}
|
||||
|
||||
val allNeutralColors: List<Int>
|
||||
get() {
|
||||
val allColors = mutableListOf<Int>()
|
||||
allColors.addAll(neutral1)
|
||||
allColors.addAll(neutral2)
|
||||
allColors.addAll(neutral1.allShades)
|
||||
allColors.addAll(neutral2.allShades)
|
||||
return allColors
|
||||
}
|
||||
|
||||
val backgroundColor
|
||||
get() = ColorUtils.setAlphaComponent(if (darkTheme) neutral1[8] else neutral1[0], 0xFF)
|
||||
get() = ColorUtils.setAlphaComponent(if (darkTheme) neutral1.s700 else neutral1.s10, 0xFF)
|
||||
|
||||
val accentColor
|
||||
get() = ColorUtils.setAlphaComponent(if (darkTheme) accent1[2] else accent1[6], 0xFF)
|
||||
get() = ColorUtils.setAlphaComponent(if (darkTheme) accent1.s100 else accent1.s500, 0xFF)
|
||||
|
||||
init {
|
||||
val proposedSeedCam = Cam.fromInt(seed)
|
||||
@@ -269,24 +308,26 @@ class ColorScheme(
|
||||
} else {
|
||||
seed
|
||||
}
|
||||
val camSeed = Cam.fromInt(seedArgb)
|
||||
accent1 = style.coreSpec.a1.shades(camSeed)
|
||||
accent2 = style.coreSpec.a2.shades(camSeed)
|
||||
accent3 = style.coreSpec.a3.shades(camSeed)
|
||||
neutral1 = style.coreSpec.n1.shades(camSeed)
|
||||
neutral2 = style.coreSpec.n2.shades(camSeed)
|
||||
|
||||
accent1 = TonalPalette(style.coreSpec.a1, seedArgb)
|
||||
accent2 = TonalPalette(style.coreSpec.a2, seedArgb)
|
||||
accent3 = TonalPalette(style.coreSpec.a3, seedArgb)
|
||||
neutral1 = TonalPalette(style.coreSpec.n1, seedArgb)
|
||||
neutral2 = TonalPalette(style.coreSpec.n2, seedArgb)
|
||||
}
|
||||
|
||||
val shadeCount get() = this.accent1.allShades.size
|
||||
|
||||
override fun toString(): String {
|
||||
return "ColorScheme {\n" +
|
||||
" seed color: ${stringForColor(seed)}\n" +
|
||||
" style: $style\n" +
|
||||
" palettes: \n" +
|
||||
" ${humanReadable("PRIMARY", accent1)}\n" +
|
||||
" ${humanReadable("SECONDARY", accent2)}\n" +
|
||||
" ${humanReadable("TERTIARY", accent3)}\n" +
|
||||
" ${humanReadable("NEUTRAL", neutral1)}\n" +
|
||||
" ${humanReadable("NEUTRAL VARIANT", neutral2)}\n" +
|
||||
" ${humanReadable("PRIMARY", accent1.allShades)}\n" +
|
||||
" ${humanReadable("SECONDARY", accent2.allShades)}\n" +
|
||||
" ${humanReadable("TERTIARY", accent3.allShades)}\n" +
|
||||
" ${humanReadable("NEUTRAL", neutral1.allShades)}\n" +
|
||||
" ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" +
|
||||
"}"
|
||||
}
|
||||
|
||||
@@ -385,7 +426,8 @@ class ColorScheme(
|
||||
val existingSeedNearby = seeds.find {
|
||||
val hueA = intToCam[int]!!.hue
|
||||
val hueB = intToCam[it]!!.hue
|
||||
hueDiff(hueA, hueB) < i } != null
|
||||
hueDiff(hueA, hueB) < i
|
||||
} != null
|
||||
if (existingSeedNearby) {
|
||||
continue
|
||||
}
|
||||
@@ -460,9 +502,9 @@ class ColorScheme(
|
||||
}
|
||||
|
||||
private fun huePopulations(
|
||||
camByColor: Map<Int, Cam>,
|
||||
populationByColor: Map<Int, Double>,
|
||||
filter: Boolean = true
|
||||
camByColor: Map<Int, Cam>,
|
||||
populationByColor: Map<Int, Double>,
|
||||
filter: Boolean = true
|
||||
): List<Double> {
|
||||
val huePopulation = List(size = 360, init = { 0.0 }).toMutableList()
|
||||
|
||||
|
||||
@@ -162,8 +162,8 @@ internal constructor(
|
||||
context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK ==
|
||||
UI_MODE_NIGHT_YES
|
||||
)
|
||||
colorScheme.accent1[2]
|
||||
else colorScheme.accent1[3]
|
||||
colorScheme.accent1.s100
|
||||
else colorScheme.accent1.s200
|
||||
},
|
||||
{ seamlessColor: Int ->
|
||||
val accentColorList = ColorStateList.valueOf(seamlessColor)
|
||||
|
||||
@@ -19,28 +19,28 @@ package com.android.systemui.media.controls.ui
|
||||
import com.android.systemui.monet.ColorScheme
|
||||
|
||||
/** Returns the surface color for media controls based on the scheme. */
|
||||
internal fun surfaceFromScheme(scheme: ColorScheme) = scheme.accent2[9] // A2-800
|
||||
internal fun surfaceFromScheme(scheme: ColorScheme) = scheme.accent2.s800 // A2-800
|
||||
|
||||
/** Returns the primary accent color for media controls based on the scheme. */
|
||||
internal fun accentPrimaryFromScheme(scheme: ColorScheme) = scheme.accent1[2] // A1-100
|
||||
internal fun accentPrimaryFromScheme(scheme: ColorScheme) = scheme.accent1.s100 // A1-100
|
||||
|
||||
/** Returns the secondary accent color for media controls based on the scheme. */
|
||||
internal fun accentSecondaryFromScheme(scheme: ColorScheme) = scheme.accent1[3] // A1-200
|
||||
internal fun accentSecondaryFromScheme(scheme: ColorScheme) = scheme.accent1.s200 // A1-200
|
||||
|
||||
/** Returns the primary text color for media controls based on the scheme. */
|
||||
internal fun textPrimaryFromScheme(scheme: ColorScheme) = scheme.neutral1[1] // N1-50
|
||||
internal fun textPrimaryFromScheme(scheme: ColorScheme) = scheme.neutral1.s50 // N1-50
|
||||
|
||||
/** Returns the inverse of the primary text color for media controls based on the scheme. */
|
||||
internal fun textPrimaryInverseFromScheme(scheme: ColorScheme) = scheme.neutral1[10] // N1-900
|
||||
internal fun textPrimaryInverseFromScheme(scheme: ColorScheme) = scheme.neutral1.s900 // N1-900
|
||||
|
||||
/** Returns the secondary text color for media controls based on the scheme. */
|
||||
internal fun textSecondaryFromScheme(scheme: ColorScheme) = scheme.neutral2[3] // N2-200
|
||||
internal fun textSecondaryFromScheme(scheme: ColorScheme) = scheme.neutral2.s200 // N2-200
|
||||
|
||||
/** Returns the tertiary text color for media controls based on the scheme. */
|
||||
internal fun textTertiaryFromScheme(scheme: ColorScheme) = scheme.neutral2[5] // N2-400
|
||||
internal fun textTertiaryFromScheme(scheme: ColorScheme) = scheme.neutral2.s400 // N2-400
|
||||
|
||||
/** Returns the color for the start of the background gradient based on the scheme. */
|
||||
internal fun backgroundStartFromScheme(scheme: ColorScheme) = scheme.accent2[8] // A2-700
|
||||
internal fun backgroundStartFromScheme(scheme: ColorScheme) = scheme.accent2.s700 // A2-700
|
||||
|
||||
/** Returns the color for the end of the background gradient based on the scheme. */
|
||||
internal fun backgroundEndFromScheme(scheme: ColorScheme) = scheme.accent1[8] // A1-700
|
||||
internal fun backgroundEndFromScheme(scheme: ColorScheme) = scheme.accent1.s700 // A1-700
|
||||
|
||||
@@ -493,20 +493,20 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
ColorScheme mCurrentColorScheme = new ColorScheme(wallpaperColors,
|
||||
isDarkTheme);
|
||||
if (isDarkTheme) {
|
||||
mColorItemContent = mCurrentColorScheme.getAccent1().get(2); // A1-100
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent2().get(7); // A2-600
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent1().get(4); // A1-300
|
||||
mColorItemBackground = mCurrentColorScheme.getNeutral2().get(9); // N2-800
|
||||
mColorConnectedItemBackground = mCurrentColorScheme.getAccent2().get(9); // A2-800
|
||||
mColorPositiveButtonText = mCurrentColorScheme.getAccent2().get(9); // A2-800
|
||||
mColorDialogBackground = mCurrentColorScheme.getNeutral1().get(10); // N1-900
|
||||
mColorItemContent = mCurrentColorScheme.getAccent1().getS100(); // A1-100
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent2().getS600(); // A2-600
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent1().getS300(); // A1-300
|
||||
mColorItemBackground = mCurrentColorScheme.getNeutral2().getS800(); // N2-800
|
||||
mColorConnectedItemBackground = mCurrentColorScheme.getAccent2().getS800(); // A2-800
|
||||
mColorPositiveButtonText = mCurrentColorScheme.getAccent2().getS800(); // A2-800
|
||||
mColorDialogBackground = mCurrentColorScheme.getNeutral1().getS900(); // N1-900
|
||||
} else {
|
||||
mColorItemContent = mCurrentColorScheme.getAccent1().get(9); // A1-800
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent1().get(4); // A1-300
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent1().get(7); // A1-600
|
||||
mColorItemBackground = mCurrentColorScheme.getAccent2().get(1); // A2-50
|
||||
mColorConnectedItemBackground = mCurrentColorScheme.getAccent1().get(2); // A1-100
|
||||
mColorPositiveButtonText = mCurrentColorScheme.getNeutral1().get(1); // N1-50
|
||||
mColorItemContent = mCurrentColorScheme.getAccent1().getS800(); // A1-800
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent1().getS300(); // A1-300
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent1().getS600(); // A1-600
|
||||
mColorItemBackground = mCurrentColorScheme.getAccent2().getS50(); // A2-50
|
||||
mColorConnectedItemBackground = mCurrentColorScheme.getAccent1().getS100(); // A1-100
|
||||
mColorPositiveButtonText = mCurrentColorScheme.getNeutral1().getS50(); // N1-50
|
||||
mColorDialogBackground = mCurrentColorScheme.getBackgroundColor();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_COLOR_INDEX
|
||||
import static com.android.systemui.theme.ThemeOverlayApplier.OVERLAY_COLOR_SOURCE;
|
||||
import static com.android.systemui.theme.ThemeOverlayApplier.TIMESTAMP_FIELD;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.WallpaperColors;
|
||||
import android.app.WallpaperManager;
|
||||
import android.app.WallpaperManager.OnColorsChangedListener;
|
||||
@@ -70,6 +69,7 @@ import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.keyguard.WakefulnessLifecycle;
|
||||
import com.android.systemui.monet.ColorScheme;
|
||||
import com.android.systemui.monet.Style;
|
||||
import com.android.systemui.monet.TonalPalette;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
|
||||
@@ -513,39 +513,42 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
|
||||
/**
|
||||
* Given a color candidate, return an overlay definition.
|
||||
*/
|
||||
protected @Nullable FabricatedOverlay getOverlay(int color, int type, Style style) {
|
||||
protected FabricatedOverlay getOverlay(int color, int type, Style style) {
|
||||
boolean nightMode = (mResources.getConfiguration().uiMode
|
||||
& Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
|
||||
|
||||
mColorScheme = new ColorScheme(color, nightMode, style);
|
||||
List<Integer> colorShades = type == ACCENT
|
||||
? mColorScheme.getAllAccentColors() : mColorScheme.getAllNeutralColors();
|
||||
String name = type == ACCENT ? "accent" : "neutral";
|
||||
int paletteSize = mColorScheme.getAccent1().size();
|
||||
|
||||
FabricatedOverlay.Builder overlay =
|
||||
new FabricatedOverlay.Builder("com.android.systemui", name, "android");
|
||||
for (int i = 0; i < colorShades.size(); i++) {
|
||||
int luminosity = i % paletteSize;
|
||||
int paletteIndex = i / paletteSize + 1;
|
||||
String resourceName;
|
||||
switch (luminosity) {
|
||||
case 0:
|
||||
resourceName = "android:color/system_" + name + paletteIndex + "_10";
|
||||
break;
|
||||
case 1:
|
||||
resourceName = "android:color/system_" + name + paletteIndex + "_50";
|
||||
break;
|
||||
default:
|
||||
int l = luminosity - 1;
|
||||
resourceName = "android:color/system_" + name + paletteIndex + "_" + l + "00";
|
||||
}
|
||||
overlay.setResourceValue(resourceName, TypedValue.TYPE_INT_COLOR_ARGB8,
|
||||
ColorUtils.setAlphaComponent(colorShades.get(i), 0xFF));
|
||||
|
||||
if (type == ACCENT) {
|
||||
assignTonalPaletteToOverlay("accent1", overlay, mColorScheme.getAccent1());
|
||||
assignTonalPaletteToOverlay("accent2", overlay, mColorScheme.getAccent2());
|
||||
assignTonalPaletteToOverlay("accent3", overlay, mColorScheme.getAccent3());
|
||||
} else {
|
||||
assignTonalPaletteToOverlay("neutral1", overlay, mColorScheme.getNeutral1());
|
||||
assignTonalPaletteToOverlay("neutral2", overlay, mColorScheme.getNeutral2());
|
||||
}
|
||||
|
||||
return overlay.build();
|
||||
}
|
||||
|
||||
private void assignTonalPaletteToOverlay(String name,
|
||||
FabricatedOverlay.Builder overlay, TonalPalette tonalPalette) {
|
||||
|
||||
String resourcePrefix = "android:color/system_" + name;
|
||||
int colorDataType = TypedValue.TYPE_INT_COLOR_ARGB8;
|
||||
|
||||
tonalPalette.getAllShadesMapped().forEach((key, value) -> {
|
||||
String resourceName = resourcePrefix + "_" + key;
|
||||
int colorValue = ColorUtils.setAlphaComponent(value, 0xFF);
|
||||
overlay.setResourceValue(resourceName, colorDataType,
|
||||
colorValue);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the color scheme in mColorScheme matches the current system palettes.
|
||||
* @param managedProfiles List of managed profiles for this user.
|
||||
@@ -557,15 +560,15 @@ public class ThemeOverlayController implements CoreStartable, Dumpable {
|
||||
Resources res = userHandle.isSystem()
|
||||
? mResources : mContext.createContextAsUser(userHandle, 0).getResources();
|
||||
if (!(res.getColor(android.R.color.system_accent1_500, mContext.getTheme())
|
||||
== mColorScheme.getAccent1().get(6)
|
||||
== mColorScheme.getAccent1().getS500()
|
||||
&& res.getColor(android.R.color.system_accent2_500, mContext.getTheme())
|
||||
== mColorScheme.getAccent2().get(6)
|
||||
== mColorScheme.getAccent2().getS500()
|
||||
&& res.getColor(android.R.color.system_accent3_500, mContext.getTheme())
|
||||
== mColorScheme.getAccent3().get(6)
|
||||
== mColorScheme.getAccent3().getS500()
|
||||
&& res.getColor(android.R.color.system_neutral1_500, mContext.getTheme())
|
||||
== mColorScheme.getNeutral1().get(6)
|
||||
== mColorScheme.getNeutral1().getS500()
|
||||
&& res.getColor(android.R.color.system_neutral2_500, mContext.getTheme())
|
||||
== mColorScheme.getNeutral2().get(6))) {
|
||||
== mColorScheme.getNeutral2().getS500())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,7 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
@@ -69,7 +66,7 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
// Expressive applies hue rotations to the theme color. The input theme color has hue
|
||||
// 117, ensuring the hue changed significantly is a strong signal styles are being applied.
|
||||
ColorScheme colorScheme = new ColorScheme(wallpaperColors, false, Style.EXPRESSIVE);
|
||||
Assert.assertEquals(357.77, Cam.fromInt(colorScheme.getAccent1().get(6)).getHue(), 0.1);
|
||||
Assert.assertEquals(357.77, Cam.fromInt(colorScheme.getAccent1().getS500()).getHue(), 0.1);
|
||||
}
|
||||
|
||||
|
||||
@@ -111,7 +108,8 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
public void testTertiaryHueWrapsProperly() {
|
||||
int colorInt = 0xffB3588A; // H350 C50 T50
|
||||
ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */);
|
||||
int tertiaryMid = colorScheme.getAccent3().get(colorScheme.getAccent3().size() / 2);
|
||||
int tertiaryMid = colorScheme.getAccent3().getAllShades().get(
|
||||
colorScheme.getShadeCount() / 2);
|
||||
Cam cam = Cam.fromInt(tertiaryMid);
|
||||
Assert.assertEquals(cam.getHue(), 50.0, 10.0);
|
||||
}
|
||||
@@ -121,7 +119,8 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
int colorInt = 0xffB3588A; // H350 C50 T50
|
||||
ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
|
||||
Style.SPRITZ /* style */);
|
||||
int primaryMid = colorScheme.getAccent1().get(colorScheme.getAccent1().size() / 2);
|
||||
int primaryMid = colorScheme.getAccent1().getAllShades().get(
|
||||
colorScheme.getShadeCount() / 2);
|
||||
Cam cam = Cam.fromInt(primaryMid);
|
||||
Assert.assertEquals(cam.getChroma(), 12.0, 1.0);
|
||||
}
|
||||
@@ -131,7 +130,8 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
int colorInt = 0xffB3588A; // H350 C50 T50
|
||||
ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
|
||||
Style.VIBRANT /* style */);
|
||||
int neutralMid = colorScheme.getNeutral1().get(colorScheme.getNeutral1().size() / 2);
|
||||
int neutralMid = colorScheme.getNeutral1().getAllShades().get(
|
||||
colorScheme.getShadeCount() / 2);
|
||||
Cam cam = Cam.fromInt(neutralMid);
|
||||
Assert.assertTrue("chroma was " + cam.getChroma(), Math.floor(cam.getChroma()) <= 12.0);
|
||||
}
|
||||
@@ -141,7 +141,8 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
int colorInt = 0xffB3588A; // H350 C50 T50
|
||||
ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
|
||||
Style.EXPRESSIVE /* style */);
|
||||
int neutralMid = colorScheme.getNeutral1().get(colorScheme.getNeutral1().size() / 2);
|
||||
int neutralMid = colorScheme.getNeutral1().getAllShades().get(
|
||||
colorScheme.getShadeCount() / 2);
|
||||
Cam cam = Cam.fromInt(neutralMid);
|
||||
Assert.assertTrue(cam.getChroma() <= 8.0);
|
||||
}
|
||||
@@ -151,10 +152,11 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
int colorInt = 0xffB3588A; // H350 C50 T50
|
||||
ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
|
||||
Style.MONOCHROMATIC /* style */);
|
||||
int neutralMid = colorScheme.getNeutral1().get(colorScheme.getNeutral1().size() / 2);
|
||||
int neutralMid = colorScheme.getNeutral1().getAllShades().get(
|
||||
colorScheme.getShadeCount() / 2);
|
||||
Assert.assertTrue(
|
||||
Color.red(neutralMid) == Color.green(neutralMid)
|
||||
&& Color.green(neutralMid) == Color.blue(neutralMid)
|
||||
&& Color.green(neutralMid) == Color.blue(neutralMid)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -190,15 +192,14 @@ public class ColorSchemeTest extends SysuiTestCase {
|
||||
xml.append(" <").append(styleName).append(">");
|
||||
|
||||
List<String> colors = new ArrayList<>();
|
||||
for (Stream<Integer> stream: Arrays.asList(colorScheme.getAccent1().stream(),
|
||||
colorScheme.getAccent2().stream(),
|
||||
colorScheme.getAccent3().stream(),
|
||||
colorScheme.getNeutral1().stream(),
|
||||
colorScheme.getNeutral2().stream())) {
|
||||
|
||||
colorScheme.getAllHues().forEach(schemeHue -> {
|
||||
colors.add("ffffff");
|
||||
colors.addAll(stream.map(Integer::toHexString).map(s -> s.substring(2)).collect(
|
||||
Collectors.toList()));
|
||||
}
|
||||
schemeHue.getAllShades().forEach(tone -> {
|
||||
colors.add(Integer.toHexString(tone).substring(2));
|
||||
});
|
||||
});
|
||||
|
||||
xml.append(String.join(",", colors));
|
||||
xml.append("</").append(styleName).append(">\n");
|
||||
}
|
||||
|
||||
@@ -790,15 +790,15 @@ public class ThemeOverlayControllerTest extends SysuiTestCase {
|
||||
|
||||
reset(mResources);
|
||||
when(mResources.getColor(eq(android.R.color.system_accent1_500), any()))
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent1().get(6));
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent1().getS500());
|
||||
when(mResources.getColor(eq(android.R.color.system_accent2_500), any()))
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent2().get(6));
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent2().getS500());
|
||||
when(mResources.getColor(eq(android.R.color.system_accent3_500), any()))
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent3().get(6));
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getAccent3().getS500());
|
||||
when(mResources.getColor(eq(android.R.color.system_neutral1_500), any()))
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral1().get(6));
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral1().getS500());
|
||||
when(mResources.getColor(eq(android.R.color.system_neutral2_500), any()))
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral2().get(6));
|
||||
.thenReturn(mThemeOverlayController.mColorScheme.getNeutral2().getS500());
|
||||
|
||||
// Defers event because we already have initial colors.
|
||||
verify(mThemeOverlayApplier, never())
|
||||
|
||||
Reference in New Issue
Block a user