Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1219,14 +1219,18 @@ function Format-Markdown-Output {
$title = $rawTitle.Replace('|', '\|')
$link = "[#$($pr.Number)]($($pr.URL))"
$turnCol = "$($pr.TurnIcon) $($pr.TurnDetail)"
# Wrap author handles in backticks so GitHub renders them as inline code
# rather than as @mentions — this issue is for MAUI team triage tracking,
# not a notification firehose to every PR author each day.
$author = "``@$($pr.Author)``"
if ($showMilestone -and $showTurn) {
[void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Milestone) | $turnCol | $($pr.Platform) | $($pr.Age)d |")
[void]$md.AppendLine("| $link | $title | $author | $($pr.Milestone) | $turnCol | $($pr.Platform) | $($pr.Age)d |")
} elseif ($showMilestone) {
[void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Milestone) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |")
[void]$md.AppendLine("| $link | $title | $author | $($pr.Milestone) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |")
} elseif ($showTurn) {
[void]$md.AppendLine("| $link | $title | @$($pr.Author) | $turnCol | $($pr.Platform) | $($pr.Age)d |")
[void]$md.AppendLine("| $link | $title | $author | $turnCol | $($pr.Platform) | $($pr.Age)d |")
} else {
[void]$md.AppendLine("| $link | $title | @$($pr.Author) | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |")
[void]$md.AppendLine("| $link | $title | $author | $($pr.Platform) | $($pr.Age)d | $($pr.Updated)d ago |")
}
}
[void]$md.AppendLine("")
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/pr-review-queue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ concurrency:
jobs:
generate-report:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
# Guard: only run in dotnet/maui — prevents the scheduled run from firing
# in forks and pinging fork owners with duplicate queue issues.
if: github.repository_owner == 'dotnet' && github.event_name != 'pull_request'
permissions:
contents: read
issues: write
Expand Down Expand Up @@ -86,7 +88,7 @@ jobs:
# Dry-run on PRs: validate the script works without creating issues
validate:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
if: github.repository_owner == 'dotnet' && github.event_name == 'pull_request'
permissions:
contents: read
pull-requests: read
Expand Down
10 changes: 8 additions & 2 deletions eng/pipelines/ci-copilot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,10 @@ stages:
skipAndroidPlatformApis: true
onlyAndroidPlatformDefaultApis: true
skipAndroidEmulatorImages: ${{ ne(parameters.Platform, 'android') }}
skipAndroidCreateAvds: ${{ ne(parameters.Platform, 'android') }}
# AVD is created by the inline 'Create AVD and boot Android Emulator' script below
# with specific config (playstore image variant, partition shrink, ADB key pre-auth)
# that ProvisionAndroidSdkAvdCreateAvds doesn't replicate.
skipAndroidCreateAvds: true
androidEmulatorApiLevel: '30'
skipSimulatorSetup: ${{ or(eq(parameters.Platform, 'android'), eq(parameters.Platform, 'windows'), eq(parameters.Platform, 'catalyst')) }}
skipCertificates: true
Expand Down Expand Up @@ -871,7 +874,10 @@ stages:
skipAndroidPlatformApis: true
onlyAndroidPlatformDefaultApis: true
skipAndroidEmulatorImages: ${{ ne(parameters.Platform, 'android') }}
skipAndroidCreateAvds: ${{ ne(parameters.Platform, 'android') }}
# AVD is created by the inline 'Create AVD and boot Android Emulator' script below
# with specific config (playstore image variant, partition shrink, ADB key pre-auth)
# that ProvisionAndroidSdkAvdCreateAvds doesn't replicate.
skipAndroidCreateAvds: true
androidEmulatorApiLevel: '30'
skipSimulatorSetup: ${{ or(eq(parameters.Platform, 'android'), eq(parameters.Platform, 'windows'), eq(parameters.Platform, 'catalyst')) }}
skipCertificates: true
Expand Down
9 changes: 9 additions & 0 deletions eng/pipelines/common/variables.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,15 @@ variables:
value: 26.0.1
- name: POWERSHELL_VERSION
value: 7.4.0
# Workaround for PowerShell/PowerShell#20802 (open since Nov 2023):
# pwsh 7.4.x intermittently aborts at startup on macOS with
# 'Call to procargs failed with errno 5'
# because AttemptExecPwshLogin() races on sysctl(KERN_PROCARGS2).
# Setting __PWSH_LOGIN_CHECKED makes pwsh short-circuit the login-shell
# detection that triggers the racy syscall (see Program.cs in PowerShell repo).
# Hit on internal dnceng dotnet-maui build 2990586 (release/11.0.1xx-preview5).
- name: __PWSH_LOGIN_CHECKED
value: '1'
# Localization variables
- name: LocBranchPrefix
value: 'loc-hb'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public InnerGestureListener(

bool HasAnyGestures()
{
return (_panGestureHandler?.HasAnyGestures() ?? false) || (_tapGestureHandler?.HasAnyGestures() ?? false) || (_swipeGestureHandler?.HasAnyGestures() ?? false);
return (_panGestureHandler?.HasAnyGestures() ?? false) || (_tapGestureHandler?.HasAnyGestures() ?? false) || (_swipeGestureHandler?.HasAnyGestures() ?? false) || (_dragAndDropGestureHandler?.HasAnyDragGestures() ?? false);
}

// This is needed because GestureRecognizer callbacks can be delayed several hundred milliseconds
Expand Down
80 changes: 80 additions & 0 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue35752.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
namespace Maui.Controls.Sample.Issues;

[Issue(IssueTracker.Github, 35752, "Android DragGestureRecognizer DragStarting fires prematurely on tap", PlatformAffected.Android)]
public class Issue35752 : TestContentPage
{
protected override void Init()
{
var statusLabel = new Label
{
Text = "Ready",
AutomationId = "StatusLabel"
};

var dragCountLabel = new Label
{
Text = "0",
AutomationId = "DragStartCount"
};

int dragStartCount = 0;

var dragRecognizer = new DragGestureRecognizer();
dragRecognizer.DragStarting += (s, e) =>
{
dragStartCount++;
dragCountLabel.Text = dragStartCount.ToString();
statusLabel.Text = "DragStarting fired";
};

var dragBox = new Label
{
HeightRequest = 100,
WidthRequest = 200,
BackgroundColor = Colors.Blue,
AutomationId = "DragBox",
Text = "Drag Me",
TextColor = Colors.White,
HorizontalTextAlignment = TextAlignment.Center,
VerticalTextAlignment = TextAlignment.Center,
GestureRecognizers = { dragRecognizer }
};

var dropRecognizer = new DropGestureRecognizer();
var dropBox = new Label
{
HeightRequest = 100,
WidthRequest = 200,
BackgroundColor = Colors.Green,
AutomationId = "DropBox",
Text = "Drop Here",
TextColor = Colors.White,
HorizontalTextAlignment = TextAlignment.Center,
VerticalTextAlignment = TextAlignment.Center,
GestureRecognizers = { dropRecognizer }
};

var instructions = new Label
{
Text = "Quick tap the blue box - DragStarting should NOT fire. " +
"Long press or drag it - DragStarting SHOULD fire.",
AutomationId = "TestLoaded"
};

Content = new VerticalStackLayout
{
Spacing = 20,
Padding = new Thickness(20),
Children =
{
instructions,
dragBox,
dropBox,
new Label { Text = "Status:" },
statusLabel,
new Label { Text = "DragStart count:" },
dragCountLabel
}
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues;

public class Issue35752 : _IssuesUITest
{
public override string Issue => "Android DragGestureRecognizer DragStarting fires prematurely on tap";

public Issue35752(TestDevice device)
: base(device)
{ }

[Test]
[Category(UITestCategories.Gestures)]
Comment thread
HarishwaranVijayakumar marked this conversation as resolved.
Outdated
public void DragStartingShouldNotFireOnTapButShouldFireOnDrag()
{
App.WaitForElement("TestLoaded");

App.Tap("DragBox");

Thread.Sleep(400);
Comment thread
HarishwaranVijayakumar marked this conversation as resolved.
Outdated
Comment thread
HarishwaranVijayakumar marked this conversation as resolved.
Outdated

var dragCount = App.WaitForElement("DragStartCount").GetText();
Assert.That(dragCount, Is.EqualTo("0"),
"DragStarting should not fire on a quick tap");

// Initiate drag - DragStarting SHOULD fire
App.DragAndDrop("DragBox", "DropBox");

dragCount = App.WaitForElement("DragStartCount").GetText();
Assert.That(dragCount, Is.EqualTo("1"),
"DragStarting should fire when drag is initiated");
}
}
Loading