Fix TextColor null reset to restore platform defaults on iOS and Android#35563
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35563Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35563" |
|
Hey there @@Shalini-Ashokan! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
|
/review -b feature/regression-check -p ios |
|
/review -b feature/regression-check |
<!-- 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! ## What Restrict the agentic-labeler to apply **exactly one `area-*` label** per item, while still allowing multiple `platform/*` labels. ## Why Backfilling the 26 items affected by the `max:1` bug (fixed in dotnet#35540) revealed that the labeler occasionally applies multiple `area-*` labels for ambiguous cases: - **dotnet#35501** got both `area-layout` and `area-safearea` - **dotnet#35490** got both `area-navigation` and `area-controls-tabbedpage` The intended behavior is exactly one best-fit `area-*` per item (a label-quota distinction not expressible via `safe-outputs.add-labels.max:` — that field counts total labels, not labels per prefix). The fix has to live in the agent's instructions. ## Changes ### `.github/skills/agentic-labeler/SKILL.md` - Scope section: "Exactly one `area-*`" / "One or more `platform/*`". - Area rules section: renamed heading, changed "pick one or more" → "apply exactly one". - New **tie-breaking heuristics** for the area-* selection: - Specific control beats generic area (`area-controls-tabbedpage` over `area-navigation`) - Sub-area beats parent area (`area-safearea` over `area-layout`) - Subject-matter focus beats incidental touch - When genuinely tied, prefer the user-visible feature - Mixed-PR rule clarified: infra-primary PRs get only `area-infrastructure` (no second product area). ### `.github/workflows/agentic-labeler.md` - Added explicit reinforcement in the workflow prompt: "Apply exactly one `area-*` label … and one or more `platform/*` labels". - Fixed two stale `max: 1` comments left over from dotnet#35540 (the cap is now `max: 10`). ### `.github/workflows/agentic-labeler.lock.yml` - Regenerated via `gh aw compile`. Diff is frontmatter-hash + heredoc rotations only — no semantic change to the compiled config. ## Validation - Reviewed all 21 existing eval scenarios in `tests/eval.yaml` — none assert multiple `area-*` labels, so no test updates needed. - The `max: 10` cap in `safe-outputs` is preserved as a blast-radius safeguard (one area + several platforms still fit comfortably). ## Follow-ups (not in this PR) If accuracy of the "one area" rule drops below ~95% in eval runs, consider adding a deterministic post-step that strips extra `area-*` labels per a known precedence list (Option B from the design discussion). Co-authored-by: bot <bot@test> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
/review -b feature/regression-check |
## Description
Extends the `maui-copilot` DevDiv pipeline (pipeline 27723) with a
3-stage architecture that runs real UI tests on platform-pool agents and
reports results directly in the AI summary PR comment.
### Pipeline Workflow
```
┌─────────────────────────────────────────────────────────┐
│ Stage 1: ReviewPR │
│ │
│ STEP 1: Branch Setup (checkout + cherry-pick PR) │
│ STEP 2: Detect UI Test Categories │
│ STEP 3: Run Detected UI Tests (in-process, fast) │
│ STEP 4: Regression Cross-Reference │
│ STEP 5: Gate — verify tests fail/pass before/after fix │
│ STEP 6: Code Review — deep analysis via Copilot agent │
│ │
│ Outputs → CopilotLogs artifact + detectedCategories │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────┐
│ Stage 2: RunDeepUITests (platform-pool agent) │
│ │
│ iOS: AcesShared Tahoe + iOS 26.4 │
│ Android: ubuntu-22.04 + KVM + AVD │
│ │
│ Runs BuildAndRunHostApp.ps1 per detected category │
│ Outputs → drop-deep-uitests artifact (TRX + diffs) │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────┐
│ Stage 3: PostResults │
│ │
│ 1. Download CopilotLogs (review content files) │
│ 2. Download drop-deep-uitests (TRX results) │
│ 3. Merge deep results into uitests/content.md │
│ 4. Post full AI Summary comment on PR │
│ 5. Apply labels (s/agent-reviewed, etc.) │
│ │
│ One comment with everything — no patching needed │
└─────────────────────────────────────────────────────────┘
```
### What's New
**Deep UI Test Execution (Stage 2)**
- Runs detected UI test categories on proper platform-pool agents (not
in-process on Linux)
- **iOS**: AcesShared Tahoe agents with iOS 26.4 simulator, iPhone 11
Pro (matching `ios-26` baselines from PR dotnet#35061)
- **Android**: ubuntu-22.04 with KVM, AVD boot with `-partition-size
2048`, `ignoreHiddenApiPolicyError` capability
- TRX results + snapshot-diff PNGs published as `drop-deep-uitests`
artifact
**Unified Comment Posting (Stage 3)**
- Comment posting and label application deferred to Stage 3 (after deep
tests complete)
- Single AI summary comment includes ALL results: code review + deep
test results
- Nested collapsible `<details>` for failed tests with full error +
stack trace
- Dynamic section title: `🧪 UI Tests — CollectionView, TabbedPage`
- Artifact download link for snapshot-diff PNGs
**Android Emulator Improvements**
- AVD boot step with proper partition size, ADB key pre-authorization,
boot wait
- `DEVICE_UDID` pass-through prevents double emulator boot
- Disk cleanup on hosted ubuntu agents (frees ~22GB)
- KVM enablement + `appium:ignoreHiddenApiPolicyError` for API 30
**iOS Simulator Improvements**
- Tahoe pool demand ensures macOS 26.x agents
- Explicit iOS 26.4 download via latest Xcode
- Auto-creates iPhone 11 Pro for baseline resolution match
### Validation
Tested across 30+ pipeline iterations on 6 PRs:
| PR | iOS | Android |
|---|---|---|
| 35358 (ViewBaseTests) | **112/112 ALL PASS** ✅ | **118/119 PASS** ✅ |
| 35359 (TabbedPage) | 44/50 (1 real failure) | 74/75 (1 real failure) |
| 35356 (CollectionView) | **415/417 PASS** ✅ | 593/619 (26 real
failures) |
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…35589) > [!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! Backport of dotnet#35460 to `main`. /cc @PureWeen Co-authored-by: HarishKumarSF4517 <harish.kumar@syncfusion.com>
### Description of Change https://github.com/GitOps-microsoft/GitOps.PullRequestIssueManagement/pull/262 (internal Microsoft link) changed the `${issueAuthor}` placeholder to include the `@` character. Remove the one we added so we don't duplicate it. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@kubaflo, I checked the AI concerns, Concern 2: (MacCatalyst reset path): Not valid. I debugged this path and UserInterfaceIdiom is not Mac in our run environment on macOS, so that branch is not hit. |
kubaflo
left a comment
There was a problem hiding this comment.
Alright! Could you resolve conflicts and we will be able to merge this one :)
9f5878a to
2d52e10
Compare
🔍 Skill Validation Results✅ Static Checks PassedSkills checked: 18 | Agents checked: 4 Full validator output⏭️ LLM Evaluation: Skipped
|
@kubaflo, I resolved the conflights |
|
/review -b feature/enhanced-reviewer |
MauiBot
left a comment
There was a problem hiding this comment.
AI Review Summary
@Shalini-Ashokan — new AI review results are available based on this last commit:
af16bd2.
Merge branch 'inflight/current' into fix-35513 To request a fresh review after new comments or commits, comment/review rerun.
Review Sessions — click to expand
Gate — Test Before & After Fix
Gate Result: ❌ FAILED
Platform: IOS · Base: main · Merge base: b0ea772f
🩺 Fix does not compile — applying the PR's fix produces a build error before tests can run. The earlier-than-test failure is the root cause; the per-test ❌ FAIL marks are downstream effects, not real test failures.
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue35513 Issue35513 |
✅ FAIL — 320s | 🛠️ BUILD ERROR |
🔴 Without fix — 🖥️ Issue35513: FAIL ✅ · 320s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 577 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 707 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 8.23 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 8.39 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 8.41 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 8.41 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 8.42 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 8.42 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 8.42 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 8.43 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 8.43 sec).
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
Detected signing identity:
Code Signing Key: "" (-)
Provisioning Profile: "" () - no entitlements
Bundle Id: com.microsoft.maui.uitests
App Id: com.microsoft.maui.uitests
Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
Optimizing assemblies for size. This process might take a while.
Build succeeded.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
1 Warning(s)
0 Error(s)
Time Elapsed 00:02:30.10
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 666 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 668 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 665 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 762 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 996 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 1.16 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 1.33 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 1.35 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 1.81 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 2.41 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.64 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 6.86 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.iOS.Tests/Controls.TestCases.iOS.Tests.csproj (in 6.88 sec).
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
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.08] Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.22] Discovered: Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 6/1/2026 12:33:51 PM FixtureSetup for Issue35513(iOS)
>>>>> 6/1/2026 12:33:57 PM TextViewBasedControlsTextColorUpdates Start
>>>>> 6/1/2026 12:33:59 PM TextViewBasedControlsTextColorUpdates Stop
Passed TextViewBasedControlsTextColorUpdates [1 s]
>>>>> 6/1/2026 12:33:59 PM TextViewBasedControlsRestoreDefaultAfterResetToNull Start
>>>>> 6/1/2026 12:34:01 PM TextViewBasedControlsRestoreDefaultAfterResetToNull Stop
>>>>> 6/1/2026 12:34:01 PM Log types: syslog, crashlog, performance, safariConsole, safariNetwork, server
Failed TextViewBasedControlsRestoreDefaultAfterResetToNull [2 s]
Error Message:
VisualTestUtils.VisualTestFailedException :
Snapshot different than baseline: AfterResetTextColorToNullOnTextViewBasedControls.png (1.66% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.
More info: https://aka.ms/visual-test-workflow
Stack Trace:
at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
at Microsoft.Maui.TestCases.Tests.Issues.Issue35513.TextViewBasedControlsRestoreDefaultAfterResetToNull() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35513.cs:line 29
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: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35513.trx
Test Run Failed.
Total tests: 2
Passed: 1
Failed: 1
Total time: 1.7229 Minutes
>>> TRX_RESULT_FILE: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35513.trx
🟢 With fix — 🖥️ Issue35513: 🛠️ BUILD ERROR · 41s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 424 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 450 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 456 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 504 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 524 ms).
6 of 11 projects are up-to-date for restore.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.80-ci+azdo.14251243
/Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt(17,1): error RS0025: The symbol 'override Microsoft.Maui.Controls.Handlers.Items2.StructuredItemsViewController2<TItemsView>.UpdateFlowDirection() -> void' appears more than once in the public API files (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [/Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj::TargetFramework=net10.0-ios26.0]
Build FAILED.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
/Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt(17,1): error RS0025: The symbol 'override Microsoft.Maui.Controls.Handlers.Items2.StructuredItemsViewController2<TItemsView>.UpdateFlowDirection() -> void' appears more than once in the public API files (https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/PublicApiAnalyzers/PublicApiAnalyzers.Help.md) [/Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj::TargetFramework=net10.0-ios26.0]
1 Warning(s)
1 Error(s)
Time Elapsed 00:00:32.95
⚠️ Failure Details
- 🛠️ Issue35513 with fix: build failed (fix does not compile)
📁 Fix files reverted (301 files)
eng/Signing.propseng/Versions.propseng/devices/run-windows-devicetests.cmdeng/devices/windows.cakeeng/pipelines/ci-copilot.ymlsrc/BlazorWebView/src/Maui/Android/BlazorAndroidWebView.cssrc/BlazorWebView/src/Maui/Android/BlazorWebViewHandler.Android.cssrc/BlazorWebView/src/Maui/Android/WebKitWebViewClient.cssrc/Compatibility/Core/src/Android/CollectionView/TemplatedItemViewHolder.cssrc/Compatibility/Core/src/Android/Renderers/SwipeViewRenderer.cssrc/Compatibility/Core/src/MacOS/Extensions/NSMenuExtensions.cssrc/Compatibility/Core/src/Windows/CollectionView/ItemContentControl.cssrc/Compatibility/Core/src/iOS/CollectionView/TemplatedCell.cssrc/Compatibility/Core/src/iOS/EventTracker.cssrc/Compatibility/Core/src/iOS/Renderers/SwipeViewRenderer.cssrc/Compatibility/Core/src/iOS/Renderers/UIContainerCell.cssrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xamlsrc/Controls/samples/Controls.Sample/Pages/Controls/MapsGalleries/MapPinsGallery.xaml.cssrc/Controls/src/Build.Tasks/SetPropertiesVisitor.cssrc/Controls/src/Core/ActionSheetArguments.cssrc/Controls/src/Core/AlertArguments.cssrc/Controls/src/Core/BindableObject.cssrc/Controls/src/Core/BindableProperty.cssrc/Controls/src/Core/Border/Border.cssrc/Controls/src/Core/Button/Button.iOS.cssrc/Controls/src/Core/Compatibility/Android/Resources/layout/flyoutcontent.axmlsrc/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/NavigationPage/iOS/NavigationRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutRecyclerAdapter.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutTemplatedContentRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentContainer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFragmentStateAdapter.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellItemRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/SearchHandlerAppearanceTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellPageRendererTracker.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cssrc/Controls/src/Core/Compatibility/Handlers/Shell/iOS/UIContainerCell.cssrc/Controls/src/Core/Compatibility/Handlers/TabbedPage/iOS/TabbedRenderer.cssrc/Controls/src/Core/Editor/Editor.Mapper.cssrc/Controls/src/Core/Editor/Editor.iOS.cssrc/Controls/src/Core/Element/Element.cssrc/Controls/src/Core/Entry/Entry.Mapper.cssrc/Controls/src/Core/Entry/Entry.iOS.cssrc/Controls/src/Core/FlyoutPage/FlyoutPage.cssrc/Controls/src/Core/FormattedString.cssrc/Controls/src/Core/GestureElement.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/GroupableItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/Adapters/ItemsViewAdapter.cssrc/Controls/src/Core/Handlers/Items/Android/GridLayoutSpanSizeLookup.cssrc/Controls/src/Core/Handlers/Items/Android/ItemContentView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiCarouselRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/MauiRecyclerView.cssrc/Controls/src/Core/Handlers/Items/Android/TemplatedItemViewHolder.cssrc/Controls/src/Core/Handlers/Items/CarouselViewHandler.Windows.cssrc/Controls/src/Core/Handlers/Items/ItemsViewHandler.cssrc/Controls/src/Core/Handlers/Items/ItemsViewHandler.iOS.cssrc/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Android.cssrc/Controls/src/Core/Handlers/Items/Tizen/ItemTemplateAdaptor.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cssrc/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cssrc/Controls/src/Core/Handlers/Items/iOS/SelectableItemsViewController.cssrc/Controls/src/Core/Handlers/Items/iOS/TemplatedCell.cssrc/Controls/src/Core/Handlers/Items2/ItemsViewHandler2.iOS.cssrc/Controls/src/Core/Handlers/Items2/iOS/CarouselViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/GroupableItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cssrc/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cssrc/Controls/src/Core/Handlers/Items2/iOS/SelectableItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/StructuredItemsViewController2.cssrc/Controls/src/Core/Handlers/Items2/iOS/TemplatedCell2.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polygon/PolygonHandler.iOS.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Android.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Tizen.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.Windows.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.cssrc/Controls/src/Core/Handlers/Shapes/Polyline/PolylineHandler.iOS.cssrc/Controls/src/Core/Handlers/Shell/ShellHandler.Windows.cssrc/Controls/src/Core/Handlers/Shell/ShellItemHandler.Windows.cssrc/Controls/src/Core/Handlers/Shell/ShellSectionHandler.Windows.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellFlyoutItemView.cssrc/Controls/src/Core/Handlers/Shell/Windows/ShellView.cssrc/Controls/src/Core/Hosting/AppHostBuilderExtensions.cssrc/Controls/src/Core/ImageElement.cssrc/Controls/src/Core/IndicatorView/IndicatorStackLayout.cssrc/Controls/src/Core/InputView/InputView.cssrc/Controls/src/Core/Internals/WeakEventProxy.cssrc/Controls/src/Core/Items/SelectionList.cssrc/Controls/src/Core/Label/Label.Mapper.cssrc/Controls/src/Core/Label/Label.cssrc/Controls/src/Core/Label/Label.iOS.cssrc/Controls/src/Core/ListView/ListView.cssrc/Controls/src/Core/NavigationPage/NavigationPage.cssrc/Controls/src/Core/NavigationPage/NavigationPageToolbar.cssrc/Controls/src/Core/Page/Page.cssrc/Controls/src/Core/Picker/Picker.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.Android.cssrc/Controls/src/Core/Platform/AlertManager/AlertManager.cssrc/Controls/src/Core/Platform/Android/BottomNavigationViewUtils.cssrc/Controls/src/Core/Platform/Android/DragAndDropGestureHandler.cssrc/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cssrc/Controls/src/Core/Platform/Android/GenericAnimatorListener.cssrc/Controls/src/Core/Platform/Android/TabbedPageManager.cssrc/Controls/src/Core/Platform/GestureManager/GesturePlatformManager.iOS.cssrc/Controls/src/Core/Platform/ModalNavigationManager/ModalNavigationManager.iOS.cssrc/Controls/src/Core/Platform/Windows/CollectionView/ItemContentControl.cssrc/Controls/src/Core/Platform/Windows/CollectionView/ScrollHelpers.cssrc/Controls/src/Core/Platform/iOS/Extensions/FormattedStringExtensions.cssrc/Controls/src/Core/Platform/iOS/Extensions/LabelExtensions.cssrc/Controls/src/Core/PromptArguments.cssrc/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txtsrc/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txtsrc/Controls/src/Core/RadioButton/RadioButton.cssrc/Controls/src/Core/RadioButton/RadioButtonGroup.cssrc/Controls/src/Core/RadioButton/RadioButtonGroupController.cssrc/Controls/src/Core/ResourcesExtensions.cssrc/Controls/src/Core/Setter.cssrc/Controls/src/Core/Shadow.cssrc/Controls/src/Core/Shapes/Shape.cssrc/Controls/src/Core/Shell/Shell.cssrc/Controls/src/Core/Shell/ShellNavigationManager.cssrc/Controls/src/Core/Shell/ShellSection.cssrc/Controls/src/Core/SwipeView/SwipeItem.cssrc/Controls/src/Core/SwipeView/SwipeItemView.cssrc/Controls/src/Core/SwipeView/SwipeItems.cssrc/Controls/src/Core/SwipeView/SwipeView.cssrc/Controls/src/Core/TabbedPage/TabbedPage.Windows.cssrc/Controls/src/Core/Toolbar/Toolbar.Android.cssrc/Controls/src/Core/VisualElement/VisualElement.cssrc/Controls/src/Core/VisualStateManager.cssrc/Controls/src/Core/WebView/WebViewSource.cssrc/Controls/src/Core/Window/Window.Android.cssrc/Controls/src/Core/Window/Window.cssrc/Controls/src/SourceGen/NodeSGExtensions.cssrc/Controls/src/Xaml/ApplyPropertiesVisitor.cssrc/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cssrc/Controls/src/Xaml/MarkupExtensions/StaticResourceExtension.cssrc/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformWrapperView.javasrc/Core/maps/src/Handlers/Map/MapHandler.Android.cssrc/Core/maps/src/Handlers/Map/MapHandler.iOS.cssrc/Core/maps/src/Handlers/MapPin/MapPinHandler.Android.cssrc/Core/maps/src/Platform/iOS/MauiMKMapView.cssrc/Core/maps/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/Animations/AnimationManager.cssrc/Core/src/Diagnostics/DiagnosticsManager.cssrc/Core/src/Diagnostics/IDiagnosticsManager.cssrc/Core/src/Diagnostics/Instrumentation/DiagnosticInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutArrangeInstrumentation.cssrc/Core/src/Diagnostics/Instrumentation/LayoutDiagnosticMetrics.cssrc/Core/src/Diagnostics/Instrumentation/LayoutMeasureInstrumentation.cssrc/Core/src/Graphics/MauiDrawable.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.Android.cssrc/Core/src/Handlers/Button/ButtonHandler.cssrc/Core/src/Handlers/Button/ButtonHandler.iOS.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.MacCatalyst.cssrc/Core/src/Handlers/Editor/EditorHandler.iOS.cssrc/Core/src/Handlers/Entry/EntryHandler.cssrc/Core/src/Handlers/Entry/EntryHandler.iOS.cssrc/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Android.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Standard.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Tizen.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cssrc/Core/src/Handlers/Image/ImageHandler.Windows.cssrc/Core/src/Handlers/Image/ImageHandler.iOS.cssrc/Core/src/Handlers/Label/LabelHandler.cssrc/Core/src/Handlers/Label/LabelHandler.iOS.cssrc/Core/src/Handlers/Picker/PickerHandler.Windows.cssrc/Core/src/Handlers/Picker/PickerHandler.iOS.cssrc/Core/src/Handlers/ProgressBar/ProgressBarHandler.iOS.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.cssrc/Core/src/Handlers/RadioButton/RadioButtonHandler.iOS.cssrc/Core/src/Handlers/RefreshView/RefreshViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cssrc/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler.iOS.cssrc/Core/src/Handlers/SearchBar/SearchBarHandler2.Android.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.Standard.cssrc/Core/src/Handlers/ShapeView/ShapeViewHandler.cssrc/Core/src/Handlers/Stepper/StepperHandler.iOS.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Android.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.Windows.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.cssrc/Core/src/Handlers/SwipeItemMenuItem/SwipeItemMenuItemHandler.iOS.cssrc/Core/src/Handlers/Switch/SwitchHandler.iOS.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Android.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.Windows.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.cssrc/Core/src/Handlers/TimePicker/TimePickerHandler.iOS.cssrc/Core/src/Handlers/View/ViewHandler.cssrc/Core/src/Handlers/WebView/WebViewHandler.Android.cssrc/Core/src/Hosting/EssentialsMauiAppBuilderExtensions.cssrc/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.Android.cssrc/Core/src/ImageSources/FontImageSourceService/FontImageSourceService.Windows.cssrc/Core/src/Layouts/Flex.cssrc/Core/src/Platform/Android/ActivityIndicatorExtensions.cssrc/Core/src/Platform/Android/ActivityResultCallbackRegistry.cssrc/Core/src/Platform/Android/BorderDrawable.cssrc/Core/src/Platform/Android/ContainerView.cssrc/Core/src/Platform/Android/EditTextExtensions.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.Lifecycle.cssrc/Core/src/Platform/Android/MauiAppCompatActivity.cssrc/Core/src/Platform/Android/MauiHybridWebView.cssrc/Core/src/Platform/Android/MauiHybridWebViewClient.cssrc/Core/src/Platform/Android/MauiScrollView.cssrc/Core/src/Platform/Android/MauiSearchView.cssrc/Core/src/Platform/Android/MauiSwipeRefreshLayout.cssrc/Core/src/Platform/Android/MauiSwipeView.cssrc/Core/src/Platform/Android/MauiWebView.cssrc/Core/src/Platform/Android/MauiWebViewClient.cssrc/Core/src/Platform/Android/MauiWindowInsetListener.cssrc/Core/src/Platform/Android/Navigation/NavigationRootManager.cssrc/Core/src/Platform/Android/RadioButtonExtensions.cssrc/Core/src/Platform/Android/SafeAreaExtensions.cssrc/Core/src/Platform/Android/SearchViewExtensions.cssrc/Core/src/Platform/Android/TextViewExtensions.cssrc/Core/src/Platform/Android/TimePickerExtensions.cssrc/Core/src/Platform/Android/ViewExtensions.cssrc/Core/src/Platform/Android/WrapperView.cssrc/Core/src/Platform/Windows/ContentPanel.cssrc/Core/src/Platform/Windows/LayoutPanel.cssrc/Core/src/Platform/Windows/MauiPasswordTextBox.cssrc/Core/src/Platform/Windows/MauiToolbar.xaml.cssrc/Core/src/Platform/Windows/PickerExtensions.cssrc/Core/src/Platform/Windows/RadioButtonExtensions.cssrc/Core/src/Platform/Windows/RootNavigationView.cssrc/Core/src/Platform/Windows/ScrollViewerExtensions.cssrc/Core/src/Platform/Windows/Styles/MauiComboBoxStyle.xamlsrc/Core/src/Platform/Windows/Styles/Resources.xamlsrc/Core/src/Platform/Windows/TextBoxExtensions.cssrc/Core/src/Platform/Windows/TimePickerExtensions.cssrc/Core/src/Platform/Windows/WebViewExtensions.cssrc/Core/src/Platform/iOS/ButtonExtensions.cssrc/Core/src/Platform/iOS/KeyboardAcceleratorExtensions.cssrc/Core/src/Platform/iOS/LayerExtensions.cssrc/Core/src/Platform/iOS/MauiPageControl.cssrc/Core/src/Platform/iOS/MauiScrollView.cssrc/Core/src/Platform/iOS/MauiSwipeView.cssrc/Core/src/Platform/iOS/MauiTextField.cssrc/Core/src/Platform/iOS/MauiTextView.cssrc/Core/src/Platform/iOS/MauiUIApplicationDelegate.Menu.cssrc/Core/src/Platform/iOS/MauiView.cssrc/Core/src/Platform/iOS/NoCaretField.cssrc/Core/src/Platform/iOS/PickerExtensions.cssrc/Core/src/Platform/iOS/SemanticExtensions.cssrc/Core/src/Platform/iOS/SliderExtensions.cssrc/Core/src/Platform/iOS/TabbedViewExtensions.cssrc/Core/src/Platform/iOS/TextFieldExtensions.cssrc/Core/src/Platform/iOS/TimePickerExtensions.cssrc/Core/src/Platform/iOS/WrapperView.cssrc/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txtsrc/Core/src/ViewExtensions.cssrc/Core/src/WindowExtensions.cssrc/Essentials/samples/Samples/View/ScreenshotPage.xamlsrc/Essentials/src/AssemblyInfo/AssemblyInfo.shared.cssrc/Essentials/src/Browser/Browser.android.cssrc/Essentials/src/Clipboard/Clipboard.shared.cssrc/Essentials/src/FilePicker/FilePicker.tizen.cssrc/Essentials/src/FileSystem/FileSystemUtils.android.cssrc/Essentials/src/FileSystem/FileSystemUtils.shared.cssrc/Essentials/src/MainThread/MainThread.netstandard.cssrc/Essentials/src/MainThread/MainThread.shared.cssrc/Essentials/src/MediaPicker/MediaPicker.android.cssrc/Essentials/src/MediaPicker/MediaPicker.ios.cssrc/Essentials/src/MediaPicker/MediaPicker.tizen.cssrc/Essentials/src/Screenshot/Screenshot.android.cssrc/Essentials/src/TextToSpeech/TextToSpeech.ios.tvos.watchos.cssrc/Essentials/src/TextToSpeech/TextToSpeech.shared.cssrc/Essentials/src/TextToSpeech/TextToSpeech.windows.cssrc/Essentials/src/Types/Shared/WebUtils.shared.cssrc/Graphics/src/Graphics/Platforms/Android/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/MaciOS/PlatformCanvas.cssrc/Graphics/src/Graphics/Platforms/Windows/PlatformGraphicsView.cssrc/Graphics/src/Graphics/Platforms/iOS/PlatformGraphicsView.cssrc/SingleProject/Resizetizer/src/GenerateTizenManifest.cssrc/SingleProject/Resizetizer/src/SkiaSharpSvgTools.cssrc/SingleProject/Resizetizer/src/nuget/buildTransitive/Microsoft.Maui.Resizetizer.After.targetssrc/Templates/src/Microsoft.Maui.Templates.csprojsrc/Templates/src/templates/maui-mobile/MauiApp.1.csproj
New files (not reverted):
eng/devices/Run-PackagedAppAndWait.ps1src/Controls/src/Core/Handlers/Items/iOS/IScrollTrackingDelegator.cssrc/Controls/src/Core/Platform/AlertManager/DelegateAlertSubscription.cssrc/Core/maps/src/Handlers/Map/MapElementPlatformOptions.Android.cssrc/Core/src/Handlers/HybridWebView/HybridWebViewHelper.cssrc/Core/src/Platform/Android/AppbarLayoutExtensions.cssrc/Core/src/Platform/Android/IBackNavigationState.cssrc/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cssrc/Core/src/Platform/Windows/CharacterSpacingConverter.cssrc/Core/src/Platform/Windows/ContentPanelAutomationPeer.cssrc/Core/src/Platform/Windows/MauiBorderAutomationPeer.cssrc/Core/src/Platform/Windows/MauiLayoutAutomationPeer.cssrc/Core/src/Platform/iOS/MauiProgressView.cssrc/Core/src/ScreenshotDispatch.cssrc/Templates/src/templates/maui-blazor-solution/.gitignoresrc/Templates/src/templates/maui-blazor/.gitignoresrc/Templates/src/templates/maui-lib/.gitignoresrc/Templates/src/templates/maui-mobile/.gitignoresrc/Templates/src/templates/maui-multiproject/.gitignore
UI Tests — Button,ViewBaseTests
Detected UI test categories: Button,ViewBaseTests
Pre-Flight — Context & Validation
Issue: #35513 - Button TextColor does not restore to platform default when reset to null after dynamic update
PR: #35563 - Local PR branch pr-review-35563
Platforms Affected: iOS (gate platform); issue metadata also lists Android/macOS
Files Changed: 301 implementation/support files, Issue35513 UI test files present
Key Findings
- GitHub metadata could not be fetched because gh is unauthenticated; context was gathered from local branch diff and existing gate artifacts.
- Gate already verified the base branch reproduces Issue35513 on iOS: TextViewBasedControlsRestoreDefaultAfterResetToNull fails by screenshot difference after TextColor is reset to null.
- The PR branch initially failed before runtime validation because iOS PublicAPI analyzer errors blocked build.
- The PR's Issue35513-relevant fix changes UIButton.UpdateTextColor to clear title colors only after platformButton.Window is available.
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: high
Errors: 1 | Warnings: 1 | Suggestions: 0
Key code review findings:
- ERROR: iOS PublicAPI analyzer errors block validation: duplicate StructuredItemsViewController2.UpdateFlowDirection() and FormattedStringExtensions public signature drift.
- WARNING: Original Button reset logic depends on window attachment and may miss mapper updates that happen before the platform button is attached.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #35563 | Clear UIButton title colors on TextColor null only when attached to a Window, then use window TintColor | FAIL - BUILD ERROR (Gate) | ButtonExtensions.cs, PublicAPI/test files | Original PR did not compile in gate |
Code Review — Deep Analysis
Code Review - PR #35563
Independent Assessment
What this changes: The local PR branch contains a large squashed change set. The Issue35513-relevant code changes add an iOS Button TextColor reset fix in src/Core/src/Platform/iOS/ButtonExtensions.cs, add Issue35513 UI coverage, and include unrelated build/API changes that affect iOS compilation.
Inferred motivation: Fix iOS text-color reset behavior after dynamically setting TextColor and then resetting it to null, while preserving platform defaults.
Reconciliation with PR Narrative
Author claims: GitHub PR metadata could not be fetched because gh is unauthenticated in this environment. Gate artifacts show the targeted regression is Issue35513 on iOS.
Agreement/disagreement: Local code and gate artifacts agree that Issue35513 is the target. The original PR fix did not reach runtime validation because the PR branch failed iOS build validation on PublicAPI analyzer errors.
Findings
Error - iOS PublicAPI files block validation
The gate failed before tests could run because src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt declared StructuredItemsViewController2.UpdateFlowDirection() twice. Candidate testing also uncovered shipped API signature drift in FormattedStringExtensions.ToNSAttributedString(...) caused by adding a new optional public parameter without corresponding API compatibility handling.
Warning - PR Button reset relies on window attachment
The original PR UIButton.UpdateTextColor fix clears title colors only when platformButton.Window exists, so mapper timing can determine whether resetting TextColor to null actually restores native defaults.
Devil's Advocate
The gate failure is partly caused by broad PR-branch compile blockers rather than the Button fix itself. However, a fix candidate must build before runtime behavior can be evaluated, so build-blocker cleanup was included as validation support rather than treated as the alternative text-color strategy.
Verdict: NEEDS_CHANGES
Confidence: high
Summary: The original PR branch does not compile on iOS under the gate. The Button fix can be improved by restoring captured native defaults instead of relying on window attachment and null title-color clearing.
Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | Capture native UIButton title/tint defaults in ButtonHandler.iOS.cs and restore them on TextColor null; clean iOS PublicAPI build blockers so validation reaches runtime | PASS | 4 files | Better than PR fix: no Window lifecycle dependency, preserves UIAppearance/proxy defaults |
| PR | PR #35563 | Clear UIButton title colors on null only when platformButton.Window exists, then use window TintColor | FAIL - BUILD ERROR (Gate) | multiple files | Original PR blocked by iOS PublicAPI analyzer errors |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| maui-expert-reviewer | 2 | No | NO NEW IDEAS for standard iOS Button; optional future MacCatalyst-specific UIButtonConfiguration.BaseForegroundColor reset if expanding scope |
Exhausted: Yes - Candidate 1 passed all requested iOS tests and expert review found no better meaningfully distinct standard iOS Button approach.
Selected Fix: Candidate #1 - Captured native defaults are more deterministic than the PR's window-guarded null clearing and passed the iOS Issue35513 regression test.
Report — Final Recommendation
Comparative Fix Report - PR #35563
Candidates
| Rank | Candidate | Result | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
PASS by equivalence to try-fix-1 |
Best candidate. It keeps the PR's target scenario but applies expert feedback: removes iOS PublicAPI blockers and restores captured UIButton native defaults instead of relying on Window attachment timing. |
| 2 | try-fix-1 |
PASS | Same effective implementation as pr-plus-reviewer: captured default title/tint colors plus PublicAPI cleanup. It passed BuildAndRunHostApp.ps1 -Platform ios -TestFilter FullyQualifiedName~Issue35513. |
| 3 | pr |
FAIL | Raw PR failed iOS validation before runtime due to PublicAPI analyzer/build blockers. Its Button reset logic also remains timing-dependent because it only clears native title colors when platformButton.Window exists. |
Candidate details
pr clears explicit UIButton title colors on TextColor = null only after the button is attached to a window, then sets TintColor from the window. This did not compile under gate validation because the PR branch also included iOS PublicAPI issues, and the reset strategy can miss pre-window mapper updates.
try-fix-1 captures native UIButton defaults after proxy setup and restores them on null reset. It also fixes the unrelated iOS PublicAPI blockers that prevented runtime validation. This candidate passed the targeted iOS Issue35513 UI tests.
pr-plus-reviewer applies the expert reviewer's actionable feedback to the PR fix in the sandbox. The resulting implementation matches the proven try-fix-1 behavior while preserving the PR-centered candidate identity required by this phase.
Winner
pr-plus-reviewer is the winning candidate. It ranks above the raw PR because failed candidates must rank below passing candidates, and it ranks above try-fix-1 only because it is the same passing fix expressed as the PR plus expert-review feedback, which is the intended output of Phase 1.
Future Action — review latest findings
No alternative fix was selected for this run. Review the session findings and CI results before merging.
…oid (#35563) <!-- 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! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue Details Button TextColor is set at runtime (for example, DarkRed) and then reset to null. Expected behavior: the button text should return to the platform default color. ### Root Cause Setting TextColor applies native foreground/title overrides. When TextColor was reset to null, some handlers did not actively clear those native overrides. ### Description of Change Android : Saved each control’s original TextColors once and reused it when TextColor is null, restoring the real platform default. iOS : Updated iOS button text color handling in [ButtonExtensions.cs](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html) to clear overridden title colors when TextColor is null. Validated the behavior in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Issues Fixed Fixes #35513 ### Output ScreenShot Android |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/9728c36a-5b0d-4061-8190-fc550e65d128" >| <video src="https://github.com/user-attachments/assets/5a3470c6-b663-4ae6-9d88-5222102a455b">| iOS |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/bfd4f513-9bf0-4f25-8151-621a593c5d1f" >| <video src="https://github.com/user-attachments/assets/faebe1b3-c01a-4906-8a9b-7da581dec527">| ---------

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
Button TextColor is set at runtime (for example, DarkRed) and then reset to null.
Expected behavior: the button text should return to the platform default color.
Root Cause
Setting TextColor applies native foreground/title overrides. When TextColor was reset to null, some handlers did not actively clear those native overrides.
Description of Change
Android : Saved each control’s original TextColors once and reused it when TextColor is null, restoring the real platform default.
iOS : Updated iOS button text color handling in ButtonExtensions.cs to clear overridden title colors when TextColor is null.
Validated the behavior in the following platforms
Issues Fixed
Fixes #35513
Output ScreenShot
Android
35513-Android-BeforeFix.mov
35513-AfterFix-Android.mov
iOS
35513-BeforeFix-iOS.mov
35513-AfterFix-iOS.mov