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