Skip to content

[Android] Don't throw when a PanUpdated handler removes the view as the pan starts - #39153

Merged
kubaflo merged 4 commits into
dotnet:inflight/currentfrom
MykhailoDav:fix-38065-android-pan-view-removed
Oct 6, 2026
Merged

kubaflo merged 4 commits into
dotnet:inflight/currentfrom
MykhailoDav:fix-38065-android-pan-view-removed

Conversation

@MykhailoDav

Copy link
Copy Markdown

Description of Change

On Android, removing a view from its parent in a PanUpdated handler when the pan starts throws:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Maui.Controls.Platform.InnerGestureListener.StartScrolling(MotionEvent e2) in InnerGestureListener.cs:line 255
   at Microsoft.Maui.Controls.Platform.InnerGestureListener.Android.Views.GestureDetector.IOnGestureListener.OnScroll(...)
   ...
   at Microsoft.Maui.Controls.Platform.TapAndPanGestureDetector.OnTouchEvent(MotionEvent ev)

The reporter found that their handler removes the dragged view. Removing or reparenting a view when a drag starts is still a valid thing to do, and the framework shouldn't throw a NullReferenceException from its own gesture listener when it happens.

Root cause

InnerGestureListener.StartScrolling raises PanUpdated (Started) through _scrollStartedDelegate and then calls _scrollDelegate. Removing the view from that handler changes its Window to null, and GestureManager.SetupGestureManager then disconnects the gestures synchronously:

GesturePlatformManager.Dispose → TapAndPanGestureDetector.Dispose → InnerGestureListener.Dispose, which sets _scrollDelegate, _swipeDelegate and the other delegates to null.

When the handler returns, StartScrolling calls the now-null _scrollDelegate.

Fix

Return from StartScrolling if the listener was disposed by the Started handler. The tap callbacks in the same class (OnSingleTapUp, OnSingleTapConfirmed, OnDoubleTap) already return early when _disposed.

Only this spot needs it:

  • When the view is removed during a Running update, PanGestureHandler.OnPan still returns true, so _swipeDelegate isn't reached.
  • EndScrolling already null-checks its delegates.

The issue says this worked in 10.0.90. I couldn't find a change in this code path between 10.0.90 and 10.0.100: GestureManager and TapAndPanGestureDetector are unchanged, and InnerGestureListener only changed HasAnyGestures.

Tests

New Android device test RemovingViewWhenPanStartsDoesNotThrow in GestureTests.Android.cs (category Gesture). It adds a BoxView with a PanGestureRecognizer whose PanUpdated handler removes the view on Started. It then dispatches a synthetic down / move / up sequence (the move is beyond the touch slop) to the view's platform view.

Android 37 emulator, Release:

Without fix With fix
New test Fails with the reported NullReferenceException at InnerGestureListener.StartScrolling ← OnScroll Passes
Category=Gesture 2 passed, 1 failed 3 passed

With the fix, SwipeView (20), Label (63, 1 ignored), CarouselView (10) and ScrollView (13) also pass. I didn't run the Appium UI tests locally.

Issues Fixed

Fixes #38065

🤖 Generated with Claude Code

kubaflo and others added 4 commits October 5, 2026 00:25
<!-- 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. !!!!!!!
-->

### Description of Change

<!-- Enter description of the fix in this section -->

Make the `Issue24284.FlyoutHeaderAdaptsToMinimumHeight` reference
visible while the fixture's flyout is initially open. On main,
`HeightReferenceLabel` is on Page 1 behind that flyout. Move the
existing unchanged `Label` (`HeightRequest="30"`,
`AutomationId="HeightReferenceLabel"`, `Text="Hello, World!"`) into
`Shell.FlyoutFooter`, leaving Page 1 empty.

Main already compares measured reference and header heights. Preserve
the exact strict contract `Math.Abs(headerLabel.Height -
heightReferenceLabel.Height) < 0.2`; this does not replace a hardcoded
30 comparison or loosen the tolerance. Add a positive-reference-height
assertion and measured-height failure diagnostics.

Only the fixture XAML and its test change. The constructor remains
untouched: `FlyoutIsPresented = true`, header text `Flyout Header`,
`MinimumHeightRequest = 30`, and `CollapseOnScroll` behavior are
preserved, as is all-platform scope. No product fixes, retries, timeout
changes, snapshots, flyout opening/closing workarounds, or shared
harness edits.

This is a clean main-based replacement for closed predecessor
[dotnet#39122](dotnet#39122), not a retarget or a
merge of candidate history. Its starting main SHA is
`32583cd272cf1ac485243fd13d322bb13f147914`.

**Static validation (all passed):**
- `dotnet format whitespace --folder --include
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue24284.cs` -
passed (exit 0).
- `dotnet format whitespace --folder --include
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue24284.cs
--verify-no-changes` - passed (exit 0).
- `xmllint --noout
src/Controls/tests/TestCases.HostApp/Issues/Issue24284.xaml` - passed
(exit 0); XML well-formedness only, not XAML compilation.
- `git diff --check` - passed (exit 0).

**Validation limitations:** No local native builds, XAML compilation,
UI/device tests, simulator/emulator or Appium execution were performed.
Actual main-based UI execution and native/XAML compilation remain
unverified pending CI.

**Historical candidate evidence only (not main validation):** On
predecessor dotnet#39122, [UI build
1622631](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1622631)
passed the Mac target on both original and subsequent executions (log
5497, lines 719/2422). The contemporaneous
[dotnet#39123](dotnet#39123) on the same
candidate base without this footer fix failed Mac both times ([UI build
1622632](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1622632),
log 5497, lines 720/2422). Fixed Windows, iOSlatest and AndroidMono
targets also passed there; AndroidCoreCLR and the full UI run were still
incomplete. This supports the fixture approach but does not establish
results for this main-based replacement.

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

Refs dotnet#24284 (fixture reliability only; no claim to fix or close the
original product issue). Replaces closed dotnet#39122.

<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
…otnet#39128)

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

### Description of Change

<!-- Enter description of the fix in this section -->

Add `App.WaitForElement("Options");` immediately before the first
`Options` tap in `VerifyEditorTextWhenAlignedVertically`, matching the
neighboring horizontal-alignment test. This synchronizes the initial
interaction with element availability using the existing timeout
defaults. All subsequent interactions, screenshot assertions, cropping
values, pre-existing whitespace, test order/category and helpers are
unchanged. No product changes.

This is a clean, main-based replacement for closed predecessor
[dotnet#39123](dotnet#39123), not a retarget or
transplant of its candidate branch history. Base at creation:
`32583cd272cf1ac485243fd13d322bb13f147914`.

**Candidate evidence, not main validation:** Before the candidate fix,
[UI build
1622359](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1622359)
showed the Android CoreCLR-labeled API30 null reference at the first
`Options` tap (log 5696, line 987), followed by a same-head later pass
(log 5696, line 2597). The predecessor's [UI build
1622632](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1622632)
subsequently passed this test in all five scheduled configurations /
eight observed executions, including original attempts (logs 4688:909,
5332:939+1931, 5090:572, 5366:725+3205, 5475:528+1916). These
observations are encouraging but do not prove permanent flake
elimination or validate this main-based replacement.

**Static validation:**
- `dotnet format whitespace --folder --include
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs`
— passed. Its unrelated removal of existing `CropBottomValue` trailing
whitespace was restored before committing.
- `git diff --check` — passed.
- Exact byte comparison — passed: precisely the requested insertion;
every other byte, including all screenshot checks, unchanged. Command:

```sh
python3 -c 'import pathlib,subprocess; p="src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/EditorFeatureTests.cs"; b=subprocess.check_output(["git","show","HEAD:"+p]); n=b"\tpublic void VerifyEditorTextWhenAlignedVertically()\n\t{\n"; assert b.count(n)==1; assert pathlib.Path(p).read_bytes()==b.replace(n,n+b"\t\tApp.WaitForElement(\"Options\");\n",1); print("PASS: exact one-line insertion; every other byte unchanged")'
```

The comparison ran before committing, with `HEAD` pointing to the
unchanged main base. Analysis-only `pr-finalize` found the title/body
consistent with the tiny diff; no review or approval was posted. Native
compilation and UI execution were not run locally and remain pending CI.

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

No separately filed product issue; addresses the Editor test's initial
Options readiness failure documented in predecessor
[dotnet#39123](dotnet#39123).

<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This pull request updates the following dependencies

[marker]: <> (Begin:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
## From https://github.com/dotnet/xharness
- **Subscription**:
[a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95](https://maestro.dot.net/subscriptions?search=a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
- **Build**:
[20260930.3](https://dev.azure.com/dnceng/internal/_build/results?buildId=3091941)
([334604](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/334604))
- **Date Produced**: September 30, 2026 5:18:20 PM UTC
- **Commit**:
[3e092b0335764b0b215cb7aaea7c516ed2bf7ed8](dotnet/xharness@3e092b0)
- **Branch**: [main](https://github.com/dotnet/xharness/tree/main)

[DependencyUpdate]: <> (Begin)

- **Dependency Updates**:
  - From [11.0.0-prerelease.26466.1 to 11.0.0-prerelease.26480.3][1]
     - Microsoft.DotNet.XHarness.CLI
     - Microsoft.DotNet.XHarness.TestRunners.Common
     - Microsoft.DotNet.XHarness.TestRunners.Xunit

[1]: dotnet/xharness@22d4210...3e092b0

[DependencyUpdate]: <> (End)


[marker]: <> (End:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)

Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
…he pan starts

Removing the view from its parent in a PanUpdated handler disconnects its
gestures synchronously, which disposes the InnerGestureListener and nulls its
delegates. StartScrolling raised the Started event and then called the
now-null _scrollDelegate, throwing a NullReferenceException.

Stop handling the scroll once the listener has been disposed, as the tap
callbacks in the same class already do.

Fixes dotnet#38065

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:41 — with GitHub Actions Active
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

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

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

Or

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

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:41 — with GitHub Actions Active
@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:42 — with GitHub Actions Active
@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label Oct 5, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey there @@MykhailoDav! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey there @MykhailoDav! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:43 — with GitHub Actions Active
@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:45 — with GitHub Actions Active
@MykhailoDav
MykhailoDav deployed to copilot-pat-pool October 5, 2026 22:45 — with GitHub Actions Active
@kubaflo

This comment has been minimized.

@kubaflo

kubaflo commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

/azp run

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Note

🔍 /review started

AzDO build 15575790 is running for android.

The s/agent-review-in-progress label stays on this PR while the run is active. The final recommendation and outcome labels are posted only after Gate, expert review, and Deep UI tests finish.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).

@kubaflo

This comment has been minimized.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Warning

Threat Detection Engine Failure — The analysis engine could not complete. This is a tooling failure, not a security finding.

What happened

The threat detection results could not be parsed.

Review the workflow run logs for details.

Tests Failure Analysis

@MykhailoDav — test-failure analysis for commit 9b5a752.

Scope CI failures Commit 9b5a752


🧪 CI Analysis — click to expand
📊 maui-pr

No failures found.


🧪 maui-pr-devicetests

No failures found.


🧪 maui-pr-uitests

🧭 Follow-up — actions and refresh

Next action: Restore UI evidence; compare Android crash/timeout diagnostics at head/base.

Maintainers: comment /review tests to refresh this report.

@MauiBot

MauiBot commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator

AI Review Summary

@MykhailoDav — new AI review results are available based on commit 9b5a752.

Gate Passed Confidence Unknown Platform Android


🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix

Gate Result: ✅ PASSED

Platform: ANDROID · Base: main · Merge base: 7a5a5d61

Test Without Fix (expect FAIL) With Fix (expect PASS)
📱 GestureTests (RemovingViewWhenPanStartsDoesNotThrow) Category=Gesture ✅ FAIL — 526s ✅ PASS — 425s
🔴 Without fix — 📱 GestureTests (RemovingViewWhenPanStartsDoesNotThrow): FAIL ✅ · 526s

(no coded error found; showing last 1200 chars)

moryBytes": 8322998272
          },
          "target": {
            "kind": "emulator",
            "name": "sdk_gphone_x86_64",
            "identifier": "emulator-5554",
            "operatingSystem": "Android",
            "operatingSystemVersion": "11",
            "apiLevel": 30,
            "architecture": "x86_64",
            "supportedArchitectures": [
              "x86_64",
              "x86",
              "arm64-v8a",
              "armeabi-v7a",
              "armeabi"
            ],
            "manufacturer": "Google",
            "model": "sdk_gphone_x86_64",
            "productName": "sdk_gphone_x86_64",
            "buildFingerprint": "google/sdk_gphone_x86_64/generic_x86_64_arm64:11/RSR1.201211.001/7027799:user/release-keys",
            "cpuModel": "0",
            "cpuMaxFrequencyHertz": 2000,
            "totalMemoryBytes": 2077544448
          }
        }
      }
      <<XHARNESS_RESULT_END>>
info: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
info: Successfully uninstalled com.microsoft.maui.controls.devicetests
XHarness exit code: 1 (TESTS_FAILED)
  Passed: 0
  Failed: 1
  Skipped: 0
  Total: 1
  Tests completed with exit code: 1
🟢 With fix — 📱 GestureTests (RemovingViewWhenPanStartsDoesNotThrow): PASS ✅ · 425s

(no coded error found; showing last 1200 chars)

            "totalMemoryBytes": 8322998272
          },
          "target": {
            "kind": "emulator",
            "name": "sdk_gphone_x86_64",
            "identifier": "emulator-5554",
            "operatingSystem": "Android",
            "operatingSystemVersion": "11",
            "apiLevel": 30,
            "architecture": "x86_64",
            "supportedArchitectures": [
              "x86_64",
              "x86",
              "arm64-v8a",
              "armeabi-v7a",
              "armeabi"
            ],
            "manufacturer": "Google",
            "model": "sdk_gphone_x86_64",
            "productName": "sdk_gphone_x86_64",
            "buildFingerprint": "google/sdk_gphone_x86_64/generic_x86_64_arm64:11/RSR1.201211.001/7027799:user/release-keys",
            "cpuModel": "0",
            "cpuMaxFrequencyHertz": 2000,
            "totalMemoryBytes": 2077544448
          }
        }
      }
      <<XHARNESS_RESULT_END>>
info: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
info: Successfully uninstalled com.microsoft.maui.controls.devicetests
XHarness exit code: 0
  Passed: 1
  Failed: 0
  Skipped: 0
  Total: 1
  Tests completed successfully
📁 Fix files reverted (1 files)
  • src/Controls/src/Core/Platform/Android/InnerGestureListener.cs

📋 Pre-Flight — Context & Validation

⚠️ Pre-Flight did not produce output on this run.

The Copilot expert-review task ended before this phase was persisted, usually because the review-stage time budget expired or the CI agent encountered a transient authentication/runtime problem. Earlier completed sections remain valid, but this review is incomplete without this phase.

Next step: re-comment /review to retry on a fresh agent. If this repeats across runs, a maintainer should inspect the reviewer token and Task 3 logs.


🔬 Code Review — Deep Analysis

⚠️ Code Review did not produce output on this run.

The Copilot expert-review task ended before this phase was persisted, usually because the review-stage time budget expired or the CI agent encountered a transient authentication/runtime problem. Earlier completed sections remain valid, but this review is incomplete without this phase.

Next step: re-comment /review to retry on a fresh agent. If this repeats across runs, a maintainer should inspect the reviewer token and Task 3 logs.


🛠️ Try-Fix — Analysis & Comparison

⚠️ Try-Fix did not produce output on this run.

The Copilot expert-review task ended before this phase was persisted, usually because the review-stage time budget expired or the CI agent encountered a transient authentication/runtime problem. Earlier completed sections remain valid, but this review is incomplete without this phase.

Next step: re-comment /review to retry on a fresh agent. If this repeats across runs, a maintainer should inspect the reviewer token and Task 3 logs.


🏁 Report — Final Recommendation

⚠️ Report / Final Recommendation did not produce output on this run.

The Copilot expert-review task ended before this phase was persisted, usually because the review-stage time budget expired or the CI agent encountered a transient authentication/runtime problem. Earlier completed sections remain valid, but this review is incomplete without this phase.

Next step: re-comment /review to retry on a fresh agent. If this repeats across runs, a maintainer should inspect the reviewer token and Task 3 logs.


📱 UI Tests — Button,Label,Layout

Detected UI test categories: Button,Label,Layout

⚠️ Deep UI tests — 145 passed, 2 skipped; 1 category (84 tests) could not run: OneTimeSetUp/fixture setup failure on the platform-pool agent — infrastructure, not a PR test failure (replaces in-process counts above). The deep UI run for 1 category (Layout) exceeded the per-category time budget (a very long-running category or a slow build/deploy) and was stopped before finishing. This is an infrastructure/timeout issue, not a code problem; re-run the review, and if a category consistently needs more time the per-category budget can be raised (DEEP_UITEST_CATEGORY_CAP_MIN / DEEP_UITEST_HARDSTOP_MIN). See the build-output.log in the drop-deep-uitests artifact.

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Button 104/106 (2 skipped) ✓ —
Label 41/125 (setup failed; 84 marked failed) —
⚠️ Label — fixture setup failed for 84 tests

NUnit reported a OneTimeSetUp/fixture setup failure before test bodies ran; the TRX marked each affected test failed.

OneTimeSetUp: System.ObjectDisposedException : Cannot access a disposed object.
Object name: 'Accessing IApp that has been disposed'.
at UITest.Appium.AppiumUIClientContext.get_App() in /_/src/TestUtils/src/UITest.Appium/AppiumUIClientContext.cs:line 17
   at UITest.Appium.NUnit.UITestContextBase.get_App() in /_/src/TestUtils/src/UITest.NUnit/UITestContextBase.cs:line 32
   at UITest.Appium.NUnit.UITestBase.SaveUIDiagnosticInfo(String note, Boolean storeForReattachment) in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 288
   at UITest.Appium.NUnit.UITestBase.OneTimeSetup() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 228
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)

📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)


🧭 Next Steps — review latest findings

No alternative fix was selected for this run. Review the session findings and CI results before merging.

@MauiBot MauiBot added s/agent-review-incomplete AI review did not complete all expected phases s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) and removed s/agent-review-in-progress AI review is currently running for this PR labels Oct 6, 2026
@kubaflo
kubaflo changed the base branch from main to inflight/current October 6, 2026 11:07
@kubaflo
kubaflo merged commit 1a4c496 into dotnet:inflight/current Oct 6, 2026
198 of 205 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR12 milestone Oct 6, 2026

This branch was successfully deployed

1 active deployment
copilot-pat-pool — 9b5a7521 Deployed Oct 5, 2026 by MykhailoDav via conclusion #2225
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community ✨ Community Contribution s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-review-incomplete AI review did not complete all expected phases s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adding a GestureRecognizer with PanUpdated event and dragging the handle produces an error.

3 participants