|
@@ -0,0 +1,73 @@
|
|
|
+using System;
|
|
|
+using Android;
|
|
|
+using Android.Content;
|
|
|
+using Android.Content.Res;
|
|
|
+using Android.Graphics;
|
|
|
+using AndroidX.Core.Content.Resources;
|
|
|
+using Avalonia.Media;
|
|
|
+using Avalonia.Platform;
|
|
|
+using Color = Avalonia.Media.Color;
|
|
|
+
|
|
|
+namespace Avalonia.Android.Platform;
|
|
|
+
|
|
|
+// TODO: ideally should be created per view/activity.
|
|
|
+internal class AndroidPlatformSettings : DefaultPlatformSettings
|
|
|
+{
|
|
|
+ private PlatformColorValues _latestValues;
|
|
|
+
|
|
|
+ public AndroidPlatformSettings()
|
|
|
+ {
|
|
|
+ _latestValues = base.GetColorValues();
|
|
|
+ }
|
|
|
+
|
|
|
+ public override PlatformColorValues GetColorValues()
|
|
|
+ {
|
|
|
+ return _latestValues;
|
|
|
+ }
|
|
|
+
|
|
|
+ internal void OnViewConfigurationChanged(Context context)
|
|
|
+ {
|
|
|
+ if (context.Resources?.Configuration is null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var systemTheme = (context.Resources.Configuration.UiMode & UiMode.NightMask) switch
|
|
|
+ {
|
|
|
+ UiMode.NightYes => PlatformThemeVariant.Dark,
|
|
|
+ UiMode.NightNo => PlatformThemeVariant.Light,
|
|
|
+ _ => throw new ArgumentOutOfRangeException()
|
|
|
+ };
|
|
|
+
|
|
|
+ if (OperatingSystem.IsAndroidVersionAtLeast(31))
|
|
|
+ {
|
|
|
+ // See https://developer.android.com/reference/android/R.color
|
|
|
+ var accent1 = context.Resources.GetColor(17170494, context.Theme); // Resource.Color.SystemAccent1500
|
|
|
+ var accent2 = context.Resources.GetColor(17170507, context.Theme); // Resource.Color.SystemAccent2500
|
|
|
+ var accent3 = context.Resources.GetColor(17170520, context.Theme); // Resource.Color.SystemAccent3500
|
|
|
+
|
|
|
+ _latestValues = new PlatformColorValues(
|
|
|
+ systemTheme,
|
|
|
+ new Color(accent1.A, accent1.R, accent1.G, accent1.B),
|
|
|
+ new Color(accent2.A, accent2.R, accent2.G, accent2.B),
|
|
|
+ new Color(accent3.A, accent3.R, accent3.G, accent3.B));
|
|
|
+ }
|
|
|
+ else if (OperatingSystem.IsAndroidVersionAtLeast(23))
|
|
|
+ {
|
|
|
+ // See https://developer.android.com/reference/android/R.attr
|
|
|
+ var array = context.Theme.ObtainStyledAttributes(new[] { 16843829 }); // Resource.Attribute.ColorAccent
|
|
|
+ var accent = array.GetColor(0, 0);
|
|
|
+
|
|
|
+ _latestValues = new PlatformColorValues(
|
|
|
+ systemTheme,
|
|
|
+ new Color(accent.A, accent.R, accent.G, accent.B));
|
|
|
+ array.Recycle();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _latestValues = _latestValues with { ThemeVariant = systemTheme };
|
|
|
+ }
|
|
|
+
|
|
|
+ OnColorValuesChanged(_latestValues);
|
|
|
+ }
|
|
|
+}
|