diff --git a/samples/BindingDemo/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml
index 08ac0426ea..d1c65ca73b 100644
--- a/samples/BindingDemo/MainWindow.xaml
+++ b/samples/BindingDemo/MainWindow.xaml
@@ -75,11 +75,11 @@
-
+
-
+
diff --git a/samples/ControlCatalog.Android/MainActivity.cs b/samples/ControlCatalog.Android/MainActivity.cs
index f6fa07dbde..486d14661e 100644
--- a/samples/ControlCatalog.Android/MainActivity.cs
+++ b/samples/ControlCatalog.Android/MainActivity.cs
@@ -5,7 +5,7 @@ using Avalonia.Android;
namespace ControlCatalog.Android
{
- [Activity(Label = "ControlCatalog.Android", Theme = "@style/MyTheme.Main", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize)]
+ [Activity(Label = "ControlCatalog.Android", Theme = "@style/MyTheme.Main", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
public class MainActivity : AvaloniaMainActivity
{
}
diff --git a/samples/ControlCatalog.Android/Resources/values-night/colors.xml b/samples/ControlCatalog.Android/Resources/values-night/colors.xml
new file mode 100644
index 0000000000..3d47b6fc58
--- /dev/null
+++ b/samples/ControlCatalog.Android/Resources/values-night/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #212121
+
diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index 9f06525821..7ed2d67379 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -147,9 +147,6 @@
-
-
-
diff --git a/samples/ControlCatalog/Pages/ScrollSnapPage.xaml b/samples/ControlCatalog/Pages/ScrollSnapPage.xaml
deleted file mode 100644
index fa206f0dff..0000000000
--- a/samples/ControlCatalog/Pages/ScrollSnapPage.xaml
+++ /dev/null
@@ -1,222 +0,0 @@
-
-
- Scrollviewer can snap supported content both vertically and horizontally. Snapping occurs from scrolling with touch or pen.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Vertical Snapping
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Horizontal Snapping
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/samples/ControlCatalog/Pages/ScrollSnapPage.xaml.cs b/samples/ControlCatalog/Pages/ScrollSnapPage.xaml.cs
deleted file mode 100644
index 384dc67c66..0000000000
--- a/samples/ControlCatalog/Pages/ScrollSnapPage.xaml.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System.Collections.Generic;
-using Avalonia.Controls;
-using Avalonia.Controls.Primitives;
-using Avalonia.Markup.Xaml;
-using MiniMvvm;
-
-namespace ControlCatalog.Pages
-{
- public class ScrollSnapPageViewModel : ViewModelBase
- {
- private SnapPointsType _snapPointsType;
- private SnapPointsAlignment _snapPointsAlignment;
- private bool _areSnapPointsRegular;
-
- public ScrollSnapPageViewModel()
- {
-
- AvailableSnapPointsType = new List()
- {
- SnapPointsType.None,
- SnapPointsType.Mandatory,
- SnapPointsType.MandatorySingle
- };
-
- AvailableSnapPointsAlignment = new List()
- {
- SnapPointsAlignment.Near,
- SnapPointsAlignment.Center,
- SnapPointsAlignment.Far,
- };
- }
-
- public bool AreSnapPointsRegular
- {
- get => _areSnapPointsRegular;
- set => this.RaiseAndSetIfChanged(ref _areSnapPointsRegular, value);
- }
-
- public SnapPointsType SnapPointsType
- {
- get => _snapPointsType;
- set => this.RaiseAndSetIfChanged(ref _snapPointsType, value);
- }
-
- public SnapPointsAlignment SnapPointsAlignment
- {
- get => _snapPointsAlignment;
- set => this.RaiseAndSetIfChanged(ref _snapPointsAlignment, value);
- }
- public List AvailableSnapPointsType { get; }
- public List AvailableSnapPointsAlignment { get; }
- }
-
- public class ScrollSnapPage : UserControl
- {
- public ScrollSnapPage()
- {
- this.InitializeComponent();
-
- DataContext = new ScrollSnapPageViewModel();
- }
-
- private void InitializeComponent()
- {
- AvaloniaXamlLoader.Load(this);
- }
- }
-}
diff --git a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml
index 1a3d61eb85..4af61c3399 100644
--- a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml
+++ b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml
@@ -3,35 +3,267 @@
xmlns:pages="using:ControlCatalog.Pages"
x:Class="ControlCatalog.Pages.ScrollViewerPage"
x:DataType="pages:ScrollViewerPageViewModel">
-
- Allows for horizontal and vertical content scrolling. Supports snapping on touch and pointer wheel scrolling.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Allows for horizontal and vertical content scrolling. Supports snapping on touch and pointer wheel scrolling.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scrollviewer can snap supported content both vertically and horizontally. Snapping occurs from scrolling with touch or pen.
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+ Vertical Snapping
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Horizontal Snapping
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
index a097f1f951..7082ca1bf6 100644
--- a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
@@ -12,6 +12,9 @@ namespace ControlCatalog.Pages
private bool _enableInertia;
private ScrollBarVisibility _horizontalScrollVisibility;
private ScrollBarVisibility _verticalScrollVisibility;
+ private SnapPointsType _snapPointsType;
+ private SnapPointsAlignment _snapPointsAlignment;
+ private bool _areSnapPointsRegular;
public ScrollViewerPageViewModel()
{
@@ -23,6 +26,20 @@ namespace ControlCatalog.Pages
ScrollBarVisibility.Disabled,
};
+ AvailableSnapPointsType = new List()
+ {
+ SnapPointsType.None,
+ SnapPointsType.Mandatory,
+ SnapPointsType.MandatorySingle
+ };
+
+ AvailableSnapPointsAlignment = new List()
+ {
+ SnapPointsAlignment.Near,
+ SnapPointsAlignment.Center,
+ SnapPointsAlignment.Far,
+ };
+
HorizontalScrollVisibility = ScrollBarVisibility.Auto;
VerticalScrollVisibility = ScrollBarVisibility.Auto;
AllowAutoHide = true;
@@ -54,6 +71,26 @@ namespace ControlCatalog.Pages
}
public List AvailableVisibility { get; }
+
+ public bool AreSnapPointsRegular
+ {
+ get => _areSnapPointsRegular;
+ set => this.RaiseAndSetIfChanged(ref _areSnapPointsRegular, value);
+ }
+
+ public SnapPointsType SnapPointsType
+ {
+ get => _snapPointsType;
+ set => this.RaiseAndSetIfChanged(ref _snapPointsType, value);
+ }
+
+ public SnapPointsAlignment SnapPointsAlignment
+ {
+ get => _snapPointsAlignment;
+ set => this.RaiseAndSetIfChanged(ref _snapPointsAlignment, value);
+ }
+ public List AvailableSnapPointsType { get; }
+ public List AvailableSnapPointsAlignment { get; }
}
public class ScrollViewerPage : UserControl
diff --git a/samples/ControlCatalog/Pages/TabControlPage.xaml b/samples/ControlCatalog/Pages/TabControlPage.xaml
index a775056ebe..3a2464e9fd 100644
--- a/samples/ControlCatalog/Pages/TabControlPage.xaml
+++ b/samples/ControlCatalog/Pages/TabControlPage.xaml
@@ -51,7 +51,7 @@
Text="From DataTemplate">
diff --git a/samples/VirtualizationDemo/MainWindow.xaml b/samples/VirtualizationDemo/MainWindow.xaml
index 235f3ef2cc..3aee63c246 100644
--- a/samples/VirtualizationDemo/MainWindow.xaml
+++ b/samples/VirtualizationDemo/MainWindow.xaml
@@ -11,7 +11,7 @@
Margin="16 0 0 0"
Width="150"
Spacing="4">
-
Horiz. ScrollBar
-
Vert. ScrollBar
-
SafeAreaChanged;
@@ -36,6 +36,16 @@ namespace Avalonia.Android.Platform
}
WindowCompat.SetDecorFitsSystemWindows(_activity.Window, !value);
+
+ if(value)
+ {
+ _activity.Window.AddFlags(WindowManagerFlags.TranslucentStatus);
+ _activity.Window.AddFlags(WindowManagerFlags.TranslucentNavigation);
+ }
+ else
+ {
+ SystemBarColor = _systemBarColor;
+ }
}
}
@@ -93,6 +103,7 @@ namespace Avalonia.Android.Platform
public WindowInsetsCompat OnApplyWindowInsets(View v, WindowInsetsCompat insets)
{
NotifySafeAreaChanged(SafeAreaPadding);
+ insets = ViewCompat.OnApplyWindowInsets(v, insets);
return insets;
}
@@ -146,8 +157,6 @@ namespace Avalonia.Android.Platform
compat.AppearanceLightStatusBars = value == Controls.Platform.SystemBarTheme.Light;
compat.AppearanceLightNavigationBars = value == Controls.Platform.SystemBarTheme.Light;
-
- AppCompatDelegate.DefaultNightMode = isDefault ? AppCompatDelegate.ModeNightFollowSystem : compat.AppearanceLightStatusBars ? AppCompatDelegate.ModeNightNo : AppCompatDelegate.ModeNightYes;
}
}
@@ -190,10 +199,36 @@ namespace Avalonia.Android.Platform
}
}
+ public Color? SystemBarColor
+ {
+ get => _systemBarColor;
+ set
+ {
+ _systemBarColor = value;
+
+ if (_systemBarColor is { } color && !_displayEdgeToEdge && _activity.Window != null)
+ {
+ _activity.Window.ClearFlags(WindowManagerFlags.TranslucentStatus);
+ _activity.Window.ClearFlags(WindowManagerFlags.TranslucentNavigation);
+ _activity.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
+
+ var androidColor = global::Android.Graphics.Color.Argb(color.A, color.R, color.G, color.B);
+ _activity.Window.SetStatusBarColor(androidColor);
+
+ if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
+ {
+ // As we can only change the navigation bar's foreground api 26 and newer, we only change the background color if running on those versions
+ _activity.Window.SetNavigationBarColor(androidColor);
+ }
+ }
+ }
+ }
+
internal void ApplyStatusBarState()
{
IsSystemBarVisible = _systemUiVisibility;
SystemBarTheme = _statusBarTheme;
+ SystemBarColor = _systemBarColor;
}
private class InsetsAnimationCallback : WindowInsetsAnimationCompat.Callback
diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
index 17726e6353..126c488d59 100644
--- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
+++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
@@ -9,6 +9,7 @@ using Android.Runtime;
using Android.Text;
using Android.Views;
using Android.Views.InputMethods;
+using AndroidX.AppCompat.App;
using Avalonia.Android.Platform.Specific;
using Avalonia.Android.Platform.Specific.Helpers;
using Avalonia.Android.Platform.Storage;
@@ -286,6 +287,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform
_ => null,
};
}
+
+ AppCompatDelegate.DefaultNightMode = themeVariant == PlatformThemeVariant.Light ? AppCompatDelegate.ModeNightNo : AppCompatDelegate.ModeNightYes;
}
public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => new AcrylicPlatformCompensationLevels(1, 1, 1);
diff --git a/src/Avalonia.Base/AvaloniaObjectExtensions.cs b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
index 9fbf680a5c..0c22213d33 100644
--- a/src/Avalonia.Base/AvaloniaObjectExtensions.cs
+++ b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
@@ -1,6 +1,6 @@
using System;
-using Avalonia.Reactive;
using Avalonia.Data;
+using Avalonia.Reactive;
namespace Avalonia
{
@@ -34,8 +34,8 @@ namespace Avalonia
///
public static IObservable