Skip to content

Fix Changing Content property of ShellContent doesn't change visual content#34630

Merged
kubaflo merged 5 commits into
dotnet:inflight/currentfrom
devanathan-vaithiyanathan:fix-12669
May 27, 2026
Merged

Fix Changing Content property of ShellContent doesn't change visual content#34630
kubaflo merged 5 commits into
dotnet:inflight/currentfrom
devanathan-vaithiyanathan:fix-12669

Conversation

@devanathan-vaithiyanathan
Copy link
Copy Markdown
Contributor

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.

  • Android
  • Windows
  • iOS
  • Mac
Before After
Android
Before-Android.mov
Android
After-Android.mov

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 25, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34630

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34630"

@dotnet-policy-service dotnet-policy-service Bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label Mar 25, 2026
@karthikraja-arumugam karthikraja-arumugam added the community ✨ Community Contribution label Mar 25, 2026
@devanathan-vaithiyanathan devanathan-vaithiyanathan changed the title [WIP] Fix Changing Content property of ShellContent doesn't change visual content Fix Changing Content property of ShellContent doesn't change visual content Mar 26, 2026
@sheiksyedm sheiksyedm marked this pull request as ready for review March 26, 2026 10:56
Copilot AI review requested due to automatic review settings March 26, 2026 10:56
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.DisplayedPage and resync the navigation stack when the displayed page changes due to a content swap.
  • iOS: listen for ShellContent.Content changes and replace the existing page renderer so the new page becomes visible.
  • Android: invalidate the ViewPager2 fragment ID cache for a ShellContent when 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.

Comment on lines +106 to +108
void OnDisplayedPageChanged(Page? page)
{
if (page is null || VirtualView is null)
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Suggested change
void OnDisplayedPageChanged(Page? page)
{
if (page is null || VirtualView is null)
void OnDisplayedPageChanged(Page page)
{
if (VirtualView is null)

Copilot uses AI. Check for mistakes.
Comment on lines +48 to +50
/// Invalidates the cached item ID for the given <paramref name="shellContent"/> so that
/// existing fragment and recreate it with the updated page content.
/// </summary>
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
/// 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.

Copilot uses AI. Check for mistakes.
@MauiBot MauiBot added s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) s/agent-changes-requested AI agent recommends changes - found a better alternative or issues and removed s/agent-approved AI agent recommends approval - PR fix is correct and optimal labels Mar 28, 2026
Copy link
Copy Markdown
Contributor

@kubaflo kubaflo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please review the AI's suggestions?

@devanathan-vaithiyanathan
Copy link
Copy Markdown
Contributor Author

Could you please review the AI's suggestions?

@kubaflo , I have addressed the AI suggestion

@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented Apr 7, 2026

/azp run maui-pr-uitests , maui-pr-devicetests

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 2 pipeline(s).

Copy link
Copy Markdown
Contributor

@kubaflo kubaflo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the ui tests are failing

Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 3 findings

See inline comments for details.

@@ -535,6 +547,75 @@ void OnShellSectionItemsChanged(object sender, NotifyCollectionChangedEventArgs
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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)]
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Test coverage gaps — three uncovered scenarios:

  1. Non-current tab: The test only changes content on the active (current) tab. The fix also claims to update background tabs (isCurrentContent == false path 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.

  2. DataTemplate-based content: The iOS code has a special BeginInvokeOnMainThread deferral path for Content is DataTemplate. This path is not exercised by the current test.

  3. Windows Stack.Count > 1 skip: The OnDisplayedPageChanged guard skips when a navigation stack is deeper than root. A test that pushes a page then changes ShellContent.Content would confirm no regression.

@dotnet dotnet deleted a comment from MauiBot May 11, 2026
@MauiBot MauiBot added s/agent-review-incomplete and removed s/agent-changes-requested AI agent recommends changes - found a better alternative or issues labels May 12, 2026
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented May 24, 2026

/review -b feature/refactor-copilot-yml

Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 1 findings

See inline comments for details.

@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates labels May 24, 2026
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented May 25, 2026

/review -b feature/refactor-copilot-yml

1 similar comment
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented May 26, 2026

/review -b feature/refactor-copilot-yml

Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 1 findings

See inline comments for details.

UpdateTabTitle(shellContent);
}
else if (e.PropertyName == ShellContent.ContentProperty.PropertyName && sender is ShellContent changedContent)
{
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Android dynamic ShellContent items are not covered by the new Content-change path. 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.

Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 1 findings

See inline comments for details.

UpdateTabTitle(shellContent);
}
else if (e.PropertyName == ShellContent.ContentProperty.PropertyName && sender is ShellContent changedContent)
{
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented May 26, 2026

🤖 AI Summary

👋 @devanathan-vaithiyanathan — new AI review results are available. Please review the latest session below.

📊 Review Session66f06f4 · AI summary added · 2026-05-26 22:20 UTC
🚦 Gate — Test Before & After Fix

Gate Result: ✅ PASSED

Platform: ANDROID · Base: main · Merge base: b0ea772f

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.yml
  • src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cs
  • src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs
  • src/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.Content at 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.ShellContentShouldUpdateWhenContentPropertyChanges using BuildAndRunHostApp.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 ShellContent additions: HookEvents() subscribes initial items only, while Android OnItemsCollectionChanged updates 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 added ShellContent items are not observed, so their later Content changes 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 Session8b7624e · 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.cs
  • src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cs
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs
  • src/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

Fix overview (per platform)

  • Android (ShellSectionRenderer + ShellFragmentStateAdapter): When ShellContent.ContentProperty changes, invalidate the cached item-id for that ShellContent in the adapter, then call SafeNotifyDataSetChanged() so ViewPager2 destroys and recreates the fragment with the new page.
  • iOS (ShellSectionRootRenderer): Subscribe PropertyChanged on every ShellContent (initial + Items collection changes). When Content changes, tear down the old per-content renderer and create a new one. If Content is a DataTemplate, defer via BeginInvokeOnMainThread so ContentCache is fully settled before calling GetOrCreateContent.
  • Windows (ShellSectionHandler.Windows.cs): Add a DisplayedPageObserver (OnDisplayedPageChanged). When fired, skip nav pushes (Stack.Count > 1) and pending tab-switch navs (PendingNavigationTask != null); otherwise call SyncNavigationStack to 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)

  1. Android ShellFragmentStateAdapter.cs:50 — XML doc grammar (Copilot suggestion). Already applied in the latest revision of the diff.
  2. Windows ShellSectionHandler.Windows.cs:108Page? parameter nullability mismatch with Action<Page> delegate (CS8622 build-break risk). Already applied: the current diff declares void OnDisplayedPageChanged(Page page).
  3. iOS ShellSectionRootRenderer.cs:547 (MauiBot) — Missing guard against an in-flight tab-switch animation when UpdateRendererForShellContent is called during _isAnimatingOut. Low likelihood but realistic.
  4. Tests Issue12669.cs:13 (MauiBot) — Coverage gaps: (a) content swap on a non-current tab, (b) DataTemplate-based content path, (c) Windows Stack.Count > 1 skip 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 PendingNavigationTask guard).
  • ShellContent removed from the section after the subscription was wired (iOS — handler attaches/detaches via Items collection changes; OK).
  • Disconnect ordering: iOS path nulls _renderers in IDisconnectable.Disconnect; PR adds property-change unsubscribe before _shellContext is cleared (OK).
  • Windows: re-binding the same handler must remove the prior observer (PR does this in SetVirtualView before 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 _isAnimatingOut guard 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)

  1. pr — ✅ regression-tested. Concrete fix on all three platforms. Internal-only API additions (InvalidateShellContent is internal). No PublicAPI.Unshipped.txt change required.
  2. pr-plus-reviewer — Addresses 7 actionable expert findings (1 major Android gap, 5 minor, 1 nit). Same architectural shape as pr. Strictly a superset of pr's behavior; would almost certainly preserve the gate result. Demoted to Update README.md #2 only because it has not been built/tested here.
  3. try-fix-3 — addresses MauiBot's animation-guard concern, but iOS-only scope.
  4. try-fix-1 — cleaner architecture, broadest blast radius, internal API change.
  5. try-fix-4 — Windows-only; removes timing-coupled guards.
  6. 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 changeInvalidateShellContent is internal; no PublicAPI.Unshipped.txt deltas 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":

  1. [major] Android — mirror iOS by wiring per-item PropertyChanged in OnItemsCollectionChanged so runtime-added ShellContent participates in the fix.
  2. [minor] iOS — unify OnShellContentPropertyChanged to always go through ((IShellContentController)shellContent).GetOrCreateContent() so View/null content is handled.
  3. [minor] iOS — handle NotifyCollectionChangedAction.Reset (currently leaks PropertyChanged subscriptions when e.OldItems is null).
  4. [minor] iOS — re-validate state inside the deferred BeginInvokeOnMainThread callback to avoid leaking intermediate renderers on rapid Content reassignments.
  5. [minor] Windows — reconsider the VirtualView.Stack.Count > 1 early-out (the root tab is silently stale on a later PopToRoot).
  6. [minor] Test — add App.WaitForNoElement("OriginalContent") to prove the old page was destroyed (catches "drew new over old" regressions).
  7. [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.


@kubaflo kubaflo changed the base branch from main to inflight/current May 27, 2026 09:20
@kubaflo kubaflo merged commit e3a793a into dotnet:inflight/current May 27, 2026
25 of 34 checks passed
@github-actions github-actions Bot added this to the .NET 10.0 SR8 milestone May 27, 2026
PureWeen pushed a commit that referenced this pull request Jun 2, 2026
…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"> |
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Changing Content property of ShellContent doesn't change visual content.

5 participants