[Android] Prevent the tap that closes an open SwipeView from being propagated to children#24275
Conversation
|
A more verbose explanation of the issue and the fix is here: #23921 (comment), I can add this to the PR description if desired. |
|
Hey @sjordanGSS thanks for your very first contribution! Exciting! A couple of things:
We appreciate you looking into this <3 |
|
Quick update on this: I've renamed the PR as requested, hopefully it's is a little more useful now. I've been trying to write unit tests for the change but have been having trouble getting things to work: Visual Studio 17.11.1 crashes when I open any solution file, and VS Code fails to run the unit test app with an error that it can't find MainActivity. I'm working on this between other things at my day job and we've already fixed the issue on our side so I'm not able to dedicate a whole lot of time to working this out. |
|
I've pushed a commit with two unit tests which I'm not able to run locally (I got the projects to load in Visual Studio, but it throws the same exception as VS Code: |
|
@dotnet-policy-service agree company="Global Stock Systems Ltd" |
|
/rebase |
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
|
@jsuarezruiz Thanks for running the tests. I've gotten the working on my pc now and I can see there are some problems with the tests I've written for this PR. I've pushed some changes, but it's currently in the situation where one test will fail if it is run immediately after the other. I'm still getting used to this testing framework unfortunately. Is there a better way to check if a button has been clicked than to set the text, and then check it in the test case? Thanks! |
|
I've fixed the tests by duplicating the controls for each test. Can they be rerun? |
|
@PureWeen @jsuarezruiz can tests be rerun on this PR? I've just updated the fork as it had gotten old |
|
/rebase |
262561a to
21291ca
Compare
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
|
Huh, these were succeeding locally last time I ran them, and now the test project isn't compiling on my machine ;_; |
🤖 AI Summary📊 Expand Full Review🔍 Pre-Flight — Context & Validation📝 Review Session — Apply review suggestions from PR #24275 ·
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #24275 | Early return _isOpen when diffX==0 && diffY==0 in ShouldInterceptTouch |
⏳ PENDING (Gate) | MauiSwipeView.cs (+3) |
Original PR |
🚦 Gate — Test Verification
📝 Review Session — Apply review suggestions from PR #24275 · caac343
Result: ❌ FAILED (Infrastructure/Environment Issues - 2 attempts)
Platform: android
Mode: Full Verification (RequireFullVerification)
Attempt 1 (first retry)
- Run WITHOUT fix: ❌ ADB0010 Broken pipe — Android deployment failure before tests ran
- Run WITH fix: ❌ ADB timeout — emulator state degraded from first failed run
Attempt 2 (second retry)
- Both builds SUCCEEDED (6m 59s and 6m 28s respectively)
- BOTH runs FAILED at
FixtureSetupwithTimeoutException - Error: Cannot find
GoToTestButtonelement - Page source at failure: "System UI isn't responding" dialog (Android emulator crash)
- The
GoToTestButtonwas never visible because the Android System UI had crashed on the emulator
Analysis
All failures are confirmed infrastructure/environment issues:
- Run 1 (Attempt 1): Transient ADB broken pipe — emulator disconnected mid-deployment
- Run 2 (Attempt 2): Android emulator System UI crash —
"System UI isn't responding"ANR dialog appeared, blocking the test app
The tests never actually ran — they failed at the navigation setup step, not at the assertion step. This is a known flaky behavior with Android emulators under load.
The test logic itself appears correct (verified via static analysis):
- Two separate SwipeViews prevent state sharing between tests
SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTapuses swipe + click and checks button wasn't activatedSwipeViewTappedWhenClosed_PropagatesTapuses click only and checks button WAS activated
Phase 3 (try-fix) skipped — cannot run reliable tests in this environment.
🔧 Fix — Analysis & Comparison
📝 Review Session — Apply review suggestions from PR #24275 · caac343
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #24275 | Early return _isOpen when diffX==0 && diffY==0 in ShouldInterceptTouch |
MauiSwipeView.cs (+3) |
Original PR |
Exhausted: N/A — Phase skipped (Gate environment infrastructure failed after 2 attempts)
Selected Fix: PR's fix — logically correct based on static code analysis; empirical verification blocked by Android emulator crashes in this environment.
Root Cause Analysis
In MauiSwipeView.ShouldInterceptTouch() (Android), when a pure tap occurs:
ACTION_DOWNsets_initialPointinDispatchTouchEventOnInterceptTouchEventfires, callsShouldInterceptTouchinterceptPoint == _initialPointat this moment →diffX == 0, diffY == 0- Without fix: code falls through to swipe direction calculation → picks
SwipeDirection.Up(else branch) → if no UpItems configured, returnsfalse→ touch NOT intercepted → propagates to children (Button clicked, TapGestureRecognizer fires) - With fix: returns
_isOpen→ if open, intercepts the touch → children don't receive it → SwipeView closes
Note
Phase 3 (try-fix alternative exploration) was skipped because the Gate phase could not complete due to persistent Android emulator infrastructure failures (System UI crash). The PR's fix is the correct and only known approach based on the issue author's root-cause analysis.
📋 Report — Final Recommendation
📝 Review Session — Apply review suggestions from PR #24275 · caac343
✅ Final Recommendation: APPROVE
Summary
PR #24275 fixes a real Android-only bug where tapping to close an open SwipeView propagates the tap to child controls (Buttons, TapGestureRecognizers) inside SwipeView.Content. The fix is minimal, logically correct, and well-tested. Gate verification was blocked by Android emulator infrastructure failures in this environment (System UI crash), but code analysis confirms the fix is sound.
Root Cause
In MauiSwipeView.ShouldInterceptTouch() (Android):
ACTION_DOWNsets_initialPointinDispatchTouchEventOnInterceptTouchEventfires, callingShouldInterceptTouch- For a pure tap:
interceptPoint == _initialPoint→diffX == 0, diffY == 0 - Without fix: falls through to swipe direction calculation → picks
SwipeDirection.Up(else branch when diffs are both 0) → if noUpItemsconfigured, returnsfalse→ touch NOT intercepted → propagates to children → Button clicked / TapGestureRecognizer fires - With fix: returns
_isOpen→ if open, intercepts the touch → children don't receive it
Fix Quality
✅ Logic is correct — 3-line change precisely targets the root cause
✅ Both sides handled — Intercepts when open (prevents child activation), passes through when closed (preserves normal tap behavior)
✅ Code style — if (diffX == 0 && diffY == 0) has correct spacing, consistent with the rest of the file
✅ Files have trailing newlines — All 4 changed files verified
✅ Category correct — UITestCategories.SwipeView exists and is appropriate
✅ Android-only scope — Correctly scoped to src/Core/src/Platform/Android/
Test Coverage
Two complementary tests cover both cases:
SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap— swipe opens SwipeView, click on it to close, verify Button NOT activated (tests the bug fix)SwipeViewTappedWhenClosed_PropagatesTap— click on closed SwipeView, verify Button IS activated (tests normal behavior preserved)
Two separate SwipeViews prevent state sharing between tests — good design.
Gate Status
❌ Gate verification inconclusive — Android emulator crashed with "System UI isn't responding" ANR dialog on both attempts (2 retries). Infrastructure issue, not a test design issue. Test logic verified via static analysis.
PR Finalization
Title: ✅ Good
[Android] Prevent the tap that closes an open SwipeView from being propagated to children
Description:
The existing description is accurate but thin. Recommended addition:
<!-- 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!
### Root Cause
In `MauiSwipeView.ShouldInterceptTouch()`, when the user taps (rather than swipes) on an open `SwipeView`, `diffX == 0` and `diffY == 0`. The code fell through to the swipe direction calculation, picked `SwipeDirection.Up` (the else branch), and if no `UpItems` were defined, returned `false` — meaning `OnInterceptTouchEvent` did not intercept the touch. It propagated to child views, activating `Button`s and `TapGestureRecognizer`s.
### Description of Change
Adds an early return to `MauiSwipeView.ShouldInterceptTouch()`:
```csharp
if (diffX == 0 && diffY == 0)
return _isOpen;When the user performs a pure tap (zero movement), the method immediately returns whether the SwipeView is currently open. If open, the touch is intercepted — closing the SwipeView without activating children. If closed, the tap propagates to children normally.
Platform affected: Android only (src/Core/src/Platform/Android/MauiSwipeView.cs)
Issues Fixed
Fixes #23921
Platforms Tested
- iOS
- Android
- Windows
- Mac Catalyst
### Code Review
**✅ No blocking issues found.** Fix is clean, minimal, and correct. All previously noted style issues (space after `if`, trailing newlines) are already addressed in the current PR state.
</details>
</details>
---
</details>
<!-- /SECTION:PR-REVIEW -->
<!-- SECTION:PR-FINALIZE -->
<details>
<summary>📋 <strong>Expand PR Finalization Review</strong></summary>
---
<details>
<summary><b>Title: ✅ Good</b></summary>
<br>
**Current:** `[Android] Prevent the tap that closes an open SwipeView from being propagated to children`
</details>
<details>
<summary><b>Description: ✅ Good</b></summary>
<br>
Description needs updates. See details below.
### ✨ Suggested PR Description
<!-- 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!
### Root Cause
In `MauiSwipeView.ShouldInterceptTouch` on Android, a stationary tap (where `diffX == 0` and `diffY == 0`) was falling through to swipe-direction detection logic. That logic determined whether to intercept touch based on available swipe items in the detected direction — but for a zero-delta tap, there is no meaningful direction, so the method returned `false` (don't intercept). This allowed the tap to propagate to child views (e.g., `Button`, `TapGestureRecognizer`) even when the `SwipeView` was open, causing unintended activations.
### Description of Change
In `MauiSwipeView.cs`, an early-return guard was added to `ShouldInterceptTouch`:
```csharp
if (diffX == 0 && diffY == 0)
return _isOpen;
When the touch delta is zero (a stationary tap rather than a swipe), the method now immediately returns _isOpen:
- SwipeView is open → intercept the tap (
true) so the SwipeView closes without the tap reaching child views - SwipeView is closed → don't intercept (
false) so the tap passes through to child views normally
Two UI tests were added to cover both scenarios:
SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap— verifies tapping an open SwipeView does not activate the childButtonSwipeViewTappedWhenClosed_PropagatesTap— verifies tapping a closed SwipeView does activate the childButton
Issues Fixed
Fixes #23921
Platforms Affected
- Android (fix applies only to
MauiSwipeView.cs) - iOS (not affected)
- Windows (not affected)
- Mac Catalyst (not affected)
Code Review: ✅ Passed
Code Review — PR #24275
Code Changes Reviewed
| File | Change |
|---|---|
src/Core/src/Platform/Android/MauiSwipeView.cs |
+3 lines in ShouldInterceptTouch |
src/Controls/tests/TestCases.HostApp/Issues/Issue23921.xaml |
New test page (XAML) |
src/Controls/tests/TestCases.HostApp/Issues/Issue23921.xaml.cs |
New test page code-behind |
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23921.cs |
New UI tests |
🟢 Critical Issues
None.
🟡 Suggestions
1. Test Assertion Style — Intermediate Variable is Unnecessary
File: src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23921.cs
Current code:
var buttonWasClicked = button.GetText() == "tapped";
Assert.That(buttonWasClicked, Is.False);and
var buttonWasClicked = button.GetText() == "tapped";
Assert.That(buttonWasClicked, Is.True);Suggestion: Assert directly on the value for a cleaner test and better failure messages:
Assert.That(button.GetText(), Is.Not.EqualTo("tapped"));and
Assert.That(button.GetText(), Is.EqualTo("tapped"));This is a minor style issue — functional correctness is unaffected.
2. Test Uses App.Click Rather Than App.Tap
File: src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23921.cs
App.Click("swipeOne") is used to tap the SwipeView. Confirm that Click is the appropriate Appium action here (vs Tap). In most MAUI UI test patterns, App.Tap("elementId") is the idiomatic method. This may work correctly in practice, but verify against similar SwipeView tests in the codebase to ensure consistent usage.
3. button_Clicked Handler Uses Potentially Unsafe Cast
File: src/Controls/tests/TestCases.HostApp/Issues/Issue23921.xaml.cs
Current code:
private void button_Clicked(object sender, EventArgs e)
{
var button = sender as Button;
button.Text = "tapped";
}If sender is unexpectedly not a Button (e.g., future refactoring), this will throw a NullReferenceException rather than giving a clear cast failure. For test/sample code this is low risk, but a safer pattern would be:
private void button_Clicked(object sender, EventArgs e)
{
if (sender is Button button)
button.Text = "tapped";
}✅ Looks Good
- Fix logic is correct and minimal. The 3-line change correctly handles the zero-delta tap case by short-circuiting with
_isOpen, cleanly separating tap-interception from swipe-interception logic. - No regression risk for swipe behavior. The early-return only triggers when
diffX == 0 && diffY == 0— an actual swipe always produces a non-zero delta and is unaffected. - Tests cover both code paths. One test for open SwipeView (should not propagate), one for closed SwipeView (should propagate).
- Android-only change. The fix is scoped to
MauiSwipeView.cs(Android platform), so iOS/Windows/Mac are unaffected. [Issue]attribute is correct.PlatformAffected.Androidmatches the platform scope.
an open swipeview will close on tap, so intercept the touch if the swipeview is currently open
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
SwipeView automation does not work correctly on Windows platform. This is consistent with other SwipeView tests (Issue11333, Issue29086, Issue17204) that use the same TEST_FAILS_ON_WINDOWS guard. See: dotnet#14777 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
- Make test Android-only since the fix is in MauiSwipeView.cs (Android) and the bug doesn't exist on iOS/Catalyst. Uses compound guard: TEST_FAILS_ON_IOS && TEST_FAILS_ON_CATALYST && TEST_FAILS_ON_WINDOWS - Convert HostApp page from XAML to C#-only (per test guidelines) - Use SwipeItemView with AutomationId so test can verify the SwipeView actually opened before clicking (prevents false failures) - Re-query element for text assertion instead of using stale reference Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
🚦 Gate - Test Before and After Fix📊 Expand Full Gate —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue23921 Issue23921 |
✅ FAIL — 1674s | ✅ PASS — 513s |
🔴 Without fix — 🖥️ Issue23921: FAIL ✅ · 1674s
(truncated to last 15,000 chars)
y.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
Build FAILED.
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: Mono.AndroidTools.InstallFailedException: Unexpected install output: cmd: Failure calling service package: Broken pipe (32) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass105_0.<InstallPackage>b__0(Task`1 t) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
0 Warning(s)
1 Error(s)
Time Elapsed 00:16:31.24
* daemon not running; starting now at tcp:5037
* daemon started successfully
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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
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.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:08:22.81
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/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 1.22 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 15 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 4.18 sec).
Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 5.71 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 2 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 2 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 376 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 1.66 sec).
5 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
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.10] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.37] 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 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/03/2026 14:49:33 FixtureSetup for Issue23921(Android)
>>>>> 04/03/2026 14:49:35 SwipeViewTappedWhenClosed_PropagatesTap Start
>>>>> 04/03/2026 14:49:38 SwipeViewTappedWhenClosed_PropagatesTap Stop
Passed SwipeViewTappedWhenClosed_PropagatesTap [3 s]
>>>>> 04/03/2026 14:49:38 SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap Start
>>>>> 04/03/2026 14:49:40 SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap Stop
>>>>> 04/03/2026 14:49:40 Log types: logcat, bugreport, server
Failed SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap [2 s]
Error Message:
Assert.That(App.FindElement("buttonOne").GetText(), Is.Not.EqualTo("tapped"))
Expected: not equal to "tapped"
But was: "tapped"
Stack Trace:
at Microsoft.Maui.TestCases.Tests.Issues.Issue23921.SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23921.cs:line 27
1) at Microsoft.Maui.TestCases.Tests.Issues.Issue23921.SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue23921.cs:line 27
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Failed.
Total tests: 2
Passed: 1
Failed: 1
Total time: 27.3571 Seconds
🟢 With fix — 🖥️ Issue23921: PASS ✅ · 513s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.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.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
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.60-ci+azdo.13736358
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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
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
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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:38.29
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.60-ci+azdo.13736358
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.60-ci+azdo.13736358
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736358
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.60-ci+azdo.13736358
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.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.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.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.31] 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 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/03/2026 14:58:08 FixtureSetup for Issue23921(Android)
>>>>> 04/03/2026 14:58:11 SwipeViewTappedWhenClosed_PropagatesTap Start
>>>>> 04/03/2026 14:58:14 SwipeViewTappedWhenClosed_PropagatesTap Stop
Passed SwipeViewTappedWhenClosed_PropagatesTap [2 s]
>>>>> 04/03/2026 14:58:14 SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap Start
>>>>> 04/03/2026 14:58:15 SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap Stop
Passed SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap [1 s]
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Successful.
Total tests: 2
Passed: 2
Total time: 18.9423 Seconds
📁 Fix files reverted (2 files)
eng/pipelines/ci-copilot.ymlsrc/Core/src/Platform/Android/MauiSwipeView.cs
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #24275 | Early return _isOpen when diffX==0 && diffY==0 in ShouldInterceptTouch |
✅ PASSED (Gate) | MauiSwipeView.cs (+3) |
Original PR fix |
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (claude-opus-4.6) | Convert ACTION_UP → ACTION_CANCEL in DispatchTouchEvent when open + pure tap |
✅ PASS | MauiSwipeView.cs (+15) |
Operates at DispatchTouchEvent level |
| 2 | try-fix (claude-sonnet-4.6) | Intercept at ACTION_DOWN in OnInterceptTouchEvent when _isOpen && TouchInsideContent |
✅ PASS | MauiSwipeView.cs (+10) |
Most upstream interception point |
| 3 | try-fix (gpt-5.3-codex) | Stateful close-tap tracking with _isCloseTapPending/_closeTapMoved flags in DispatchTouchEvent, swallow ACTION_UP |
✅ PASS | MauiSwipeView.cs (+37) |
Explicit per-sequence state tracking |
| 4 | try-fix (gpt-5.4) | Dispatch synthetic ACTION_CANCEL to content subtree from ResetSwipe() before resetting |
✅ PASS | MauiSwipeView.cs (+~10) |
Cancels child touch state at reset point |
| PR | PR #24275 | Early return _isOpen when diffX==0 && diffY==0 in ShouldInterceptTouch |
✅ PASSED (Gate) | MauiSwipeView.cs (+3) |
Original PR |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | No | NO NEW IDEAS |
Exhausted: Yes
Selected Fix: PR's fix — ShouldInterceptTouch() early return (+3 lines). Simplest possible fix that directly addresses the root cause at the exact decision point. All alternatives achieve the same outcome with significantly more code and complexity.
📋 Report — Final Recommendation
✅ Final Recommendation: APPROVE
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | Issue #23921 / Android SwipeView tap propagation |
| Gate | ✅ PASSED | android — 2/2 tests pass |
| Try-Fix | ✅ COMPLETE | 4 attempts, 4 passing; PR's fix selected |
| Report | ✅ COMPLETE |
Summary
PR #24275 fixes a bug where tapping to close an open Android SwipeView inadvertently activates child views (Buttons, TapGestureRecognizers). The fix is 3 lines added to ShouldInterceptTouch() in MauiSwipeView.cs. Four independent alternative approaches were explored and all passed, but the PR's fix is the most minimal and precisely targeted.
Root Cause
In MauiSwipeView.ShouldInterceptTouch(), when the user performs a pure tap (no movement), diffX == 0 and diffY == 0. The existing code falls into the else branch of the direction computation, yielding SwipeDirection.Up. If no UpItems are configured (typical case), GetSwipeItemsByDirection returns null/empty and the method returns false — not intercepting the touch. The tap then propagates to child views and triggers their click/gesture handlers.
Fix Quality
The fix is clean, minimal, and correctly placed:
if (diffX == 0 && diffY == 0) return _isOpen;— 3 lines, no new fields or state- Placed at the top of the movement-direction logic, exactly where the incorrect path begins
- When open: returns
true(intercept), preventing child activation - When closed: returns
false(pass-through), preserving normal tap behavior - Integer-like semantics for the
== 0comparison are valid here: both values derive from the same touch position with no movement, so exact equality holds
Comparison with alternatives explored:
| Approach | Lines | Assessment |
|---|---|---|
PR fix (ShouldInterceptTouch early return) |
+3 | ✅ Minimal, surgical, correct location |
Attempt 1 (ACTION_UP→CANCEL in DispatchTouchEvent) |
+15 | More complex; operates after child already received DOWN |
Attempt 2 (Intercept on ACTION_DOWN in OnInterceptTouchEvent) |
+10 | Aggressive; may interfere with complex nested SwipeView layouts |
Attempt 3 (Stateful flags in DispatchTouchEvent) |
+37 | Significantly over-engineered for this fix |
Attempt 4 (Synthetic CANCEL in ResetSwipe) |
+~10 | Indirect; dispatches synthetic events which are harder to reason about |
Test coverage is appropriate:
- Two tests using separate
SwipeViewinstances to avoid state interference SwipeViewTappedWhenOpen_ClosesAndDoesNotPropagateTap: verifies the fixSwipeViewTappedWhenClosed_PropagatesTap: verifies normal behavior is preserved- Android-only via
#if TEST_FAILS_ON_IOS && TEST_FAILS_ON_CATALYST && TEST_FAILS_ON_WINDOWS— correct per comment noting fix is Android-only
Minor note (non-blocking): The #if guard compiles the test class body only on Android, but the class declaration is outside the #if. This is the standard pattern used in this codebase and is intentional.
Selected Fix: PR's fix — simplest solution, direct root cause fix, +3 lines only.
…opagated to children (#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes #23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…opagated to children (dotnet#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes dotnet#23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…opagated to children (#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes #23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
<!-- 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: - [SwipeViewShouldNotClose]UI test (Issue29086) fails with [System.TimeoutException: Timed out waiting for no element] on Android after PR #24275 was merged. ### Root Cause: - PR #24275 added a check in [MauiSwipeView.ShouldInterceptTouch()](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html) to prevent taps on an open SwipeView from propagating to content children: - When [_isOpen] is true, [OnInterceptTouchEvent]returns true, which causes Android to steal all touch events from children — including buttons inside SwipeItemView controls. This breaks the Issue29086 scenario where buttons inside revealed swipe items (e.g., AddButton1) need to receive taps to fire their [Command]and update the AutomationId. ### Description of Change Touch event handling improvement: * Updated `ShouldInterceptTouch(MotionEvent? e)` in `MauiSwipeView.cs` to only intercept touches when the swipe view is open and the touch is within the content area, enhancing gesture accuracy. ### 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. --> - Regression introduced by PR #24275 - Resolved test case: SwipeViewShouldNotClose | Before | After | |----------|----------| | <img src="https://github.com/user-attachments/assets/4d3f99b6-00f7-4114-be7f-92a4821a9078"> | <img src="https://github.com/user-attachments/assets/8bbdc3d2-bf70-4a6f-9652-fea8601d06ab"> | <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. -->
…opagated to children (dotnet#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes dotnet#23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…opagated to children (#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes #23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
<!-- 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: - [SwipeViewShouldNotClose]UI test (Issue29086) fails with [System.TimeoutException: Timed out waiting for no element] on Android after PR #24275 was merged. ### Root Cause: - PR #24275 added a check in [MauiSwipeView.ShouldInterceptTouch()](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html) to prevent taps on an open SwipeView from propagating to content children: - When [_isOpen] is true, [OnInterceptTouchEvent]returns true, which causes Android to steal all touch events from children — including buttons inside SwipeItemView controls. This breaks the Issue29086 scenario where buttons inside revealed swipe items (e.g., AddButton1) need to receive taps to fire their [Command]and update the AutomationId. ### Description of Change Touch event handling improvement: * Updated `ShouldInterceptTouch(MotionEvent? e)` in `MauiSwipeView.cs` to only intercept touches when the swipe view is open and the touch is within the content area, enhancing gesture accuracy. ### 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. --> - Regression introduced by PR #24275 - Resolved test case: SwipeViewShouldNotClose | Before | After | |----------|----------| | <img src="https://github.com/user-attachments/assets/4d3f99b6-00f7-4114-be7f-92a4821a9078"> | <img src="https://github.com/user-attachments/assets/8bbdc3d2-bf70-4a6f-9652-fea8601d06ab"> | <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. -->
…opagated to children (#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes #23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…opagated to children (#24275) ### Description of Change An open ```SwipeView``` will close on tap, so a tap on an open ```SwipeView``` should be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result in ```Button```s, ```TapGestureRecognisers``` etc within ```SwipeView.Content``` being activated. ### Issues Fixed Fixes #23921 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Blazor - Fix: Filter precompressed RCL assets from MAUI Blazor Hybrid APKs by @mattleibow in #33917 <details> <summary>🔧 Fixes</summary> - [.NET MAUI Blazor Hybrid App should not precompress assets](#33773) </details> - [Windows] Fix for Runtime error when closing external window with WPF Webview Control by @BagavathiPerumal in #34006 <details> <summary>🔧 Fixes</summary> - [Runtime error when closing external window with WPF Webview Control](#32944) </details> ## Button - [Android] ImageButton CornerRadius not being applied - fix by @kubaflo in #30074 <details> <summary>🔧 Fixes</summary> - [ImageButton CornerRadius not being applied on Android](#23854) </details> - Fix Disabled visual state ignored when Button has locally-set BackgroundColor/TextColor by @Dhivya-SF4094 in #34444 <details> <summary>🔧 Fixes</summary> - [[regression/9.0] VisualState "Disabled" is not properly applied for Button with custom appearance](#34363) </details> ## CollectionView - Fix CollectionView grid spacing updates for first row and column by @KarthikRajaKalaimani in #34527 <details> <summary>🔧 Fixes</summary> - [[MAUI] I2_Vertical grid for horizontal Item Spacing and Vertical Item Spacing - horizontally updating the spacing only applies to the second column](#34257) </details> - Fix CollectionView record struct selection on Windows by @jeremy-visionaid in #33488 - [Android] Ensure disconnected ItemsViewHandler doesn't hold onto the items source by @filipnavara in #24610 <details> <summary>🔧 Fixes</summary> - [Crash on NullReferenceException with measurement cells in CollectionView](#24304) </details> - [Windows] Fixed VisualState Setters not working properly for CollectionView by @Dhivya-SF4094 in #27230 <details> <summary>🔧 Fixes</summary> - [VisualState Setters not working properly on Windows for a CollectionView](#27086) - [[regression/8.0.3] [Windows][CollectionView]Label Disappear when set Style in ContentPage.Resources](#19209) - [[Windows] Label style defined as ContentPage Resource doesn't propagate to CollectionView](#18701) </details> - [Windows] Fixed Margin doesn't work inside CollectionView EmptyView by @Dhivya-SF4094 in #29897 <details> <summary>🔧 Fixes</summary> - [Margin doesn't work inside CollectionView EmptyView](#8494) </details> - [Android, Windows] Fix CarouselView PreviousPosition/PreviousItem incorrect during animated ScrollTo() by @praveenkumarkarunanithi in #34570 <details> <summary>🔧 Fixes</summary> - [[Android] CurrentItemChangedEventArgs.PreviousItem and PositionChangedEventArgs.PreviousPosition Not Updating Correctly When Using ScrollTo or Setting Position](#29544) </details> - [iOS] CarouselView2: Update internal scroll indicators for compositional layout by @SubhikshaSf4851 in #33639 <details> <summary>🔧 Fixes</summary> - [[iOS] Horizontal Scroll Bar Not Visible on CarouselView (CV2)](#29390) </details> - [CarouselViewHandler2] Fir fox CurrentItem does not work when ItemSpacing is set by @SyedAbdulAzeemSF4852 in #32135 <details> <summary>🔧 Fixes</summary> - [[CarouselViewHandler2] CurrentItem does not work when ItemSpacing is set](#32048) </details> - [iOS] Fix for Incorrect Scroll in Loop Mode When CurrentItem Is Not Found in ItemsSource by @SyedAbdulAzeemSF4852 in #32141 <details> <summary>🔧 Fixes</summary> - [[Android & iOS] Setting an invalid CurrentItem causes scroll to last item in looped CarouselView](#32139) </details> - [Android] IndicatorView: Add TalkBack accessibility descriptions for indicators by @praveenkumarkarunanithi in #31775 <details> <summary>🔧 Fixes</summary> - [[Android] IndicatorView does not convey correct accessibility information](#31446) </details> - [iOS, macOS] Fixed CollectionView KeepLastItemInView Not Updating Correctly When Items Are Added Dynamically by @NanthiniMahalingam in #32191 <details> <summary>🔧 Fixes</summary> - [[.NET10] I9 - Scroll_Position - "KeepLastItemInView" does not keep the last item at the end of the displayed list when adding new items.](#31825) </details> - [Windows, Android] Resolved issue with dynamic Header/Footer reassignment in CollectionView. by @prakashKannanSf3972 in #28403 <details> <summary>🔧 Fixes</summary> - [[Windows, Android] Toggling Header/Footer in CollectionView Dynamically is not working](#27959) - [CollectionView HeaderTemplate and FooterTemplate are not displayed when ItemsSource is initially set to null](#28337) - [[Android] Header and Footer Not Visible in CollectionView When EmptyView is Selected First](#28351) </details> - [Android] Fix CollectionView inside disabled RefreshView blocks scroll by @Vignesh-SF3580 in #34702 <details> <summary>🔧 Fixes</summary> - [C6-The C6 page cannot scroll on Windows and Android platforms.](#34666) </details> - [Android] CollectionView: Fix SelectedItem visual state not applying when re-selecting same item by @KarthikRajaKalaimani in #31591 <details> <summary>🔧 Fixes</summary> - [CollectionView - SelectedItem visual state manager not working](#20062) </details> - [Windows] Fixed CollectionView.EmptyView can not be removed by setting it to Null by @Dhivya-SF4094 in #29487 <details> <summary>🔧 Fixes</summary> - [[Windows] CollectionView.EmptyView can not be removed by setting it to Null](#18657) - [[Windows] EmptyViewTemplate Not Working in CarouselView](#29463) - [EmptyViewTemplate does not do anything](#18551) - [[MAUI] I5_EmptyView - The data template selector cannot display the correct string.](#23330) </details> - [iOS] Support for IsSwipeEnabled on CarouselView2 by @kubaflo in #29996 <details> <summary>🔧 Fixes</summary> - [[iOS] IsSwipeEnabled Not Working on CarouselView (CV2)](#29391) </details> - [iOS, MacOS] Fixed FlowDirection not working on Header/Footer in CollectionView by @Dhivya-SF4094 in #32775 <details> <summary>🔧 Fixes</summary> - [[iOS, MacOS] FlowDirection not working on Header/Footer in CollectionView](#32771) </details> - [iOS] CollectionView: Fix drag-and-drop reordering into empty groups by @SuthiYuvaraj in #34151 <details> <summary>🔧 Fixes</summary> - [CollectionView Drag and Drop Reordering Can't Drop in Empty Group](#12008) </details> - [Android] CollectionView: Fix drag-and-drop reordering into empty groups by @SuthiYuvaraj in #31867 <details> <summary>🔧 Fixes</summary> - [CollectionView Drag and Drop Reordering Can't Drop in Empty Group](#12008) </details> - [iOS] Fix vertical CarouselView MandatorySingle snapping on iOS by @Vignesh-SF3580 in #34700 <details> <summary>🔧 Fixes</summary> - [CarouselView vertical snap points ignored on iOS with Microsoft.Maui.Controls v10.0.20 (regression from v9.0.120)](#33308) </details> - [iOS26] Fix CarouselView scrolling to wrong item when navigating to last item by @Vignesh-SF3580 in #34013 <details> <summary>🔧 Fixes</summary> - [[iOS 26] CarouselView does not scroll to the correct last item](#33770) </details> - Fixed the OnPlatform does not work for header property in Collection view by @NanthiniMahalingam in #28935 <details> <summary>🔧 Fixes</summary> - [OnPlatform does not work in Header of CollectionView](#25124) </details> - [Android] [Candidate branch] Fix VerifySelectedItemClearsOnNullAssignment, CollectionViewSelectionShouldClear, SelectedItemVisualIsCleared UI test failure on Android by @KarthikRajaKalaimani in #34928 ## DateTimePicker - [iOS] Fix for DatePicker FlowDirection Not Working on iOS by @SyedAbdulAzeemSF4852 in #30193 <details> <summary>🔧 Fixes</summary> - [[iOS] DatePicker FlowDirection Not Working on iOS](#30065) </details> ## Drawing - [Shapes] Line: Fix asymmetric Stretch.None path translation when right/bottom edge overflows by @NirmalKumarYuvaraj in #34385 <details> <summary>🔧 Fixes</summary> - [Line coordinates not computed correctly](#11404) - [Lines not drawing correctly](#26961) </details> - [Android] Fixed GraphicsView drawable is visible outside the canvas by @NirmalKumarYuvaraj in #28353 <details> <summary>🔧 Fixes</summary> - [[Android] GraphicsView, The drawn image can also be visible outside the canvas](#20834) </details> - Fixed Custom Drawable does not support binding by @NirmalKumarYuvaraj in #29442 <details> <summary>🔧 Fixes</summary> - [Custom IDrawable control does not databind to a model property when used inside a CollectionView ItemTemplate](#20991) </details> - Added a support for GradientBrushes on Shape.Stroke by @kubaflo in #22208 <details> <summary>🔧 Fixes</summary> - [GradientBrushes are not supported on Shape.Stroke](#21983) </details> ## Editor - Fixed Editor HorizontalTextAlignment does not update at run time by @NirmalKumarYuvaraj in #25129 <details> <summary>🔧 Fixes</summary> - [Editor HorizontalTextAlignment Does not Works.](#10987) - [[iOS/MacOs] Right-To-Left (RTL) alignment is not applied to Editor placeholder](#30052) </details> - [Windows] Fixed Entry Editor placeholder Text CharacterSpacing by @SubhikshaSf4851 in #30324 <details> <summary>🔧 Fixes</summary> - [[Windows] CharacterSpacing not applied to Placeholder text in Entry and Editor controls](#30071) </details> ## Entry - [Windows] Fix fo setting an Entry's Keyboard to Date causes it to be interpreted as a password input by @SyedAbdulAzeemSF4852 in #29344 <details> <summary>🔧 Fixes</summary> - [[Windows] Entry Keyboad-Type "Date" results in Password-Entry](#28975) </details> - [Android] Exception thrown when give more than 5000 characters to the Text property of Entry. by @KarthikRajaKalaimani in #30242 <details> <summary>🔧 Fixes</summary> - [Android crash when Entry has >5000 characters](#30144) </details> ## Essentials - Bump MonoApiToolsMSBuildTasksPackageVersion to 0.5.0 and ship Essentials.AI public APIs by @mattleibow via @Copilot in #34574 - [Mac] DeviceDisplay.KeepScreenOn not being respected on Mac OS by @HarishwaranVijayakumar in #32708 <details> <summary>🔧 Fixes</summary> - [[Mac Catalyst] DeviceDisplay.KeepScreenOn not being respected on Mac OS](#26059) </details> ## Flyoutpage - [Windows] FlyoutPage: update CollapseStyle at runtime by @devanathan-vaithiyanathan in #29927 <details> <summary>🔧 Fixes</summary> - [Flyout Page SetCollapseStyle doesn't have any change](#18200) </details> ## Gestures - [Android] Fix for TapGestureRecognizer doesn't fire by @HarishwaranVijayakumar in #34497 <details> <summary>🔧 Fixes</summary> - [[Android] TapGestureRecognizer doesn't fire](#5825) </details> ## Image - [Android] Fix Share.RequestAsync SecurityException on Android 10+ caused by missing ClipData by @HarishwaranVijayakumar in #34417 <details> <summary>🔧 Fixes</summary> - [[Bug] Share.RequestAsync throws java.lang.SecurityException (uid=1000) on Android 10+ due to missing intent.ClipData](#34370) </details> - [Windows]Fixed the MauiImage with logical name containing path issue by @sheiksyedm in #32864 <details> <summary>🔧 Fixes</summary> - [MauiImage with LogicalName containing path - is not working on Windows](#32356) </details> - [Android, Windows & iOS] Fix Downsize/ScaleImage to maintain aspect ratio and prevent upscaling by @SyedAbdulAzeemSF4852 in #30808 <details> <summary>🔧 Fixes</summary> - [[Android & Windows] In GraphicsView, the aspect ratio is not maintained when Downsize is called with both maxWidth and maxHeight](#30803) </details> ## Label - [iOS , macOS] Fixed Label text cropping when a width request is specified on the label inside a VerticalStackLayout with specified width request by @NanthiniMahalingam in #29166 <details> <summary>🔧 Fixes</summary> - [Label text gets cropped when a width request is specified on the label inside a VerticalStackLayout](#28660) - [[iOS] Label with a fixed WidthRequest has wrong height](#26644) </details> - [Android] Fix Label word wrapping clips text depending on alignment and layout options by @Dhivya-SF4094 in #34533 <details> <summary>🔧 Fixes</summary> - [Bug: Android Label word wrapping clips text depending on alignment and layout options](#34459) </details> - LineHeight and decorations for HTML Label - fix by @kubaflo in #31202 <details> <summary>🔧 Fixes</summary> - [LineHeight with HTML Label not working](#22193) - [lineheight is broken ](#22197) </details> - [iOS] Fix Label with TailTruncation not rendering after empty-to-non-empty text transition by @kubaflo in #34812 <details> <summary>🔧 Fixes</summary> - [Label with LineBreakMode="TailTruncation" does not render text if initial Text is null or empty on first render (iOS)](#34591) </details> ## Layout - [Android] Fix overflowing children clipped when parent Opacity < 1 by @SyedAbdulAzeemSF4852 in #34565 <details> <summary>🔧 Fixes</summary> - [Maui Android parent view inappropriately creates clipping mask when its opacity is less than 1, cropping out children](#22038) </details> - Fixed the FlexLayout reverse issue with the AlignContent by @Ahamed-Ali in #32134 <details> <summary>🔧 Fixes</summary> - [FlexLayout alignment issue when Wrap is set to Reverse and AlignContent is set to SpaceAround, SpaceBetween or SpaceEvenly](#31565) </details> - [iOS/Mac] Fixed BoxView in AbsoluteLayout did not return to its default AutoSize for Height and Width after reset by @Dhivya-SF4094 in #31648 <details> <summary>🔧 Fixes</summary> - [[iOS, Catalyst] BoxView in AbsoluteLayout does not return to default AutoSize for Height/Width after reset](#31496) </details> ## Map - [Windows] Implement WinUI 3 MapControl handler using Azure Maps by @jfversluis in #34138 ## Modal - [Android] PopToRootAsync for modal pages - improvements by @kubaflo in #26851 <details> <summary>🔧 Fixes</summary> - [Shell PopToRootAsync doesn't happen instantly - previous pages flash quickly. Only happens in NET 9](#26846) </details> - [Android] Fix HideSoftInputOnTapped doesn't work on Modal Pages by @HarishwaranVijayakumar in #34770 <details> <summary>🔧 Fixes</summary> - [HideSoftInputOnTapped doesn't work on Modal Pages](#34730) </details> ## Navigation - [iOS] Alert popup may be displayed on wrong window when modal page navigation is in progress - fix by @kubaflo in #31016 <details> <summary>🔧 Fixes</summary> - [Alert popup may be displayed on wrong window when modal page navigation is in progress on iOS/MacOS](#30970) </details> - [Android] Page: Fix OnNavigatedTo called twice when NavigationPage is FlyoutPage Detail by @KarthikRajaKalaimani in #31931 <details> <summary>🔧 Fixes</summary> - [NavigationPage and FlyoutPage both call OnNavigatedTo, so it is called twice](#23902) </details> ## Picker - Fixed the Picker didn't dismiss it when tapping outside on iOS and MacCatalyst platform. by @KarthikRajaKalaimani in #30067 <details> <summary>🔧 Fixes</summary> - [[regression/8.0.3] iOS Picker dismiss does not work when clicking outside of the Picker](#19168) </details> - [Windows] Fixed Picker items width wont resize back by @SubhikshaSf4851 in #33042 <details> <summary>🔧 Fixes</summary> - [Picker items width won't resize back when its container window gets resized down.](#32984) </details> ## RadioButton - Fix TalkBack not correctly narrating RadioButtons with Content by @SubhikshaSf4851 in #34521 <details> <summary>🔧 Fixes</summary> - [[Android] TalkBack does not correctly narrate RadioButtons with Content](#34322) </details> ## SafeArea - [Android] Fix SafeAreaShouldWorkOnAllShellTabs test failure on API 36 by @praveenkumarkarunanithi in #34239 ## ScrollView - [iOS] Preserve ScrollView offsets when Orientation changes to Neither by @Vignesh-SF3580 in #34672 <details> <summary>🔧 Fixes</summary> - [Incorrect implementation of ScrollView.Orientation](#34583) </details> ## Searchbar - [Android] Fix SearchBar text bleeding between instances after navigation by @SyedAbdulAzeemSF4852 in #34703 <details> <summary>🔧 Fixes</summary> - [MAUI Android: SearchBar copies content from one to the other](#20348) </details> - Fixed SearchBar CursorPosition and SelectionLength not updating when typing by @Dhivya-SF4094 in #34347 <details> <summary>🔧 Fixes</summary> - [SearchBar - CursorPosition and SelectionLength are not updated when the user types](#30779) </details> ## SearchBar - [Windows] Fixed SearchHandler issues by @Tamilarasan-Paranthaman in #29520 <details> <summary>🔧 Fixes</summary> - [[Windows] SearchHandler APIs are not functioning properly](#29493) </details> ## Shell - [iOS, Mac] Fix for Background set to Transparent doesn't have the same behavior as BackgroundColor Transparent by @HarishwaranVijayakumar in #32245 <details> <summary>🔧 Fixes</summary> - [Background set to Transparent doesn't have the same behavior as BackgroundColor = Transparent](#22769) </details> - [iOS] Fix App crash with NullReferenceException in ShellSectionRenderer by @devanathan-vaithiyanathan in #32109 <details> <summary>🔧 Fixes</summary> - [[iOS] App crash with NullReferenceException in ShellSectionRenderer](#31961) </details> - [Android] Fixed back button icon selection logic in ShellToolbarTracker by @kubaflo in #32080 <details> <summary>🔧 Fixes</summary> - [IconOverride in Shell.BackButtonBehavior does not work.](#32050) </details> - Fix TabBarIsVisible Not Updating Dynamically When Set on ShellContent by @Vignesh-SF3580 in #33090 <details> <summary>🔧 Fixes</summary> - [Shell.TabBarIsVisible is not updated dynamically at runtime](#32994) </details> - [iOS, macOS] Shell: Fix RTL flow direction for flyout, menu cells, tab bar, and Locked flyout position by @NanthiniMahalingam in #32701 <details> <summary>🔧 Fixes</summary> - [[iOS, Mac Catalyst] Shell Flyout and Content Do Not Fully Support RightToLeft (RTL)](#32419) </details> - [IOS] Inconsistent Resize Behavior for Header/Footer - fix by @kubaflo in #28713 <details> <summary>🔧 Fixes</summary> - [[IOS, Mac] Inconsistent Resize Behavior for Header/Footer](#26397) - [Enable Shell Flyout Header/Footer resize tests on iOS/Catalyst](#33501) </details> - [Android] Fix for SearchHandler retaining previous page SearchView data in pages within Shell sections by @BagavathiPerumal in #29545 <details> <summary>🔧 Fixes</summary> - [[Shell][Android] The truth is out there...but not on top tab search handlers](#8716) </details> - [Android] Fix empty space above TabBar after navigating back when TabBar visibility is toggled by @praveenkumarkarunanithi in #34324 <details> <summary>🔧 Fixes</summary> - [Empty space appears above TabBar after navigating back when TabBar visibility is toggled](#33703) - [Grid with SafeAreaEdges=Container has incorrect size when tab bar appears](#34256) </details> ## SwipeView - [Android] SwipeView: Use MeasureSpecMode.Exactly for SwipeItem layout to fix text visibility by @Ahamed-Ali in #27399 <details> <summary>🔧 Fixes</summary> - [[Android] Right SwipeView items are not visible in the SwipeView.](#27367) </details> - [Android] Prevent the tap that closes an open SwipeView from being propagated to children by @sjordanGSS in #24275 <details> <summary>🔧 Fixes</summary> - [Tapping to close a SwipeView will activate TapGestureRecognizers on .Content](#23921) </details> ## Switch - [iOS & Mac] Fix for SearchHandler retains previous page state when switching top tabs by @BagavathiPerumal in #34735 <details> <summary>🔧 Fixes</summary> - [[Shell] [iOS & Mac] SearchHandler retains previous page state when switching top tabs](#34693) </details> ## TabbedPage - [Android] Fixed NullReferenceException in app with TabBar after returning from minimized state by @NirmalKumarYuvaraj in #34779 <details> <summary>🔧 Fixes</summary> - [NullReferenceException in app with TabBar after returning from minimized state](#34720) </details> ## Titlebar - Fixed BindingContext of the Window TitleBar is not being passed on to its child content. by @NirmalKumarYuvaraj in #30080 <details> <summary>🔧 Fixes</summary> - [The BindingContext of the Window TitleBar is not being passed on to its child content.](#24831) </details> - [Windows/Mac] Fix RTL FlowDirection causes overlap with native window control buttons in TitleBar by @devanathan-vaithiyanathan in #30400 <details> <summary>🔧 Fixes</summary> - [[Windows, Mac] RTL FlowDirection causes overlap with native window control buttons in TitleBar](#30399) </details> ## WebView - [Windows] Fix WebView background color not being applied by @SubhikshaSf4851 in #34599 <details> <summary>🔧 Fixes</summary> - [WebView background color has changed after update, can't override.](#34518) </details> - [Android] Fix for WebView/HybridWebView briefly flashes full screen before layout completes by @praveenkumarkarunanithi in #33207 <details> <summary>🔧 Fixes</summary> - [[Android] HybridWebView briefly resizes to full screen when page is opened before snapping back to correct size](#31475) </details> ## Xaml - Improved style inheritance by @kubaflo in #31317 <details> <summary>🔧 Fixes</summary> - [Styles based on a style that is based on another style that uses AppThemeBinding do not inherit properties correctly.](#31280) </details> - Fix for VisualStateManager Setter.TargetName failing when ControlTemplate is applied by @BagavathiPerumal in #33208 <details> <summary>🔧 Fixes</summary> - [Setter.TargetName + ControlTemplate crash](#26977) </details> <details> <summary>🧪 Testing (4)</summary> - [Testing] Additional Feature Matrix Event Test Cases for Slider and ScrollView by @nivetha-nagalingam in #34352 - [Testing] Fixed Build error on inflight/ candidate PR 34885 by @NafeelaNazhir in #34891 - [Testing] Fixed UI test image failure in PR 34885 - [13/4/2026] by @NafeelaNazhir in #34933 - Fixed test failure - CursorPositionUpdatesWhenSearchBarGainsFocus by @Dhivya-SF4094 in #34938 </details> <details> <summary>📦 Other (3)</summary> - Fix Loaded event not called for MAUI View added to native View by @NirmalKumarYuvaraj in #34345 <details> <summary>🔧 Fixes</summary> - [Loaded event not called for MAUI View added to native View](#34310) </details> - Add public IAlertManager and IAlertManagerSubscription interfaces by @Redth in #34228 <details> <summary>🔧 Fixes</summary> - [Alert/Dialog system (`DisplayAlert`, `DisplayActionSheet`, `DisplayPromptAsync`) needs a public extensibility point](#34104) </details> - Fix crash when displaying alerts on unloaded pages by @kubaflo in #33288 </details> <details> <summary>📝 Issue References</summary> Fixes #5825, Fixes #8494, Fixes #8716, Fixes #10987, Fixes #11404, Fixes #12008, Fixes #18200, Fixes #18551, Fixes #18657, Fixes #18701, Fixes #19168, Fixes #19209, Fixes #20062, Fixes #20348, Fixes #20834, Fixes #20991, Fixes #21983, Fixes #22038, Fixes #22193, Fixes #22197, Fixes #22769, Fixes #23330, Fixes #23854, Fixes #23902, Fixes #23921, Fixes #24304, Fixes #24831, Fixes #25124, Fixes #26059, Fixes #26397, Fixes #26644, Fixes #26846, Fixes #26961, Fixes #26977, Fixes #27086, Fixes #27367, Fixes #27959, Fixes #28337, Fixes #28351, Fixes #28660, Fixes #28975, Fixes #29390, Fixes #29391, Fixes #29463, Fixes #29493, Fixes #29544, Fixes #30052, Fixes #30065, Fixes #30071, Fixes #30144, Fixes #30399, Fixes #30779, Fixes #30803, Fixes #30970, Fixes #31280, Fixes #31446, Fixes #31475, Fixes #31496, Fixes #31565, Fixes #31825, Fixes #31961, Fixes #32048, Fixes #32050, Fixes #32139, Fixes #32356, Fixes #32419, Fixes #32771, Fixes #32944, Fixes #32984, Fixes #32994, Fixes #33308, Fixes #33501, Fixes #33703, Fixes #33770, Fixes #33773, Fixes #34104, Fixes #34256, Fixes #34257, Fixes #34310, Fixes #34322, Fixes #34363, Fixes #34370, Fixes #34459, Fixes #34518, Fixes #34583, Fixes #34591, Fixes #34666, Fixes #34693, Fixes #34720, Fixes #34730 </details> **Full Changelog**: main...inflight/candidate
Description of Change
An open
SwipeViewwill close on tap, so a tap on an openSwipeViewshould be intercepted before it can be handled by child views. Otherwise tapping to close an open swipeview will result inButtons,TapGestureRecognisersetc withinSwipeView.Contentbeing activated.Issues Fixed
Fixes #23921