From c06fe8ca58335f3d4738b6e7ce53544cb01f7b56 Mon Sep 17 00:00:00 2001
From: Brandon Minnick <13558917+brminnick@users.noreply.github.com>
Date: Tue, 4 Feb 2025 12:33:05 -0800
Subject: [PATCH] Add `event EventHandler
ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted` to allowunit
tests confirm that we initialized the AndroidDialogFragmentService
---
.../AppBuilderExtensions.shared.cs | 16 +++-
.../Extensions/AppBuilderExtensionsTests.cs | 89 +++++++++++++++----
2 files changed, 88 insertions(+), 17 deletions(-)
diff --git a/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs b/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs
index be5b66415..179613b4d 100644
--- a/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs
+++ b/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs
@@ -17,6 +17,15 @@ namespace CommunityToolkit.Maui.Core;
[SupportedOSPlatform("Tizen6.5")]
public static class AppBuilderExtensions
{
+ static readonly WeakEventManager weakEventManager = new();
+
+ // This is an internal event used by Unit Tests to confirm when the code enters the `if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)` block
+ internal static event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted
+ {
+ add => weakEventManager.AddEventHandler(value);
+ remove => weakEventManager.RemoveEventHandler(value);
+ }
+
///
/// Initializes the .NET MAUI Community Toolkit Core Library
///
@@ -27,9 +36,10 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
{
options?.Invoke(new Options());
-#if ANDROID
if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)
{
+
+#if ANDROID
builder.Services.AddSingleton();
builder.ConfigureLifecycleEvents(static lifecycleBuilder =>
@@ -58,9 +68,11 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
});
});
});
- }
#endif
+ weakEventManager.HandleEvent(null, EventArgs.Empty, nameof(ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted));
+ }
+
return builder;
}
}
\ No newline at end of file
diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs
index d01d11295..4c9a6e977 100644
--- a/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs
+++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs
@@ -3,52 +3,101 @@
namespace CommunityToolkit.Maui.UnitTests.Extensions;
+#pragma warning disable CA1416
public class AppBuilderExtensionsTests : BaseTest
{
[Fact]
public void ConfirmOptionsDefaultValue()
{
+ // Arrange
+ bool isAndroidDialogFragmentServiceInitialized = false;
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+
// Assert
Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
Assert.False(Options.ShouldEnableSnackbarOnWindows);
Assert.False(Options.ShouldSuppressExceptionsInAnimations);
Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
Assert.False(Options.ShouldSuppressExceptionsInConverters);
- }
-
- [Fact]
+ Assert.False(isAndroidDialogFragmentServiceInitialized);
+
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+
+ void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
+ {
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+ isAndroidDialogFragmentServiceInitialized = true;
+ }
+ }
+
+ [Fact]
+ public void ConfirmDefaultValueRemainWhenOptionsNull()
+ {
+ // Arrange
+ var builder = MauiApp.CreateBuilder();
+ bool isAndroidDialogFragmentServiceInitialized = false;
+
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+
+ // Act
+ builder.UseMauiCommunityToolkit(null);
+
+ // Assert
+ Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
+ Assert.False(Options.ShouldEnableSnackbarOnWindows);
+ Assert.False(Options.ShouldSuppressExceptionsInAnimations);
+ Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
+ Assert.False(Options.ShouldSuppressExceptionsInConverters);
+ Assert.True(isAndroidDialogFragmentServiceInitialized);
+
+ void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
+ {
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+ isAndroidDialogFragmentServiceInitialized = true;
+ }
+ }
+
+
+ [Fact]
public void UseMauiCommunityToolkit_ShouldRegisterServices()
{
// Arrange
var builder = MauiApp.CreateBuilder();
+ bool isAndroidDialogFragmentServiceInitialized = false;
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
- // Act
-#pragma warning disable CA1416
- builder.UseMauiCommunityToolkit();
-#pragma warning restore CA1416
+ // Act
+ builder.UseMauiCommunityToolkit();
// Assert
var serviceProvider = builder.Services.BuildServiceProvider();
Assert.NotNull(serviceProvider.GetService());
- }
+ Assert.True(isAndroidDialogFragmentServiceInitialized);
+
+ void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
+ {
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+ isAndroidDialogFragmentServiceInitialized = true;
+ }
+ }
[Fact]
public void UseMauiCommunityToolkit_ShouldAssignValues()
{
// Arrange
var builder = MauiApp.CreateBuilder();
+ bool isAndroidDialogFragmentServiceInitialized = false;
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
- // Act
-#pragma warning disable CA1416
- builder.UseMauiCommunityToolkit(options =>
+ // Act
+ builder.UseMauiCommunityToolkit(options =>
{
options.SetShouldEnableSnackbarOnWindows(!Options.ShouldEnableSnackbarOnWindows);
- options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
options.SetShouldSuppressExceptionsInAnimations(!Options.ShouldSuppressExceptionsInAnimations);
options.SetShouldSuppressExceptionsInBehaviors(!Options.ShouldSuppressExceptionsInBehaviors);
options.SetShouldSuppressExceptionsInConverters(!Options.ShouldSuppressExceptionsInConverters);
+ options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
});
-#pragma warning restore CA1416
// Assert
Assert.False(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
@@ -56,5 +105,15 @@ public void UseMauiCommunityToolkit_ShouldAssignValues()
Assert.True(Options.ShouldSuppressExceptionsInAnimations);
Assert.True(Options.ShouldSuppressExceptionsInBehaviors);
Assert.True(Options.ShouldSuppressExceptionsInConverters);
- }
-}
\ No newline at end of file
+ Assert.False(isAndroidDialogFragmentServiceInitialized);
+
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+
+ void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
+ {
+ Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
+ isAndroidDialogFragmentServiceInitialized = true;
+ }
+ }
+}
+#pragma warning restore CA1416
\ No newline at end of file