Browse Source

Force app theme change when status bar theme changes on android.

Emmanuel Hansen 2 years ago
parent
commit
34c1b46b30

+ 1 - 1
samples/ControlCatalog.Android/Resources/values/styles.xml

@@ -4,7 +4,7 @@
   <style name="MyTheme">
   <style name="MyTheme">
   </style>
   </style>
 
 
-  <style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.NoActionBar">
+  <style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.DayNight.NoActionBar">
     <item name="android:windowActionBar">false</item>
     <item name="android:windowActionBar">false</item>
     <item name="android:windowNoTitle">true</item>
     <item name="android:windowNoTitle">true</item>
   </style>
   </style>

+ 2 - 2
samples/ControlCatalog/MainView.xaml.cs

@@ -122,7 +122,7 @@ namespace ControlCatalog
                 };
                 };
 
 
                 ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
                 ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
-                ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? false;
+                ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? true;
 
 
                 ViewModel.PropertyChanged += async (sender, args) =>
                 ViewModel.PropertyChanged += async (sender, args) =>
                 {
                 {
@@ -138,7 +138,7 @@ namespace ControlCatalog
                     // Give the OS some time to apply new values and refresh the view model.
                     // Give the OS some time to apply new values and refresh the view model.
                     await Task.Delay(100);
                     await Task.Delay(100);
                     ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
                     ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
-                    ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? false;
+                    ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? true;
                 };
                 };
             }
             }
 
 

+ 3 - 0
src/Android/Avalonia.Android/AvaloniaMainActivity.cs

@@ -33,6 +33,9 @@ namespace Avalonia.Android
                 lifetime.View = View;
                 lifetime.View = View;
             }
             }
 
 
+            Window?.ClearFlags(WindowManagerFlags.TranslucentStatus);
+            Window?.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
+
             base.OnCreate(savedInstanceState);
             base.OnCreate(savedInstanceState);
 
 
             SetContentView(View);
             SetContentView(View);

+ 10 - 1
src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Collections.Generic;
 using Android.OS;
 using Android.OS;
 using Android.Views;
 using Android.Views;
+using AndroidX.AppCompat.App;
 using AndroidX.Core.View;
 using AndroidX.Core.View;
 using Avalonia.Android.Platform.SkiaPlatform;
 using Avalonia.Android.Platform.SkiaPlatform;
 using Avalonia.Controls.Platform;
 using Avalonia.Controls.Platform;
@@ -124,6 +125,8 @@ namespace Avalonia.Android.Platform
             {
             {
                 _statusBarTheme = value;
                 _statusBarTheme = value;
 
 
+                var isDefault = _statusBarTheme == null;
+
                 if (!_topLevel.View.IsShown)
                 if (!_topLevel.View.IsShown)
                 {
                 {
                     return;
                     return;
@@ -143,6 +146,8 @@ namespace Avalonia.Android.Platform
 
 
                 compat.AppearanceLightStatusBars = value == Controls.Platform.SystemBarTheme.Light;
                 compat.AppearanceLightStatusBars = value == Controls.Platform.SystemBarTheme.Light;
                 compat.AppearanceLightNavigationBars = value == Controls.Platform.SystemBarTheme.Light;
                 compat.AppearanceLightNavigationBars = value == Controls.Platform.SystemBarTheme.Light;
+
+                AppCompatDelegate.DefaultNightMode = isDefault ? AppCompatDelegate.ModeNightFollowSystem : compat.AppearanceLightStatusBars ? AppCompatDelegate.ModeNightNo : AppCompatDelegate.ModeNightYes;
             }
             }
         }
         }
 
 
@@ -150,7 +155,11 @@ namespace Avalonia.Android.Platform
         {
         {
             get
             get
             {
             {
-                var compat = ViewCompat.GetRootWindowInsets(_topLevel.View);
+                if(_activity.Window == null)
+                {
+                    return true;
+                }
+                var compat = ViewCompat.GetRootWindowInsets(_activity.Window.DecorView);
 
 
                 return compat?.IsVisible(WindowInsetsCompat.Type.StatusBars() | WindowInsetsCompat.Type.NavigationBars());
                 return compat?.IsVisible(WindowInsetsCompat.Type.StatusBars() | WindowInsetsCompat.Type.NavigationBars());
             }
             }