Repository navigation
[release/10.0.1xx-sr10] Integrate .NET MAUI 10.0.101 VS insertion payload - #37746
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 37746Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 37746" |
|
Azure Pipelines: Successfully started running 1 pipeline(s). There may be pipelines that require an authorized user to comment /azp run to run. |
…ies (#37724) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1e7f77e3-4862-4b92-a662-d12b5918bb59
ac04dff to
7e10776
Compare
|
/azp run |
|
Azure Pipelines: Successfully started running 3 pipeline(s). |
There was a problem hiding this comment.
Pull request overview
This PR integrates the staged .NET MAUI 10.0.101 (SR10.1) Visual Studio insertion payload into release/10.0.1xx-sr10, combining several servicing regression backports plus the SkiaSharp 4.150.1 update across Essentials, Controls, Core platform code, Graphics, and build/signing infrastructure.
Changes:
- Updates Android Essentials activity-result plumbing to correctly support child activities, activity recreation, and task-removal cancellation, and wires MediaPicker’s photo picker usage through the correct launching
ComponentActivity. - Refactors iOS safe-area handling to per-edge ancestor arbitration (shared by
MauiViewandMauiScrollView) and ensures safe-area changes invalidate descendants. - Updates SkiaSharp-dependent code paths and dependencies (SkiaSharp/Svg.Skia ecosystem), including Resizetizer/Graphics adjustments and associated test updates.
Reviewed changes
Copilot reviewed 47 out of 50 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/SingleProject/Resizetizer/test/UnitTests/ResizetizeImagesTests.cs | Updates Resizetizer SVG test coverage to include a new “good” SVG and a dedicated invalid SVG. |
| src/SingleProject/Resizetizer/test/UnitTests/images/invalid.svg | Adds intentionally malformed SVG used for error-path tests. |
| src/SingleProject/Resizetizer/src/TizenSplashUpdater.cs | Removes obsolete Skia filter-quality usage during splash generation. |
| src/SingleProject/Resizetizer/src/SkiaSharpTools.cs | Removes obsolete SKPaint.FilterQuality usage in Resizetizer’s paint configuration. |
| src/SingleProject/Resizetizer/src/SkiaSharpAppIconTools.cs | Keeps SKPath.AddCircle with an explicit pragma to support compatibility across SkiaSharp bands. |
| src/SingleProject/Resizetizer/src/ResizetizerPackages.projitems | Adds additional Svg.* assemblies to the Resizetizer packaging set. |
| src/Graphics/tests/Graphics.Tests/ImageAssert.cs | Fixes failure message wording and uses the effective threshold argument value. |
| src/Graphics/src/Graphics.Skia/SKPaintExtensions.cs | Removes copying obsolete text/font-related members from SKPaint copies. |
| src/Graphics/src/Graphics.Skia/SkiaTextLayout.cs | Routes SKPaint overload through the SKFont overload with null font (SkiaSharp 4 text changes). |
| src/Graphics/src/Graphics.Skia/SkiaCanvasStateService.cs | Removes obsolete SKPaint.Typeface initialization; relies on SKFont. |
| src/Graphics/src/Graphics.Skia/SkiaCanvasState.cs | Migrates state tracking from SKPaint text fields to SKFont and updates reset logic accordingly. |
| src/Graphics/src/Graphics.Skia/SkiaCanvas.cs | Migrates path construction to SKPathBuilder, updates text draw calls, and updates bitmap drawing API usage. |
| src/Graphics/src/Graphics.Skia/SKGraphicsExtensions.cs | Migrates SKPath construction to SKPathBuilder for multiple path-conversion helpers. |
| src/Essentials/test/DeviceTests/Tests/ActivityStateManagerRecreation_Tests.Android.cs | Adds Android device tests for activity-result adoption through recreation and task-removal cancellation. |
| src/Essentials/test/DeviceTests/Tests/ActivityStateManager_Tests.cs | Adds unit test coverage for adopting pending activity-result requests across recreated state. |
| src/Essentials/src/Platform/ActivityStateManager.android.cs | Centralizes activity-result request registration/state callbacks through lifecycle listener wiring. |
| src/Essentials/src/Platform/ActivityForResultRequest.android.cs | Reworks activity-result request handling to be per-ComponentActivity, persist owners across recreation, and monitor task removal. |
| src/Essentials/src/MediaPicker/MediaPicker.android.cs | Launches photo picker requests via the correct ComponentActivity instance and improves error messaging. |
| src/Core/tests/DeviceTests/Handlers/Window/WindowHandlerTests.Android.cs | Adds coverage for Material2/Material3 status-bar appearance behavior. |
| src/Core/tests/DeviceTests/Handlers/Button/ButtonHandlerTests.iOS.cs | Adds iOS device tests ensuring native UIButton styling is preserved across handler reuse and unsupported paints. |
| src/Core/src/Platform/iOS/SafeAreaPadding.cs | Adds safe-area helpers, descendant invalidation, and shared parent-blocked-edge resolution logic. |
| src/Core/src/Platform/iOS/MauiView.cs | Implements per-edge safe-area ancestor arbitration with cached blocked edges and shared resolver logic. |
| src/Core/src/Platform/iOS/MauiScrollView.cs | Aligns scroll-view safe-area behavior with per-edge ancestor arbitration (manual + system-inset paths). |
| src/Core/src/Platform/iOS/ButtonExtensions.cs | Preserves native UIButton background styling until MAUI has applied a background; tracks MAUI background application state. |
| src/Core/src/Platform/Android/WindowExtensions.cs | Resolves status-bar icon appearance via theme-derived background color (Material2 primary vs Material3 surface). |
| src/Core/src/Platform/Android/MauiSwipeView.cs | Adjusts SwipeItem measurement so height is AtMost to keep icon/text vertically centered. |
| src/Core/src/Handlers/View/ViewHandler.iOS.cs | Forces safe-area invalidation across descendants when SafeAreaEdges changes. |
| src/Core/src/Handlers/ContentView/ContentViewHandler.Windows.cs | Detaches platform content from existing parents before reparenting to avoid WinUI COM exceptions. |
| src/Core/src/Handlers/Border/BorderHandler.Windows.cs | Same WinUI detachment/reparenting approach for Border content updates. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue37706.cs | Adds Android UI test for root-page OnBackButtonPressed override invocation. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue36749.cs | Adds iOS/MacCatalyst UI test validating native UIButton styling preservation with null Background updates. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue36298.cs | Adds UI test for dynamic ContentPresenter content switching without crash. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35826.cs | Adds Android UI test ensuring MediaPicker returns from child activities and enforces overlap/cancel behavior. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue34563.cs | Adds iOS/MacCatalyst UI test for per-edge safe-area arbitration correctness. |
| src/Controls/tests/TestCases.HostApp/MauiProgram.cs | Registers an issue-specific iOS/MacCatalyst handler for the Button styling regression page. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue37706.cs | Adds HostApp repro page for root-page back handling. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue36749.cs | Adds HostApp repro page and custom handler/native UIButton subclass for the Button styling regression. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue36298.cs | Adds HostApp repro page for Windows ContentPresenter dynamic switching scenario. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue35826.cs | Adds HostApp repro page and child activity for MediaPicker child-activity scenario. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue34563.cs | Adds HostApp repro page for per-edge safe-area arbitration scenario. |
| src/Controls/tests/DeviceTests/Elements/SwipeView/SwipeViewTests.cs | Ensures required handlers are registered for SwipeView + CollectionView device tests. |
| src/Controls/tests/DeviceTests/Elements/SwipeView/SwipeViewTests.Android.cs | Adds Android device test verifying SwipeItem icon/text alignment across different CollectionView item counts. |
| src/Controls/tests/Core.UnitTests/WindowsTests.cs | Adds unit tests for back-navigation consumption detection with/without overrides. |
| src/Controls/src/Core/Window/Window.cs | Changes back-navigation consumption logic to honor custom OnBackButtonPressed overrides. |
| src/Controls/src/Core/Page/Page.cs | Adds cached detection of whether OnBackButtonPressed is overridden outside the framework assembly. |
| eng/Versions.props | Updates System.* package versions and SkiaSharp/Svg.Skia-related versions for the payload. |
| eng/Signing.props | Adds signing entries for new Svg.SceneGraph and Svg.Animation assemblies. |
| eng/NuGetVersions.targets | Ensures new Svg.* packages receive the correct pinned version. |
PureWeen
left a comment
There was a problem hiding this comment.
Adversarial review
❌ Regression — ResolveParentBlockedEdges caches whether an ancestor currently applies each safe-area edge, but a keyboard show/hide only marks _safeAreaInvalidated; it does not invalidate that cache for the parent or descendants. A SoftInput parent and Container child can therefore cache bottom as unblocked while the keyboard is hidden, then both apply bottom inset once it appears (and conversely retain the block after it hides). Invalidate descendant safe-area caches when keyboard state changes, and add a nested SoftInput/Container keyboard-transition regression test.
3/3 reviewers after dispute; independent reviewer consensus. The existing tests cover SafeAreaEdges changes but not this keyboard transition.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d00747b7-96f3-4e7a-8dfb-e3a48db04b2d
<!-- 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. !!!!!!! --> ### Root cause This PR addresses Android, iOS, and Mac Catalyst test failures. #### Android The MediaPicker tests searched for a specific Android Photo Picker "Cancel" button using XPath. The system picker UI differs across Android versions, causing the tests to time out. #### Mac Catalyst Issue36769 test fails because the OnAppearing code in CI runs before the button is loaded in the UI. ### Description of Change - Removed `WaitForPhotoPicker()` from the Android MediaPicker tests. - Used `App.Back()` directly to close the picker before verifying cancellation. - Re-saved the expected iOS snapshots. - Fixed test case failure in Issue36769 - Switched Issue36749 button background verification from OnAppearing to the Button's Loaded event for reliable pass/fail checks ### Tests #### Android - `OverlappingPhotoPickerRequestsAreRejected` - `PickPhotosAsyncShouldReturnFromChildActivity` #### iOS - `ShellTabBarBackgroundColor` - `MoreTabShouldRespectNavBarCustomization` - `BottomTabColorTest` #### Mac Catalyst - `NativeStyledButtonPreservesInitialAndClearsDetachedBackground`
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 50 out of 56 changed files in this pull request and generated 2 comments.
Suppressed comments (2)
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35826.cs:68
- This test is grouped under UITestCategories.SafeAreaEdges even though it validates an Essentials/MediaPicker activity-result scenario. Using UITestCategories.Essentials keeps category intent consistent and avoids running unrelated tests in the SafeAreaEdges lane.
// This test requires API 36+ because the issue reproduces only when Android strictly enforces ActivityResultLauncher ownership.
// This test belongs to the Essentials category.
// Use the SafeAreaEdges category because its device-farm lane runs on API 36+ devices.
[Test]
[Category(UITestCategories.SafeAreaEdges)]
public void OverlappingPhotoPickerRequestsAreRejected()
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35826.cs:93
- This test is categorized as UITestCategories.SafeAreaEdges but it exercises Essentials (MediaPicker/activity-result ownership). Prefer UITestCategories.Essentials for accurate grouping and to prevent SafeAreaEdges runs from picking up unrelated regressions.
// This test requires API 36+ because the issue reproduces only when Android strictly enforces ActivityResultLauncher ownership.
// This test belongs to the Essentials category.
// Use the SafeAreaEdges category because its device-farm lane runs on API 36+ devices.
[Test]
[Category(UITestCategories.SafeAreaEdges)]
public void FinishingLaunchingActivityCancelsPendingPhotoPicker()
| // This test requires API 36+ because the issue reproduces only when Android strictly enforces ActivityResultLauncher ownership. | ||
| // This test belongs to the Essentials category. | ||
| // Use the SafeAreaEdges category because its device-farm lane runs on API 36+ devices. | ||
| [Test] | ||
| [Category(UITestCategories.SafeAreaEdges)] | ||
| public void PickPhotosAsyncShouldReturnFromChildActivity() |
| { | ||
| Color = SKColors.Black, | ||
| IsAntialias = true, | ||
| #pragma warning disable CS0618 // Type or member is obsolete | ||
| Typeface = GetSKTypeface(), | ||
| #pragma warning restore CS0618 // Type or member is obsolete | ||
| }; |
…37960) ### Issue Details On Windows, dynamically updating the content of a ContentPresenter can throw a System.ArgumentException when the content contains controls such as RefreshView or ScrollView. This happens when a platform view is reused while it is still attached to its previous WinUI parent, causing a “PointerEventRouter object already has an owner” exception. The initial fix detached the platform view from its previous parent, but some scenarios still failed because: * The logical content was not detached before creating the control-template platform tree. * ContentPanel.Content = null could leave stale children in CachedChildren. ### Description of Change <!-- Enter description of the fix in this section --> Updated the Windows ContentViewHandler content-update flow to properly handle direct, templated, and empty content. * Detach the existing content before creating the template platform tree. * Added a RemoveFromParent helper to safely detach the incoming platform view without disconnecting its handler. * Clear ContentPanel.CachedChildren before assigning new content or when the content becomes null. ### 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 #37958 Fixed below test cases: Control.DeviceTests: * ControlTemplateInitializesCorrectly * ControlTemplateCanBeReplacedCorrectly * ContentView updating it's ControlTemplate works * PropagateContextCorrectly Core.DeviceTests: * Content Initializes Correctly * Content Updates Correctly * ContentIsSetInitially * WindowSupportsEmptyPage_Platform
This pull request makes a minor UI adjustment to the `Issue35826` test case in the host app. The only change is to the padding of the `pickerAvailabilityLabel`, increasing the top padding to improve visual spacing. * UI Adjustment: * Increased the top padding of pickerAvailabilityLabel from 0 to 150 in Issue35826.cs to prevent the label from being hidden behind the status bar, which could cause a timeout exception during the test. Removed the unnecessary changes added by Copilot that caused an exception in the test, while retaining the original test and the fix from #36769 **Fixes:** #37746 --------- Co-authored-by: devanathan-vaithiyanathan <114395405+devanathan-vaithiyanathan@users.noreply.github.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
src/Graphics/src/Graphics.Skia/SkiaCanvas.cs:880
- DrawImage() now forces nearest-neighbor sampling for all bitmap draws. This is a behavior change from the previous default filtering and will noticeably degrade scaled image quality (pixelation) for typical UI/graphics rendering. Use linear sampling (and mipmaps when downscaling) unless this method is explicitly intended for pixel-art rendering.
- Files reviewed: 49/55 changed files
- Comments generated: 1
- Review effort level: Lite
| else if (platformView?.Parent is MauiPanel existingPanel) | ||
| { | ||
| existingPanel.CachedChildren.Remove(platformView); | ||
| } | ||
| } |
|
/azp run |
|
Azure Pipelines: Successfully started running 3 pipeline(s). |
| if (!_emptyUIView.Frame.Equals(frame)) | ||
| { | ||
| // UIKit's Frame is undefined under a non-identity transform. | ||
| _emptyUIView.Transform = CGAffineTransform.MakeIdentity(); | ||
| _emptyUIView.Frame = frame; | ||
| } |
|
All checks are green |
<!-- 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! ## Summary Bumps the SR10 release branch package patch version from `10.0.100` to `10.0.101` after the SR10.1 payload merge. ## Changes - Updates `eng/Versions.props` `PatchVersion` from `100` to `101`. - Leaves `SdkBandVersion`, `PreReleaseVersionLabel=servicing`, and stable-package settings unchanged. ## Context Follow-up to #37746 for the 10.0.101 release completion checklist.
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!
Summary
Integrates the staged .NET MAUI 10.0.101 (SR10.1) payload from
inflight/10.0.101intorelease/10.0.1xx-sr10, based on the shipped10.0.100release.The full release inventory and servicing decisions are tracked in #37723. The authoritative regression query remains the source for the servicing-regression scope.
Important
Checked items under Staged in this PR are merged into
inflight/10.0.101, not yet intorelease/10.0.1xx-sr10. They reach the release branch only when this aggregate PR is merged.Status at a glance
inflight/10.0.101.SKPath.AddCirclecompatibility fix.release/10.0.1xx-sr10.Staged in this PR
Servicing regressions
ContentPresenterassignment. Source [Windows]Fix ContentPresenter Throws System.ArgumentException When Dynamically Assigning RefreshView or ScrollView Content #36430; component backport [release/10.0.1xx-sr10] Fix dynamic ContentPresenter assignment #37725.SafeAreEdgeisn't respected whenTopandBottomconstraints mismatch #34563 — per-edge iOS safe-area handling. Source [iOS] Fix for SafeAreaEdges not respected per-edge when parent and child handle different edges #37033; component backport [release/10.0.1xx-sr10] Fix per-edge iOS safe area handling #37728.TranslationYlayout padding. Source fix [Android] Fix incorrect top padding when translating views offscreen #37772; focused backport commit10799e67df.d26faa8e93.Screenshot.CaptureAsyncsynchronous UI-thread deadlock. Source fix [Android] Fix Screenshot.CaptureAsync deadlock for synchronous UI-thread callers #37680; focused backport commit778040a233.Planned Skia payload
SKPath.AddCirclecompatibility change from Fix inflight/current build breaks (duplicate MAUIX2017, obsolete AddCircle, Assert.IsTrue) #36787; exclude its unrelated SourceGen changes._SkiaSharpNativeAssetsVersion, or record an explicit release-owner waiver.Integration follow-ups
inflight/currenthistory.Already present on the SR10 base — no new merge needed
Completed disposition — no backport required
SwipeView.Thresholdbehavior from Fix SwipeView Threshold changes width and offset of the side menu (when visible) #36878; any SwipeItem sizing concern should be tracked separately.Not included yet — merge, defer, or explicitly disposition before payload freeze
PointerGestureRecognizer; replacement fix [Android] Fix CollectionView item selection not triggered when using PointerGestureRecognizer #37952 remains draft againstmain.tformat forces en-US; fix [iOS] Fix TimePicker forcing en-US culture on iOS instead of device culture #37797 remains draft againstmain.SafeAreaEdgeswith Shell tab navigation and hidden TabBar; source fix [Android] Fix stale bottom safe area after Shell tab navigation with TabBarIsVisible=False #36474 remains open againstmainand has no SR10 backport.OnBackButtonPressed()in Release builds; no linked fix PR.Release completion
Before merging this PR
10.0.101candidate packages.eng/Versions.propsfrom patch100to101after the payload is frozen.release/10.0.1xx-sr10.After merge
10.0.101.Notes
/backportcommand was used for this release payload.vs/10.0.101toinflight/10.0.101.