8 changed files with 163 additions and 3 deletions
@ -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); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,6 @@ |
|||||
|
namespace Avalonia.iOS; |
||||
|
|
||||
|
public class AvaloniaViewController |
||||
|
{ |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using Avalonia.Media; |
||||
|
using Avalonia.Platform; |
||||
|
using Foundation; |
||||
|
using UIKit; |
||||
|
|
||||
|
namespace Avalonia.iOS; |
||||
|
|
||||
|
// TODO: ideally should be created per view/activity.
|
||||
|
internal class PlatformSettings : DefaultPlatformSettings |
||||
|
{ |
||||
|
private PlatformColorValues _lastColorValues; |
||||
|
|
||||
|
public override PlatformColorValues GetColorValues() |
||||
|
{ |
||||
|
var themeVariant = UITraitCollection.CurrentTraitCollection.UserInterfaceStyle == UIUserInterfaceStyle.Dark ? |
||||
|
PlatformThemeVariant.Dark : |
||||
|
PlatformThemeVariant.Light; |
||||
|
|
||||
|
return _lastColorValues = new PlatformColorValues(themeVariant); |
||||
|
} |
||||
|
|
||||
|
public void TraitCollectionDidChange() |
||||
|
{ |
||||
|
var oldColorValues = _lastColorValues; |
||||
|
var colorValues = GetColorValues(); |
||||
|
|
||||
|
if (oldColorValues != colorValues) |
||||
|
{ |
||||
|
OnColorValuesChanged(colorValues); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue