Skip to content

Commit 70db45d

Browse files
Fix options not working for Core (#2491)
* Fix options not working for Core * Update AppBuilderExtensions.shared.cs * Add Unit Tests * Restore default Options after each test * Add `event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted` to allowunit tests confirm that we initialized the AndroidDialogFragmentService * `dotnet format` --------- Co-authored-by: Brandon Minnick <13558917+TheCodeTraveler@users.noreply.github.com> Co-authored-by: Brandon Minnick <13558917+brminnick@users.noreply.github.com>
1 parent be32188 commit 70db45d

File tree

5 files changed

+142
-7
lines changed

5 files changed

+142
-7
lines changed

src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ namespace CommunityToolkit.Maui.Core;
1717
[SupportedOSPlatform("Tizen6.5")]
1818
public static class AppBuilderExtensions
1919
{
20+
static readonly WeakEventManager weakEventManager = new();
21+
22+
// This is an internal event used by Unit Tests to confirm when the code enters the `if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)` block
23+
internal static event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted
24+
{
25+
add => weakEventManager.AddEventHandler(value);
26+
remove => weakEventManager.RemoveEventHandler(value);
27+
}
28+
2029
/// <summary>
2130
/// Initializes the .NET MAUI Community Toolkit Core Library
2231
/// </summary>
@@ -27,9 +36,10 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
2736
{
2837
options?.Invoke(new Options());
2938

39+
if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)
40+
{
41+
3042
#if ANDROID
31-
if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)
32-
{
3343
builder.Services.AddSingleton<IDialogFragmentService, DialogFragmentService>();
3444

3545
builder.ConfigureLifecycleEvents(static lifecycleBuilder =>
@@ -58,9 +68,11 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
5868
});
5969
});
6070
});
61-
}
6271
#endif
6372

73+
weakEventManager.HandleEvent(null, EventArgs.Empty, nameof(ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted));
74+
}
75+
6476
return builder;
6577
}
6678
}

src/CommunityToolkit.Maui.Core/Services/DialogFragmentService.android.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static bool TryConvertToDialogFragment(Fragment fragment, [NotNullWhen(true)] ou
9494
dialogFragment = dialog;
9595
return true;
9696
}
97-
97+
9898
static void HandleStatusBarColor(DialogFragment dialogFragment, AppCompatActivity activity)
9999
{
100100
if (activity.Window is null)

src/CommunityToolkit.Maui.UnitTests/BaseTest.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ protected virtual void Dispose(bool isDisposing)
5757
DeviceDisplay.SetCurrent(null);
5858
DispatcherProvider.SetCurrent(null);
5959

60+
// Restore default options
6061
var options = new Options();
62+
options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(true);
63+
options.SetShouldEnableSnackbarOnWindows(false);
6164
options.SetShouldSuppressExceptionsInAnimations(false);
6265
options.SetShouldSuppressExceptionsInBehaviors(false);
6366
options.SetShouldSuppressExceptionsInConverters(false);
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using CommunityToolkit.Maui.Core;
2+
using Xunit;
3+
4+
namespace CommunityToolkit.Maui.UnitTests.Extensions;
5+
6+
#pragma warning disable CA1416
7+
public class AppBuilderExtensionsTests : BaseTest
8+
{
9+
[Fact]
10+
public void ConfirmOptionsDefaultValue()
11+
{
12+
// Arrange
13+
bool isAndroidDialogFragmentServiceInitialized = false;
14+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
15+
16+
// Assert
17+
Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
18+
Assert.False(Options.ShouldEnableSnackbarOnWindows);
19+
Assert.False(Options.ShouldSuppressExceptionsInAnimations);
20+
Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
21+
Assert.False(Options.ShouldSuppressExceptionsInConverters);
22+
Assert.False(isAndroidDialogFragmentServiceInitialized);
23+
24+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
25+
26+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
27+
{
28+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
29+
isAndroidDialogFragmentServiceInitialized = true;
30+
}
31+
}
32+
33+
[Fact]
34+
public void ConfirmDefaultValueRemainWhenOptionsNull()
35+
{
36+
// Arrange
37+
var builder = MauiApp.CreateBuilder();
38+
bool isAndroidDialogFragmentServiceInitialized = false;
39+
40+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
41+
42+
// Act
43+
builder.UseMauiCommunityToolkit(null);
44+
45+
// Assert
46+
Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
47+
Assert.False(Options.ShouldEnableSnackbarOnWindows);
48+
Assert.False(Options.ShouldSuppressExceptionsInAnimations);
49+
Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
50+
Assert.False(Options.ShouldSuppressExceptionsInConverters);
51+
Assert.True(isAndroidDialogFragmentServiceInitialized);
52+
53+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
54+
{
55+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
56+
isAndroidDialogFragmentServiceInitialized = true;
57+
}
58+
}
59+
60+
61+
[Fact]
62+
public void UseMauiCommunityToolkit_ShouldRegisterServices()
63+
{
64+
// Arrange
65+
var builder = MauiApp.CreateBuilder();
66+
bool isAndroidDialogFragmentServiceInitialized = false;
67+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
68+
69+
// Act
70+
builder.UseMauiCommunityToolkit();
71+
72+
// Assert
73+
var serviceProvider = builder.Services.BuildServiceProvider();
74+
Assert.NotNull(serviceProvider.GetService<IPopupService>());
75+
Assert.True(isAndroidDialogFragmentServiceInitialized);
76+
77+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
78+
{
79+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
80+
isAndroidDialogFragmentServiceInitialized = true;
81+
}
82+
}
83+
84+
[Fact]
85+
public void UseMauiCommunityToolkit_ShouldAssignValues()
86+
{
87+
// Arrange
88+
var builder = MauiApp.CreateBuilder();
89+
bool isAndroidDialogFragmentServiceInitialized = false;
90+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
91+
92+
// Act
93+
builder.UseMauiCommunityToolkit(options =>
94+
{
95+
options.SetShouldEnableSnackbarOnWindows(!Options.ShouldEnableSnackbarOnWindows);
96+
options.SetShouldSuppressExceptionsInAnimations(!Options.ShouldSuppressExceptionsInAnimations);
97+
options.SetShouldSuppressExceptionsInBehaviors(!Options.ShouldSuppressExceptionsInBehaviors);
98+
options.SetShouldSuppressExceptionsInConverters(!Options.ShouldSuppressExceptionsInConverters);
99+
options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
100+
});
101+
102+
// Assert
103+
Assert.False(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
104+
Assert.True(Options.ShouldEnableSnackbarOnWindows);
105+
Assert.True(Options.ShouldSuppressExceptionsInAnimations);
106+
Assert.True(Options.ShouldSuppressExceptionsInBehaviors);
107+
Assert.True(Options.ShouldSuppressExceptionsInConverters);
108+
Assert.False(isAndroidDialogFragmentServiceInitialized);
109+
110+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
111+
112+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
113+
{
114+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
115+
isAndroidDialogFragmentServiceInitialized = true;
116+
}
117+
}
118+
}
119+
#pragma warning restore CA1416

src/CommunityToolkit.Maui/AppBuilderExtensions.shared.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ public static class AppBuilderExtensions
2424
/// <returns><see cref="MauiAppBuilder"/> initialized for <see cref="CommunityToolkit.Maui"/></returns>
2525
public static MauiAppBuilder UseMauiCommunityToolkit(this MauiAppBuilder builder, Action<Options>? options = null)
2626
{
27-
// Pass `null` because `options?.Invoke()` will set options on both `CommunityToolkit.Maui` and `CommunityToolkit.Maui.Core`
28-
builder.UseMauiCommunityToolkitCore(null);
29-
3027
// Invokes options for both `CommunityToolkit.Maui` and `CommunityToolkit.Maui.Core`
3128
options?.Invoke(new Options(builder));
3229

30+
// Pass `null` because `options?.Invoke()` will set options on both `CommunityToolkit.Maui` and `CommunityToolkit.Maui.Core`
31+
// Be sure to call `.UseMauiCommunityToolkitCore(null)` after `options.Invoke(new Options(builder))` to ensure `CommunityToolkit.Maui.Core.Options` have already been set
32+
builder.UseMauiCommunityToolkitCore(null);
33+
3334
builder.Services.AddSingleton<IPopupService, PopupService>();
3435

3536
builder.ConfigureMauiHandlers(static h =>

0 commit comments

Comments
 (0)