diff --git a/src/Compatibility/Core/src/Handlers/Shell/Android/ShellFragmentContainer.cs b/src/Compatibility/Core/src/Handlers/Shell/Android/ShellFragmentContainer.cs index 366521322189..b04798e06843 100644 --- a/src/Compatibility/Core/src/Handlers/Shell/Android/ShellFragmentContainer.cs +++ b/src/Compatibility/Core/src/Handlers/Shell/Android/ShellFragmentContainer.cs @@ -22,9 +22,9 @@ public ShellFragmentContainer(ShellContent shellContent, IMauiContext mauiContex public override AView OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _page = ((IShellContentController)ShellContentTab).GetOrCreateContent(); - + var pageMauiContext = _mauiContext.MakeScoped(layoutInflater: inflater, fragmentManager: ChildFragmentManager); - + return new ShellPageContainer(RequireContext(), (IPlatformViewHandler)_page.ToHandler(pageMauiContext), true) { LayoutParameters = new LP(LP.MatchParent, LP.MatchParent) @@ -40,7 +40,9 @@ public override void OnDestroyView() public override void OnDestroy() { - Activity.RunOnUiThread(Dispose); + _mauiContext + .GetDispatcher() + .Dispatch(Dispose); base.OnDestroy(); } diff --git a/src/Compatibility/Core/src/Handlers/Shell/Android/ShellItemRendererBase.cs b/src/Compatibility/Core/src/Handlers/Shell/Android/ShellItemRendererBase.cs index 65bc9a1d8be2..e2f0b8545803 100644 --- a/src/Compatibility/Core/src/Handlers/Shell/Android/ShellItemRendererBase.cs +++ b/src/Compatibility/Core/src/Handlers/Shell/Android/ShellItemRendererBase.cs @@ -292,7 +292,7 @@ protected virtual void HookChildEvents(ShellSection shellSection) protected virtual void OnShellSectionChanged() { - HandleFragmentUpdate(ShellNavigationSource.ShellSectionChanged, ShellSection, null, false); + HandleFragmentUpdate(ShellNavigationSource.ShellSectionChanged, ShellSection, null, false).FireAndForget(); } protected virtual void OnDisplayedPageChanged(Page newPage, Page oldPage) diff --git a/src/Controls/tests/DeviceTests/Elements/Shell/ShellBasicNavigationTestCases.cs b/src/Controls/tests/DeviceTests/Elements/Shell/ShellBasicNavigationTestCases.cs new file mode 100644 index 000000000000..4a4444bb2b54 --- /dev/null +++ b/src/Controls/tests/DeviceTests/Elements/Shell/ShellBasicNavigationTestCases.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Maui.Controls; + +namespace Microsoft.Maui.DeviceTests +{ + public class ShellBasicNavigationTestCases : IEnumerable + { + public IEnumerator GetEnumerator() + { + var page1 = new ContentPage(); + var page2 = new ContentPage(); + + yield return new object[] { new ShellItem[] + { + new ShellItem() { Items = { page1 }, Route = "page1" }, + new ShellItem() { Items = { page2 }, Route = "page2" } + } }; + + yield return new object[] {new ShellItem[] + { + new ShellSection() { Items = { page1 }, Route = "page1" }, + new ShellSection() { Items = { page2 }, Route = "page2" } + } }; + + yield return new object[] { new ShellItem[] + { + new ShellContent() { Content = page1, Route = "page1" }, + new ShellContent() { Content = page2, Route = "page2" } + } }; + + yield return new object[] { new ShellItem[] + { + new FlyoutItem() + { + Items = + { + new ShellContent() { Content = page1, Route = "page1" }, + new ShellContent() { Content = page2, Route = "page2" }, + new ShellContent() { Content = new ContentPage(), Route = "page3" }, + } + } + } }; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } +} diff --git a/src/Controls/tests/DeviceTests/Elements/Shell/ShellTests.cs b/src/Controls/tests/DeviceTests/Elements/Shell/ShellTests.cs index 78e5e91a849f..b91914db9ba0 100644 --- a/src/Controls/tests/DeviceTests/Elements/Shell/ShellTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/Shell/ShellTests.cs @@ -50,20 +50,46 @@ public async Task DetailsViewUpdates() { SetupBuilder(); - var shell = await InvokeOnMainThreadAsync(() => { + var shell = await InvokeOnMainThreadAsync(() => + { return new Shell() - { - Items = + { + Items = { new ContentPage() } - }; + }; }); - await CreateHandlerAndAddToWindow(shell, (handler) => + await CreateHandlerAndAddToWindow(shell, async (handler) => { + // TODO MAUI Fix this + await Task.Delay(100); Assert.NotNull(shell.Handler); - return Task.CompletedTask; + }); + } + + + [Theory] + [ClassData(typeof(ShellBasicNavigationTestCases))] + public async Task BasicShellNavigationStructurePermutations(ShellItem[] shellItems) + { + SetupBuilder(); + var shell = await InvokeOnMainThreadAsync(() => + { + var value = new Shell(); + foreach (var item in shellItems) + value.Items.Add(item); + + return value; + }); + + await CreateHandlerAndAddToWindow(shell, async (handler) => + { + // TODO MAUI Fix this + await Task.Delay(100); + await shell.GoToAsync("//page2"); + await Task.Delay(100); }); } #endif