Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 109e616

Browse files
jfversluissamhouts
andauthored
Add GetNamedColor for platform specific colors (#10008)
* Implementation * Implement UWP * Update MockPlatformServices.cs * Added to ColorTypeConverter * Update WPFPlatformServices.cs * Added Android Co-authored-by: Samantha Houts <[email protected]>
1 parent 8629dbe commit 109e616

File tree

13 files changed

+301
-2
lines changed

13 files changed

+301
-2
lines changed

Xamarin.Forms.Core.UnitTests/ColorUnitTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,10 @@ public void TestColorTypeConverter()
333333
Assert.Throws<InvalidOperationException>(() => converter.ConvertFromInvariantString("hsv(12, 100%)"));
334334
Assert.Throws<InvalidOperationException>(() => converter.ConvertFromInvariantString("hsva(12, 100%)"));
335335
Assert.Throws<InvalidOperationException>(() => converter.ConvertFromInvariantString("rgba(0,0,255)"));
336+
Assert.AreEqual(Color.FromRgb(0, 122, 255), converter.ConvertFromInvariantString("SystemBlue"));
337+
Assert.AreEqual(Color.FromHex("#FF767676"), converter.ConvertFromInvariantString("SystemChromeHighColor"));
338+
Assert.AreEqual(Color.FromHex("#ff00ddff"), converter.ConvertFromInvariantString("HoloBlueBright"));
339+
Assert.Throws<InvalidOperationException>(() => converter.ConvertFromInvariantString("NonExistentNamedColor"));
336340
}
337341

338342
[Test]

Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,22 @@ public double GetNamedSize (NamedSize size, Type targetElement, bool useOldSizes
7777
}
7878
}
7979

80+
public Color GetNamedColor(string name)
81+
{
82+
// Some mock values to test color type converter
83+
switch (name)
84+
{
85+
case "SystemBlue":
86+
return Color.FromRgb(0, 122, 255);
87+
case "SystemChromeHighColor":
88+
return Color.FromHex("#FF767676");
89+
case "HoloBlueBright":
90+
return Color.FromHex("#ff00ddff");
91+
default:
92+
return Color.Default;
93+
}
94+
}
95+
8096
public void OpenUriAction (Uri uri)
8197
{
8298
if (openUriAction != null)

Xamarin.Forms.Core/ColorTypeConverter.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,10 @@ public override object ConvertFromInvariantString(string value)
272272
if (property != null)
273273
return (Color)property.GetValue(null, null);
274274
}
275+
276+
var namedColor = Device.GetNamedColor(value);
277+
if (namedColor != default)
278+
return namedColor;
275279
}
276280

277281
throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");

Xamarin.Forms.Core/Device.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ public static double GetNamedSize(NamedSize size, Type targetElementType, bool u
247247
return PlatformServices.GetNamedSize(size, targetElementType, useOldSizes);
248248
}
249249

250+
public static Color GetNamedColor(string name)
251+
{
252+
return PlatformServices.GetNamedColor(name);
253+
}
254+
250255
internal static Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
251256
{
252257
return PlatformServices.GetStreamAsync(uri, cancellationToken);

Xamarin.Forms.Core/IPlatformServices.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public interface IPlatformServices
2323

2424
double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSizes);
2525

26+
Color GetNamedColor(string name);
27+
2628
AppTheme RequestedTheme { get; }
2729

2830
Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken);
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
namespace Xamarin.Forms
2+
{
3+
public static class NamedPlatformColor
4+
{
5+
// iOS
6+
public const string SystemBlue = "systemBlue";
7+
public const string SystemGreen = "systemGreen";
8+
public const string SystemIndigo = "systemIndigo";
9+
public const string SystemPink = "systemPink";
10+
public const string SystemPurple = "systemPurple";
11+
public const string SystemRed = "systemRed";
12+
public const string SystemTeal = "systemTeal";
13+
public const string SystemYellow = "systemYellow";
14+
public const string SystemGray = "systemGray";
15+
public const string SystemGray2 = "systemGray2";
16+
public const string SystemGray3 = "systemGray3";
17+
public const string SystemGray4 = "systemGray4";
18+
public const string SystemGray5 = "systemGray5";
19+
public const string SystemGray6 = "systemGray6";
20+
public const string Label = "label";
21+
public const string SecondaryLabel = "secondaryLabel";
22+
public const string TertiaryLabel = "tertiaryLabel";
23+
public const string QuaternaryLabel = "quaternaryLabellabel";
24+
public const string PlaceholderText = "placeholderText";
25+
public const string Separator = "separator";
26+
public const string OpaqueSeparator = "opaqueSeparator";
27+
public const string Link = "link";
28+
29+
// Android
30+
public const string BackgroundDark = "background_dark";
31+
public const string BackgroundLight = "background_light";
32+
public const string Black = "black";
33+
public const string DarkerGray = "darker_gray";
34+
public const string HoloBlueBright = "holo_blue_bright";
35+
public const string HoloBlueDark = "holo_blue_dark";
36+
public const string HoloBlueLight = "holo_blue_light";
37+
public const string HoloGreenDark = "holo_green_dark";
38+
public const string HoloGreenLight = "holo_green_light";
39+
public const string HoloOrangeDark = "holo_orange_dark";
40+
public const string HoloOrangeLight = "holo_orange_light";
41+
public const string HoloPurple = "holo_purple";
42+
public const string HoloRedDark = "holo_red_dark";
43+
public const string HoloRedLight = "holo_red_light";
44+
public const string TabIndicatorText = "tab_indicator_text";
45+
public const string Transparent = "transparent";
46+
public const string White = "white";
47+
public const string WidgetEditTextDark = "widget_edittext_dark";
48+
49+
// UWP
50+
public const string SystemAltLowColor = "SystemAltLowColor";
51+
public const string SystemAltMediumColor = "SystemAltMediumColor";
52+
public const string SystemAltMediumHighColor = "SystemAltMediumHighColor";
53+
public const string SystemAltMediumLowColor = "SystemAltMediumLowColor";
54+
public const string SystemBaseHighColor = "SystemBaseHighColor";
55+
public const string SystemBaseLowColor = "SystemBaseLowColor";
56+
public const string SystemBaseMediumColor = "SystemBaseMediumColor";
57+
public const string SystemBaseMediumHighColor = "SystemBaseMediumHighColor";
58+
public const string SystemBaseMediumLowColor = "SystemBaseMediumLowColor";
59+
public const string SystemChromeAltLowColor = "SystemChromeAltLowColor";
60+
public const string SystemChromeBlackHighColor = "SystemChromeBlackHighColor";
61+
public const string SystemChromeBlackLowColor = "SystemChromeBlackLowColor";
62+
public const string SystemChromeBlackMediumLowColor = "SystemChromeBlackMediumLowColor";
63+
public const string SystemChromeBlackMediumColor = "SystemChromeBlackMediumColor";
64+
public const string SystemChromeDisabledHighColor = "SystemChromeDisabledHighColor";
65+
public const string SystemChromeDisabledLowColor = "SystemChromeDisabledLowColor";
66+
public const string SystemChromeHighColor = "SystemChromeHighColor";
67+
public const string SystemChromeLowColor = "SystemChromeLowColor";
68+
public const string SystemChromeMediumColor = "SystemChromeMediumColor";
69+
public const string SystemChromeMediumLowColor = "SystemChromeMediumLowColor";
70+
public const string SystemChromeWhiteColor = "SystemChromeWhiteColor";
71+
public const string SystemListLowColor = "SystemListLowColor";
72+
public const string SystemListMediumColor = "SystemListMediumColor";
73+
public const string SystemAltHighColor = "SystemAltHighColor";
74+
}
75+
}

Xamarin.Forms.DualScreen.UnitTests/MockPlatformServices.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ public double GetNamedSize(NamedSize size, Type targetElement, bool useOldSizes)
7979
}
8080
}
8181

82+
public Color GetNamedColor(string name)
83+
{
84+
// Not supported on this platform
85+
return Color.Default;
86+
}
87+
8288
public void OpenUriAction(Uri uri)
8389
{
8490
if (openUriAction != null)

Xamarin.Forms.Platform.Android/Forms.cs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@
2121
using Resource = Android.Resource;
2222
using Trace = System.Diagnostics.Trace;
2323
using System.ComponentModel;
24-
using Xamarin.Forms;
24+
using AColor = Android.Graphics.Color;
25+
#if __ANDROID_29__
26+
using AndroidX.Core.Content;
27+
#else
28+
using Android.Support.V4.Content;
29+
#endif
2530

2631
namespace Xamarin.Forms
2732
{
@@ -749,6 +754,75 @@ public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSi
749754
}
750755
}
751756

757+
public Color GetNamedColor(string name)
758+
{
759+
int color;
760+
switch (name)
761+
{
762+
case NamedPlatformColor.BackgroundDark:
763+
color = ContextCompat.GetColor(_context, Resource.Color.BackgroundDark);
764+
break;
765+
case NamedPlatformColor.BackgroundLight:
766+
color = ContextCompat.GetColor(_context, Resource.Color.BackgroundLight);
767+
break;
768+
case NamedPlatformColor.Black:
769+
color = ContextCompat.GetColor(_context, Resource.Color.Black);
770+
break;
771+
case NamedPlatformColor.DarkerGray:
772+
color = ContextCompat.GetColor(_context, Resource.Color.DarkerGray);
773+
break;
774+
case NamedPlatformColor.HoloBlueBright:
775+
color = ContextCompat.GetColor(_context, Resource.Color.HoloBlueBright);
776+
break;
777+
case NamedPlatformColor.HoloBlueDark:
778+
color = ContextCompat.GetColor(_context, Resource.Color.HoloBlueDark);
779+
break;
780+
case NamedPlatformColor.HoloBlueLight:
781+
color = ContextCompat.GetColor(_context, Resource.Color.HoloBlueLight);
782+
break;
783+
case NamedPlatformColor.HoloGreenDark:
784+
color = ContextCompat.GetColor(_context, Resource.Color.HoloGreenDark);
785+
break;
786+
case NamedPlatformColor.HoloGreenLight:
787+
color = ContextCompat.GetColor(_context, Resource.Color.HoloGreenLight);
788+
break;
789+
case NamedPlatformColor.HoloOrangeDark:
790+
color = ContextCompat.GetColor(_context, Resource.Color.HoloOrangeDark);
791+
break;
792+
case NamedPlatformColor.HoloOrangeLight:
793+
color = ContextCompat.GetColor(_context, Resource.Color.HoloOrangeLight);
794+
break;
795+
case NamedPlatformColor.HoloPurple:
796+
color = ContextCompat.GetColor(_context, Resource.Color.HoloPurple);
797+
break;
798+
case NamedPlatformColor.HoloRedDark:
799+
color = ContextCompat.GetColor(_context, Resource.Color.HoloRedDark);
800+
break;
801+
case NamedPlatformColor.HoloRedLight:
802+
color = ContextCompat.GetColor(_context, Resource.Color.HoloRedLight);
803+
break;
804+
case NamedPlatformColor.TabIndicatorText:
805+
color = ContextCompat.GetColor(_context, Resource.Color.TabIndicatorText);
806+
break;
807+
case NamedPlatformColor.Transparent:
808+
color = ContextCompat.GetColor(_context, Resource.Color.Transparent);
809+
break;
810+
case NamedPlatformColor.White:
811+
color = ContextCompat.GetColor(_context, Resource.Color.White);
812+
break;
813+
case NamedPlatformColor.WidgetEditTextDark:
814+
color = ContextCompat.GetColor(_context, Resource.Color.WidgetEditTextDark);
815+
break;
816+
default:
817+
return Color.Default;
818+
}
819+
820+
if (color != 0)
821+
return new AColor(color).ToColor();
822+
823+
return Color.Default;
824+
}
825+
752826
public async Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
753827
{
754828
using (var client = new HttpClient())

Xamarin.Forms.Platform.GTK/GtkPlatformServices.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSi
7272
}
7373
}
7474

75+
public Color GetNamedColor(string name)
76+
{
77+
// Not supported on this platform
78+
return Color.Default;
79+
}
80+
7581
public async Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
7682
{
7783
using (var client = new HttpClient())

Xamarin.Forms.Platform.Tizen/TizenPlatformServices.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSi
9090
return Forms.ConvertToDPFont(pt);
9191
}
9292

93+
public Color GetNamedColor(string name)
94+
{
95+
// Not supported on this platform
96+
return Color.Default;
97+
}
98+
9399
public void OpenUriAction(Uri uri)
94100
{
95101
if (uri == null || uri.AbsoluteUri == null)

Xamarin.Forms.Platform.UAP/WindowsBasePlatformServices.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSi
106106
return size.GetFontSize();
107107
}
108108

109+
public Color GetNamedColor(string name)
110+
{
111+
if (!Windows.UI.Xaml.Application.Current?.Resources.ContainsKey(name) ?? true)
112+
return Color.Default;
113+
114+
return ((Windows.UI.Color)Windows.UI.Xaml.Application.Current?.Resources[name]).ToFormsColor();
115+
}
116+
109117
public async Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
110118
{
111119
using (var client = new HttpClient())

Xamarin.Forms.Platform.WPF/WPFPlatformServices.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ public double GetNamedSize(NamedSize size, Type targetElementType, bool useOldSi
100100
}
101101
}
102102

103+
public Color GetNamedColor(string name)
104+
{
105+
// Not supported on this platform
106+
return Color.Default;
107+
}
108+
103109
public Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
104110
{
105111
var tcs = new TaskCompletionSource<Stream>();

0 commit comments

Comments
 (0)