Fix Changing Content property of ShellContent doesn't change visual content#34630
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34630Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34630" |
There was a problem hiding this comment.
Pull request overview
Fixes a Shell regression/bug where changing ShellContent.Content at runtime doesn’t update the displayed UI across Android, iOS/MacCatalyst, and Windows, and adds a UI test to prevent regressions.
Changes:
- Added a new HostApp repro page and corresponding Appium/NUnit UI test for issue #12669.
- Windows: observe
ShellSection.DisplayedPageand resync the navigation stack when the displayed page changes due to a content swap. - iOS: listen for
ShellContent.Contentchanges and replace the existing page renderer so the new page becomes visible. - Android: invalidate the ViewPager2 fragment ID cache for a
ShellContentwhen its content changes so the fragment is recreated.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue12669.cs | Adds an Appium UI test validating the visual updates after swapping ShellContent.Content. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue12669.cs | Adds a HostApp Shell repro page with automation IDs used by the test. |
| src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Windows.cs | Hooks DisplayedPage observation to trigger a stack sync when content swaps occur. |
| src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs | Subscribes to ShellContent.PropertyChanged to rebuild renderers on Content changes. |
| src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs | Forces ViewPager2 to recreate fragments when a ShellContent’s content changes. |
| src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cs | Adds cache invalidation to force fragment recreation for a specific ShellContent. |
| void OnDisplayedPageChanged(Page? page) | ||
| { | ||
| if (page is null || VirtualView is null) |
There was a problem hiding this comment.
IShellSectionController.AddDisplayedPageObserver takes an Action<Page> (nullable-oblivious). Wiring it to OnDisplayedPageChanged(Page? page) is likely to trigger CS8622 (nullability mismatch) and fail the build because warnings are treated as errors. Consider changing the callback signature to OnDisplayedPageChanged(Page page) (and rely on existing VirtualView/navigation checks) or otherwise align the nullability with the delegate type (e.g., avoid Page? here).
| void OnDisplayedPageChanged(Page? page) | |
| { | |
| if (page is null || VirtualView is null) | |
| void OnDisplayedPageChanged(Page page) | |
| { | |
| if (VirtualView is null) |
| /// Invalidates the cached item ID for the given <paramref name="shellContent"/> so that | ||
| /// existing fragment and recreate it with the updated page content. | ||
| /// </summary> |
There was a problem hiding this comment.
XML doc summary grammar: “so that existing fragment and recreate it…” is missing words and reads incorrectly. Please rephrase to clearly state that the cached item ID is invalidated so the existing fragment is destroyed and recreated with the updated content.
| /// Invalidates the cached item ID for the given <paramref name="shellContent"/> so that | |
| /// existing fragment and recreate it with the updated page content. | |
| /// </summary> | |
| /// Invalidates the cached item ID for the given <paramref name="shellContent"/>. | |
| /// This causes the existing fragment for that item to be destroyed and a new fragment | |
| /// to be created with the updated page content. |
kubaflo
left a comment
There was a problem hiding this comment.
Could you please review the AI's suggestions?
@kubaflo , I have addressed the AI suggestion |
|
/azp run maui-pr-uitests , maui-pr-devicetests |
|
Azure Pipelines successfully started running 2 pipeline(s). |
kubaflo
left a comment
There was a problem hiding this comment.
Looks like the ui tests are failing
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 3 findings
See inline comments for details.
| @@ -535,6 +547,75 @@ void OnShellSectionItemsChanged(object sender, NotifyCollectionChangedEventArgs | |||
| } | |||
There was a problem hiding this comment.
💡 iOS: UpdateRendererForShellContent has no guard for an in-progress tab-switch animation
If shellContent == _currentContent but _isAnimatingOut != null (a tab-switch animation is in flight), UpdateRendererForShellContent will call oldRenderer.ViewController?.ViewIfLoaded?.RemoveFromSuperview() and DisconnectHandler() on the renderer that is currently being animated. This could cause visual artifacts or a crash.
Low probability since a user would have to change a page's content mid-swipe, but consider adding:
if (_isAnimatingOut != null && _isAnimatingOut == oldRenderer)
return; // content change during animation — skip; animation completion will handle layout| public override string Issue => "Changing Content property of ShellContent doesn't change visual content"; | ||
|
|
||
| [Test] | ||
| [Category(UITestCategories.Shell)] |
There was a problem hiding this comment.
💡 Test coverage gaps — three uncovered scenarios:
-
Non-current tab: The test only changes content on the active (current) tab. The fix also claims to update background tabs (
isCurrentContent == falsepath on iOS, fragment invalidation on Android). A second test case that changes content on an inactive tab and then switches to it would give much higher confidence. -
DataTemplate-based content: The iOS code has a special
BeginInvokeOnMainThreaddeferral path forContent is DataTemplate. This path is not exercised by the current test. -
Windows
Stack.Count > 1skip: TheOnDisplayedPageChangedguard skips when a navigation stack is deeper than root. A test that pushes a page then changesShellContent.Contentwould confirm no regression.
|
/review -b feature/refactor-copilot-yml |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
|
/review -b feature/refactor-copilot-yml |
1 similar comment
|
/review -b feature/refactor-copilot-yml |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
| UpdateTabTitle(shellContent); | ||
| } | ||
| else if (e.PropertyName == ShellContent.ContentProperty.PropertyName && sender is ShellContent changedContent) | ||
| { |
There was a problem hiding this comment.
HookEvents() subscribes OnShellContentPropertyChanged only for the items present when the renderer is created, and Android's OnItemsCollectionChanged only updates the adapter. Unlike the iOS change, it does not subscribe e.NewItems or unsubscribe e.OldItems. A ShellContent added after renderer creation will therefore never reach this new ContentProperty branch when its Content changes, so its fragment will not be invalidated/recreated on Android. Removed items also remain subscribed until teardown.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
| UpdateTabTitle(shellContent); | ||
| } | ||
| else if (e.PropertyName == ShellContent.ContentProperty.PropertyName && sender is ShellContent changedContent) | ||
| { |
There was a problem hiding this comment.
[major] Navigation & Shell — This handles ShellContent.Content changes only for items subscribed in HookEvents(), which iterates the initial SectionController.GetItems() set. OnItemsCollectionChanged() updates the adapter but never subscribes e.NewItems, so a ShellContent added to a ShellSection at runtime will not raise this handler when its Content later changes. Concrete Android scenario: dynamically add a tab, navigate to it so ViewPager creates/caches its fragment, then replace that tab's Content; InvalidateShellContent()/SafeNotifyDataSetChanged() never run and the old fragment remains visible. Move the content observation into the adapter or subscribe/unsubscribe added/removed ShellContent items in the collection-changed path.
🤖 AI Summary
📊 Review Session —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue12669 Issue12669 |
✅ FAIL — 587s | ✅ PASS — 533s |
🔴 Without fix — 🖥️ Issue12669: FAIL ✅ · 587s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:07:25.71
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.36] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 05/26/2026 20:08:05 FixtureSetup for Issue12669(Android)
>>>>> 05/26/2026 20:08:06 ShellContentShouldUpdateWhenContentPropertyChanges Start
>>>>> 05/26/2026 20:08:25 ShellContentShouldUpdateWhenContentPropertyChanges Stop
>>>>> 05/26/2026 20:08:25 Log types: logcat, bugreport, server
Failed ShellContentShouldUpdateWhenContentPropertyChanges [19 s]
Error Message:
System.TimeoutException : Timed out waiting for element...
Stack Trace:
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.Issues.Issue12669.ShellContentShouldUpdateWhenContentPropertyChanges() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue12669.cs:line 23
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
NUnit Adapter 4.5.0.0: Test execution complete
Results File: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue12669.trx
Total tests: 1
Failed: 1
Test Run Failed.
Total time: 32.9337 Seconds
>>> TRX_RESULT_FILE: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue12669.trx
🟢 With fix — 🖥️ Issue12669: PASS ✅ · 533s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:07:05.83
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14196677
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.13] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.48] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 05/26/2026 20:17:14 FixtureSetup for Issue12669(Android)
>>>>> 05/26/2026 20:17:15 ShellContentShouldUpdateWhenContentPropertyChanges Start
>>>>> 05/26/2026 20:17:20 ShellContentShouldUpdateWhenContentPropertyChanges Stop
Passed ShellContentShouldUpdateWhenContentPropertyChanges [4 s]
NUnit Adapter 4.5.0.0: Test execution complete
Results File: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue12669.trx
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 17.6580 Seconds
>>> TRX_RESULT_FILE: /home/vsts/work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue12669.trx
📁 Fix files reverted (5 files)
eng/pipelines/ci-copilot.ymlsrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cssrc/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Windows.cs
🧪 UI Tests — Shell
Detected UI test categories: Shell
✅ Deep UI tests — 298 passed, 0 failed across 1 category on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
Shell |
298/298 ✓ | — |
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs) |
🔍 Regression Cross-Reference
🔍 Regression Cross-Reference
🟢 No regression risks detected. No labeled bug-fix PRs in the last 6 months touched the modified files.
🔍 Pre-Flight — Context & Validation
Issue: #12669 - Changing Content property of ShellContent doesn't change visual content.
PR: #34630 - Fix Changing Content property of ShellContent doesn't change visual content
Platforms Affected: Android, iOS, MacCatalyst, Windows
Files Changed: 4 implementation, 2 test
Key Findings
- Issue Changing Content property of ShellContent doesn't change visual content. #12669 reports that changing
ShellContent.Contentat runtime leaves the old visual page displayed; Android/Windows may refresh only after rerouting, while iOS/Mac do not refresh. - PR Fix Changing Content property of ShellContent doesn't change visual content #34630 fixes the stale visual content by recreating Android ViewPager2 fragments, replacing iOS/Mac renderers, and resyncing the Windows navigation stack when displayed content changes.
- Android testing is via UI test
Issue12669.ShellContentShouldUpdateWhenContentPropertyChangesusingBuildAndRunHostApp.ps1 -Platform android -TestFilter "Issue12669". - Gate already passed: the new UI test failed without the fix and passed with the PR fix on Android.
- Existing review comments flagged Android dynamic
ShellContentadditions:HookEvents()subscribes initial items only, while AndroidOnItemsCollectionChangedupdates only the adapter.
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: high
Errors: 1 | Warnings: 0 | Suggestions: 0
Key code review findings:
- ❌
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs:165— Android dynamically addedShellContentitems are not observed, so their laterContentchanges will not invalidate/recreate the ViewPager fragment.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #34630 | Platform-specific refresh: invalidate Android fragment cache and notify ViewPager2; replace iOS/Mac renderer; resync Windows stack | ✅ PASSED (Gate) | ShellFragmentStateAdapter.cs, ShellSectionRenderer.cs, ShellSectionRootRenderer.cs, ShellSectionHandler.Windows.cs, UI test files |
Original PR; Android dynamic additions remain uncovered |
🔬 Code Review — Deep Analysis
Code Review — PR #34630
Independent Assessment
What this changes: Rebuilds/reloads Shell visual content when ShellContent.Content changes at runtime on Android, iOS/MacCatalyst, and Windows; adds a UI regression test.
Inferred motivation: Fix stale Shell UI after replacing a ShellContent page.
Reconciliation with PR Narrative
Author claims: Fixes #12669 across Android, iOS, Windows, and Mac, with UI test coverage.
Agreement/disagreement: Mostly matches. However Android misses dynamically added ShellContent items.
Findings
❌ Error — Android dynamically added ShellContent is not observed
ShellSectionRenderer.HookEvents() subscribes only existing items, but Android OnItemsCollectionChanged does not subscribe e.NewItems or unsubscribe e.OldItems. Therefore a ShellContent added after renderer creation will not hit the new ContentProperty branch at src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs:165, so changing its Content can still show stale UI.
CI is currently green, but this is a behavioral gap in the PR's fix. Existing review discussion also flags this and appears unresolved.
Devil's Advocate
The primary issue scenario may only involve initial ShellContent items, and iOS handles dynamic items explicitly. That contrast strengthens the concern for Android rather than making it speculative.
Verdict: NEEDS_CHANGES
Confidence: high
Summary: The main approach is sound, and CI is green, but Android does not handle dynamically added ShellContent items for the newly added content-change behavior. The PR should update Android item collection handling before merge.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix-1 | Fragment-level observation: ShellFragmentContainer observes ShellContent.Content and swaps the hosted page view in-place through a new ShellPageContainer.ReplaceHandler() path; also adds dynamic item subscription handling in ShellSectionRenderer. |
✅ PASS — Issue12669 on Android |
3 files | Works, but broader than the PR and introduces a new fragment/container content-swap lifecycle path. Self-review recorded 1 minor finding. |
| 2 | try-fix-2 | Adapter-owned observation: ShellFragmentStateAdapter owns ShellContent.Content subscriptions for initial and dynamically added/removed items, invalidates its own item-ID cache, then notifies ShellSectionRenderer to call SafeNotifyDataSetChanged() and resync toolbar state. |
✅ PASS — Issue12669 on Android |
2 files | Selected. Keeps the proven destroy/recreate fragment semantics, closes the Android dynamic-item subscription gap, avoids fragment/container swaps, and had clean self-review findings. |
| PR | PR #34630 | Renderer-owned observation: ShellSectionRenderer observes initial items, invalidates ShellFragmentStateAdapter cached item IDs on Content changes, calls SafeNotifyDataSetChanged(), and updates toolbar state for the active item. |
✅ PASSED (Gate) | 6 files total PR; Android fix spans 2 files | Original PR passes the gate, but code review found Android dynamically added ShellContent items are not observed. |
Candidate Narratives
try-fix-1 — Fragment-Level Content Observation
Approach: Move content-change handling into ShellFragmentContainer. The fragment subscribes to ShellContent.ContentProperty, recycles the old page, creates the new page, and replaces the native child view inside ShellPageContainer.
Diff summary: Added ShellFragmentContainer property-change observation, added ShellPageContainer.ReplaceHandler(), and updated ShellSectionRenderer.OnItemsCollectionChanged to subscribe/unsubscribe dynamically added/removed items.
Test result: PASS. Android UI test Issue12669.ShellContentShouldUpdateWhenContentPropertyChanges found OriginalContent, tapped ChangeContentButton, and then found NewContent.
Failure analysis: No test failure. Not selected because it is more invasive than needed: it adds a second Android content-swap mechanism at the fragment/container level, whereas the existing ViewPager2 fragment recreation path is already sufficient.
try-fix-2 — Adapter-Owned ShellContent.Content Observation
Approach: Make ShellFragmentStateAdapter the owner of ShellContent.Content observation. The adapter already tracks the ShellSection item set through its constructor and OnItemsCollectionChanged, so it can subscribe initial items, subscribe newly added items, unsubscribe removed items, invalidate _createdShellContent, and raise ShellContentInvalidated to the renderer.
Diff summary: Added _observedContent, subscription helpers, OnShellContentPropertyChanged, InvalidateShellContent, and ShellContentInvalidated to ShellFragmentStateAdapter; added renderer event wiring, SafeNotifyDataSetChanged(), toolbar resync, and event cleanup in ShellSectionRenderer.
Test result: PASS. Android UI test Issue12669.ShellContentShouldUpdateWhenContentPropertyChanges passed after the runtime content swap.
Failure analysis: No test failure. Self-review was clean. This candidate is demonstrably better than the PR for Android because it fixes the unresolved dynamic-item observer gap by construction and keeps the existing fragment destroy/recreate behavior instead of introducing a new container-level view-swap path.
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 1 | Yes | Fragment-level content observation and in-place page view replacement. |
| claude-opus-4.7 | 1 | Yes | Adapter-owned content observation with renderer notification for data-set refresh and toolbar sync. |
| gpt-5.3-codex | N/A | Not queried | Stopped because candidate #2 passed all Android criteria and is demonstrably better than the PR's Android fix for the unresolved dynamic-item scenario. |
| gpt-5.5 | N/A | Not queried | Stopped because candidate #2 passed all Android criteria and is demonstrably better than the PR's Android fix for the unresolved dynamic-item scenario. |
Exhausted: No — stopped early per the requested stop condition because candidate #2 passed the Android regression and is demonstrably better than the PR's Android implementation for the code-review failure mode.
Selected Fix: Candidate #2 — Adapter-owned ShellContent.Content observation. It preserves the PR's proven fragment recreation mechanism, reduces lifecycle surface compared with candidate #1, and closes the dynamic ShellContent subscription gap identified by expert review.
📋 Report — Final Recommendation
Comparative Report — PR #34630
Candidate ranking
| Rank | Candidate | Regression result | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
Inherits PR gate pass and applies feedback matching tested try-fix-2 Android shape |
Best overall: preserves the PR's cross-platform fixes and test coverage, while closing the expert-reviewed Android dynamic ShellContent subscription gap with the least risky architecture. |
| 2 | try-fix-2 |
✅ PASS — Issue12669 on Android |
Best standalone alternative from STEP 6a. Adapter-owned observation naturally tracks initial, added, and removed ShellContent items, keeps ViewPager fragment recreation semantics, and had clean self-review findings. |
| 3 | try-fix-1 |
✅ PASS — Issue12669 on Android |
Fixes the dynamic subscription gap but adds a broader fragment/container in-place replacement path through ShellFragmentContainer and ShellPageContainer.ReplaceHandler(), increasing lifecycle risk compared with adapter-owned invalidation. |
| 4 | pr |
✅ PASSED gate | Raw PR passes the static Android regression but remains incomplete because dynamically added Android ShellContent items are never subscribed for later Content changes. |
Analysis
The raw PR fix is directionally sound: it invalidates Android ViewPager item IDs so the fragment is destroyed and recreated, updates iOS/Mac renderers, resyncs the Windows navigation stack, and adds a UI regression test. The expert review found one concrete Android correctness gap: renderer-owned subscriptions cover only the ShellContent items present during HookEvents(), while dynamic item changes only update the adapter.
try-fix-1 passes the Android regression and handles dynamic subscriptions, but it solves content replacement by adding an in-place fragment view swap. That introduces a second content lifecycle path in addition to ViewPager2 fragment recreation, so it is ranked below simpler candidates.
try-fix-2 is the strongest standalone alternative because it puts observation where item-set ownership already exists: ShellFragmentStateAdapter. This fixes initial and dynamic items, pairs subscriptions with adapter disposal/removal, and keeps the PR's fragment recreation semantics.
pr-plus-reviewer wins because it combines the PR's cross-platform fix surface with the expert review feedback applied using the tested try-fix-2 Android design. No candidate with a failed regression test outranks a passing candidate; none of the recorded STEP 6a candidates failed the Android regression.
Winner
pr-plus-reviewer is the single winning candidate.
It should retain the PR's iOS, MacCatalyst, Windows, and test changes, and replace the Android renderer-owned ShellContent.Content observation with adapter-owned observation and renderer notification as described in try-fix-2.
📊 Review Session — 8b7624e · AI suggestion addressed · 2026-05-12 01:34 UTC
🚦 Gate — Test Before & After Fix
Gate Result: ✅ PASSED
Platform: ANDROID · Base: main · Merge base: f8cb875e
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue12669 Issue12669 |
✅ FAIL — 722s | ✅ PASS — 529s |
🔴 Without fix — 🖥️ Issue12669: FAIL ✅ · 722s
Determining projects to restore...
Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 844 ms).
Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 4.23 sec).
Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 2.05 sec).
Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 7.29 sec).
Restored /home/vsts/work/1/s/src/Core/maps/src/Maps.csproj (in 607 ms).
Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 31 ms).
Restored /home/vsts/work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 31 ms).
Restored /home/vsts/work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 324 ms).
Restored /home/vsts/work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 99 ms).
Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 1.45 sec).
1 of 11 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:08:49.01
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 904 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 848 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 4 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 1.59 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 4.98 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.45 sec).
Restored /home/vsts/work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 13 ms).
Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 1.97 sec).
5 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.11] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.44] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 05/11/2026 21:23:37 FixtureSetup for Issue12669(Android)
>>>>> 05/11/2026 21:23:40 ShellContentShouldUpdateWhenContentPropertyChanges Start
>>>>> 05/11/2026 21:23:58 ShellContentShouldUpdateWhenContentPropertyChanges Stop
>>>>> 05/11/2026 21:23:58 Log types: logcat, bugreport, server
Failed ShellContentShouldUpdateWhenContentPropertyChanges [18 s]
Error Message:
System.TimeoutException : Timed out waiting for element...
Stack Trace:
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.Issues.Issue12669.ShellContentShouldUpdateWhenContentPropertyChanges() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue12669.cs:line 23
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Failed.
Total tests: 1
Failed: 1
Total time: 42.7377 Seconds
🟢 With fix — 🖥️ Issue12669: PASS ✅ · 529s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:06:53.66
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14068673
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.11] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.45] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 05/11/2026 21:32:42 FixtureSetup for Issue12669(Android)
>>>>> 05/11/2026 21:32:45 ShellContentShouldUpdateWhenContentPropertyChanges Start
>>>>> 05/11/2026 21:32:49 ShellContentShouldUpdateWhenContentPropertyChanges Stop
Passed ShellContentShouldUpdateWhenContentPropertyChanges [4 s]
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 20.3236 Seconds
📁 Fix files reverted (4 files)
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cssrc/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Windows.cs
🧪 UI Tests — Shell
Detected UI test categories: Shell
❌ Deep UI tests — 0 passed, 298 failed across 1 category on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
Shell |
0/298 (298 ❌) | — |
❌ Shell — 298 failed tests
FlyoutHeaderBehaviorFixed
OneTimeSetUp: System.TimeoutException : Shell Flyout Header Behavior
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/tests/TestCases
...
VerifyShell_TabBarForegroundColorAndTitleColor
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
VerifyShellFlyout_FlyoutHeaderAndFooterTemplate
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
NavEvents_Push_NavigatedEvent_CurrentIsNewPagePreviousIsSourcePage
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
ShellAppearanceUpdatesWhenChangingBetweenTabs
OneTimeSetUp: System.TimeoutException : Shell Colors Do Not Update Correctly When Switching Between TabBar Items
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTe
...
VerifyShellFlyout_DisplayOptionsWithHeaderAndFooter
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
ShouldFlyoutTextWrapsInLandscape
OneTimeSetUp: System.TimeoutException : iOS Flyout title is not broken over multiple lines when you rotate your screen
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToR
...
ShellPages_ForegroundColor
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
FlyoutItemHeightAndWidthIncreaseAndDecreaseCorrectly
OneTimeSetUp: System.TimeoutException : [Bug] Shell flyout items have a minimum height
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Contro
...
ClickingOnTabToPopToRootDoesntBreakNavigation
OneTimeSetUp: System.TimeoutException : [Bug] Unable to open a new Page for the second time in Xamarin.Forms Shell Tabbar
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.Try
...
Issue8529ShellBackButtonBehaviorCommandPropertyCanUseICommand
OneTimeSetUp: System.TimeoutException : [Bug] [Shell] iOS - BackButtonBehavior Command property binding throws InvalidCastException when using a custom command class that implements ICommand
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUIT
...
ShellAppearanceUpdatesWhenChangingShellSectionToTab_1
OneTimeSetUp: System.TimeoutException : Shell Colors Do Not Update Correctly When Switching Between TabBar Items
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTe
...
VerifyShell_TabBarBackgroundColorAndTitleColor
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
ShellPages_BackgroundColorAndTitleColor
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
ShellWithTopTabsFreezesWhenNavigatingFlyoutItems
OneTimeSetUp: System.TimeoutException : [Bug] [Shell] [iOS] Locked flyout causes application to freezes when quickly switching between tabs
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests
...
DynamicTabSectionVisibility
OneTimeSetUp: System.TimeoutException : Top Tab Visibility Changes Not Reflected Until Tab Switch
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_
...
SearchHandlerShouldNotOverlap
OneTimeSetUp: System.TimeoutException : SearchHandler overlaps title and title view
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/
...
VerifyShell_TabBarIsEnabled
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
FlyoutItemVisible
OneTimeSetUp: System.TimeoutException : Shell Items IsVisible Test
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/tests/TestCases.S
...
PaddingWithoutSafeArea
OneTimeSetUp: System.TimeoutException : Shell Inset Test
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/tests/TestCases.Shared.Test
...
PassData_SingleUseParams_ReceivedByIQueryAttributable
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
NavigatingBackFromMultiplePushPagesChangesTabVisibilityCorrectly
OneTimeSetUp: System.TimeoutException : [iOS] TabBarIsVisible = True/False breaking for multiple nested pages
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestS
...
ShouldUpdateSearchHandlerOnPageNavigation
OneTimeSetUp: System.TimeoutException : Shell.SearchHandler visible in details page on Windows 11
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_
...
OnBackButtonPressedShouldFireForShellNavigationBarButton
OneTimeSetUp: System.TimeoutException : OnBackButtonPressed not firing for Shell Navigation Bar button in .NET 10 SR2
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToRe
...
VerifyShellFlyoutBackgroundImage
OneTimeSetUp: System.TimeoutException : Shell FlyoutBackgroundImage doesn't shown
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/te
...
FlyoutHeaderBehaviorCollapseOnScroll
OneTimeSetUp: System.TimeoutException : Shell Flyout Header Behavior
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_/src/Controls/tests/TestCases
...
ShellPages_ShowTitleViewHidden
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
TabBarVisibilityHidesOnPage1UsingDirectSet
OneTimeSetUp: System.TimeoutException : Shell TabBarIsVisible binding not working on ShellContent
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToResetTestState() in /_
...
VerifyShellFlyout_FooterTemplate
OneTimeSetUp: System.TimeoutException : Timed out waiting for Go To Test button to appear
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.UtilExtensions.NavigateToGallery(IApp app, String page) in /_/src/Controls/tests/TestCases.Shared.Tests/UtilExtensions.cs:line 37
at Microsoft.Maui.TestCases.Tests._GalleryUITest.FixtureSetup() in /_/src/Controls/
...
ShouldUpdateSearchViewOnPageNavigation
OneTimeSetUp: System.TimeoutException : [Shell][Android] The truth is out there...but not on top tab search handlers
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests._IssuesUITest.NavigateToIssue(String issue) in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/_IssuesUITest.cs:line 54
at Microsoft.Maui.TestCases.Tests._IssuesUITest.TryToRes
...
(+268 more — see TRX in artifact)
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)
🔍 Pre-Flight — Context & Validation
Pre-Flight — PR #34630
PR summary
- Title: Fix Changing Content property of ShellContent doesn't change visual content
- Base: main @ a1731cf
- Head: 8b7624e
- Author: devanathan-vaithiyanathan (partner/syncfusion, community)
- Linked issue: Changing Content property of ShellContent doesn't change visual content. #12669 — Changing
ShellContent.Contentat runtime does not change the visible page on Android/iOS/Windows/macOS.
Fix overview (per platform)
- Android (
ShellSectionRenderer+ShellFragmentStateAdapter): WhenShellContent.ContentPropertychanges, invalidate the cached item-id for that ShellContent in the adapter, then callSafeNotifyDataSetChanged()so ViewPager2 destroys and recreates the fragment with the new page. - iOS (
ShellSectionRootRenderer): SubscribePropertyChangedon everyShellContent(initial + Items collection changes). WhenContentchanges, tear down the old per-content renderer and create a new one. IfContentis aDataTemplate, defer viaBeginInvokeOnMainThreadsoContentCacheis fully settled before callingGetOrCreateContent. - Windows (
ShellSectionHandler.Windows.cs): Add aDisplayedPageObserver(OnDisplayedPageChanged). When fired, skip nav pushes (Stack.Count > 1) and pending tab-switch navs (PendingNavigationTask != null); otherwise callSyncNavigationStackto reload the frame with the new page. Removes the observer on Disconnect / re-bind.
File classification
| File | Type |
|---|---|
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cs |
fix (Android) |
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs |
fix (Android) |
src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs |
fix (iOS / MacCatalyst) |
src/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Windows.cs |
fix (Windows) |
src/Controls/tests/TestCases.HostApp/Issues/Issue12669.cs |
test host app |
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue12669.cs |
UI test (NUnit + Appium, Category Shell) |
Existing inline review findings (gate to feed into candidates)
- Android
ShellFragmentStateAdapter.cs:50— XML doc grammar (Copilot suggestion). Already applied in the latest revision of the diff. - Windows
ShellSectionHandler.Windows.cs:108—Page?parameter nullability mismatch withAction<Page>delegate (CS8622 build-break risk). Already applied: the current diff declaresvoid OnDisplayedPageChanged(Page page). - iOS
ShellSectionRootRenderer.cs:547(MauiBot) — Missing guard against an in-flight tab-switch animation whenUpdateRendererForShellContentis called during_isAnimatingOut. Low likelihood but realistic. - Tests
Issue12669.cs:13(MauiBot) — Coverage gaps: (a) content swap on a non-current tab, (b) DataTemplate-based content path, (c) WindowsStack.Count > 1skip path when nav stack has been pushed.
Gate
✅ Provided externally — regression test FAILS without fix, PASSES with fix. Not re-run here.
Edge cases worth probing
- ShellContent content set repeatedly back-to-back (re-entrancy in PropertyChanged → adapter invalidation).
- Tab switch already in flight when content changes (iOS animation guard; Windows
PendingNavigationTaskguard). - ShellContent removed from the section after the subscription was wired (iOS — handler attaches/detaches via Items collection changes; OK).
Disconnectordering: iOS path nulls_renderersinIDisconnectable.Disconnect; PR adds property-change unsubscribe before_shellContextis cleared (OK).- Windows: re-binding the same handler must remove the prior observer (PR does this in
SetVirtualViewbefore re-attaching).
Test impact / categories
Shell(UI test category)- Indirectly:
Navigation
Notes
- PR description and diff structure are coherent; multi-platform scope is justified.
- All four pre-existing inline findings except the iOS animation guard and test coverage gaps appear to already be addressed in HEAD.
🔧 Fix — Analysis & Comparison
Try-Fix Aggregate Summary
Four independent alternative fixes were drafted against PR #34630 (Issue #12669 — ShellContent content swap doesn't refresh).
| Candidate | Dimension | Scope | Verdict |
|---|---|---|---|
| try-fix-1 | API design / handler patterns | All platforms (Controls-layer event) | Cleaner, but adds internal API and big blast radius |
| try-fix-2 | CollectionView / ViewPager2 Android | Android only | Idiomatic on Android but partial — must combine with iOS+Windows pieces of the PR |
| try-fix-3 | iOS handler lifecycle / animation guard | iOS only | Reuses renderer + addresses MauiBot's _isAnimatingOut finding — partial |
| try-fix-4 | Threading / lifecycle symmetry | Windows only | Drops fragile DisplayedPageObserver timing — partial |
None of the four try-fix candidates was actually applied to a worktree and tested against Issue12669. Build/UI-test verification was not feasible in this environment (no Android SDK + Appium harness wired here), so each candidate is a design-grade alternative. Per the ranking rule, candidates that did not pass the regression test must rank below candidates that did. The PR's own fix has the verified gate (✅ tests fail without fix, pass with fix) and therefore wins on that axis.
The PR's overall approach is sound; the most valuable improvements available from the try-fix exploration are:
- From try-fix-3: add the
_isAnimatingOutguard on iOS (cheap, addresses the MauiBot inline finding). - From try-fix-4: consider migrating the Windows path to per-content PropertyChanged in a follow-up to eliminate the temporal coupling currently documented in code comments.
- From try-fix-1: if Shell sees another similar bug, promote the per-platform pattern to a Controls-layer event.
These are recommended as polish on top of the existing PR rather than replacement.
📋 Report — Final Recommendation
Comparative Report — PR #34630
Candidates evaluated
| Candidate | Source | Verified by gate? |
|---|---|---|
pr |
PR #34630 HEAD (8b7624e) — as submitted | ✅ Pass (regression test fails without fix, passes with fix) |
pr-plus-reviewer |
PR fix + expert reviewer's actionable feedback (Android runtime-added items, iOS Reset/race/View-or-null fallthrough, Windows Stack.Count guard, test WaitForNoElement) applied in a sandbox copy |
⏸ Not built/tested in this environment (no Android SDK + Helix harness wired). Design-grade. |
try-fix-1 |
Cross-platform centralization via IShellContentController.ContentChanged |
⏸ Design-grade only |
try-fix-2 |
Android: encode page identity into GetItemId |
⏸ Design-grade only |
try-fix-3 |
iOS: reuse renderer via SetVirtualView + _isAnimatingOut guard |
⏸ Design-grade only |
try-fix-4 |
Windows: per-content PropertyChanged instead of DisplayedPageObserver |
⏸ Design-grade only |
Ranking (verified pass first, per task rules)
pr— ✅ regression-tested. Concrete fix on all three platforms. Internal-only API additions (InvalidateShellContentisinternal). NoPublicAPI.Unshipped.txtchange required.pr-plus-reviewer— Addresses 7 actionable expert findings (1 major Android gap, 5 minor, 1 nit). Same architectural shape aspr. Strictly a superset ofpr's behavior; would almost certainly preserve the gate result. Demoted to Update README.md #2 only because it has not been built/tested here.try-fix-3— addresses MauiBot's animation-guard concern, but iOS-only scope.try-fix-1— cleaner architecture, broadest blast radius, internal API change.try-fix-4— Windows-only; removes timing-coupled guards.try-fix-2— Android-only; idiomatic for ViewPager2 but partial.
Why pr wins
- Only candidate that passed the gate. The task rules explicitly require candidates that passed regression tests to rank above those that didn't.
- All three platforms covered in one cohesive change. The four try-fix alternatives each cover only one platform (or require an internal API change). Picking any single try-fix would leave the other two platforms broken.
- No public API change —
InvalidateShellContentisinternal; noPublicAPI.Unshipped.txtdeltas needed. - Reviewer issues are improvements, not blockers. The 7 remaining inline findings (major [Draft] Readme WIP #1 + minors + nit) are real but each can be addressed as follow-up commits on the same PR without redesign. None of them invalidate the chosen approach; they tighten edge cases.
What the PR is still missing vs. pr-plus-reviewer
These should be applied as follow-up commits on top of pr before merge, but they don't rise to "wrong approach":
- [major] Android — mirror iOS by wiring per-item
PropertyChangedinOnItemsCollectionChangedso runtime-addedShellContentparticipates in the fix. - [minor] iOS — unify
OnShellContentPropertyChangedto always go through((IShellContentController)shellContent).GetOrCreateContent()soView/nullcontent is handled. - [minor] iOS — handle
NotifyCollectionChangedAction.Reset(currently leaksPropertyChangedsubscriptions whene.OldItemsis null). - [minor] iOS — re-validate state inside the deferred
BeginInvokeOnMainThreadcallback to avoid leaking intermediate renderers on rapidContentreassignments. - [minor] Windows — reconsider the
VirtualView.Stack.Count > 1early-out (the root tab is silently stale on a laterPopToRoot). - [minor] Test — add
App.WaitForNoElement("OriginalContent")to prove the old page was destroyed (catches "drew new over old" regressions). - [nit] Android — optional reverse-index for O(1)
InvalidateShellContent.
Final recommendation
Pick pr as the winner. Recommend the PR author apply the 7 inline findings (already written to inline-findings.json) as follow-up commits. The PR is a sound, low-risk fix that already passes the gate.
…ontent (#34630) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details When dynamically change ShellContent.Content at runtime, the Shell UI doesn't update — the old page stays visible on all three platforms. ### Description of Change <!-- Enter description of the fix in this section --> Android: When ShellContent.Content changes, force ViewPager2 to destroy and recreate the fragment so the new page is displayed. iOS: Subscribe to each ShellContent.PropertyChanged. When Content changes, tear down the old page renderer and create a new one in its place. Windows: Watch ShellSection.DisplayedPage via AddDisplayedPageObserver. When it changes due to a content swap, call SyncNavigationStack to reload the frame with the new page. ### Issues Fixed <!-- Please make sure that there is a bug logged for the issue being fixed. The bug should describe the problem and how to reproduce it. --> Fixes #12669 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Android - [x] Windows - [x] iOS - [x] Mac | Before | After | |---------|--------| | **Android**<br> <video src="https://github.com/user-attachments/assets/75769889-41e9-43c1-82b9-75228a8e89c6" width="300" height="600"> | **Android**<br> <video src="https://github.com/user-attachments/assets/5b7809ce-4eda-4d6e-99b6-0a994ca9ad88" width="300" height="600"> |
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Issue Details
When dynamically change ShellContent.Content at runtime, the Shell UI doesn't update — the old page stays visible on all three platforms.
Description of Change
Android:
When ShellContent.Content changes, force ViewPager2 to destroy and recreate the fragment so the new page is displayed.
iOS:
Subscribe to each ShellContent.PropertyChanged. When Content changes, tear down the old page renderer and create a new one in its place.
Windows:
Watch ShellSection.DisplayedPage via AddDisplayedPageObserver. When it changes due to a content swap, call SyncNavigationStack to reload the frame with the new page.
Issues Fixed
Fixes #12669
Tested the behavior in the following platforms.
Before-Android.mov
After-Android.mov