Skip to content

[Android] Fix DatePicker dialog dismisses after the device is rotated#34980

Open
HarishwaranVijayakumar wants to merge 3 commits intodotnet:mainfrom
HarishwaranVijayakumar:fix-datepickerdialogdismiss
Open

[Android] Fix DatePicker dialog dismisses after the device is rotated#34980
HarishwaranVijayakumar wants to merge 3 commits intodotnet:mainfrom
HarishwaranVijayakumar:fix-datepickerdialogdismiss

Conversation

@HarishwaranVijayakumar
Copy link
Copy Markdown
Contributor

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Issue Details

  • The DatePicker dialog is dismissed when the device is rotated while the dialog is open.

Root Cause of the issue

  • PR 29323 added DismissEvent subscription in CreateDatePickerDialog() and an OnDialogDismiss → HidePickerDialog() chain that sets IsOpen = false.
  • On rotation, OnMainDisplayInfoChanged unsubscribes DismissEvent and calls Dismiss().
  • ShowPickerDialog() runs synchronously after Dismiss(), enters the else branch, and re-subscribes DismissEvent on the same dialog.
  • The DismissEvent from step 2 fires after re-subscription, triggering HidePickerDialog() which dismisses the newly-shown dialog.
  • Before PR 29323: There was no DismissEvent subscription, no IsOpen property, and no OnDialogDismiss handler — so the dismiss-and-re-show flow in OnMainDisplayInfoChanged worked without interference.

Description of Change

Dialog lifecycle and event handling improvements:

  • Renamed ResetDialog() to DestroyDialog() and updated all references accordingly to clarify its purpose and ensure consistent dialog destruction and recreation.
  • Removed unnecessary subscriptions and unsubscriptions to the dialog's DismissEvent, simplifying dialog event handling in both ShowPickerDialog() and HidePickerDialog().

Display info change handling:

  • Improved the logic in OnMainDisplayInfoChanged to properly destroy and recreate the dialog with the current date, ensuring the dialog updates correctly when display information changes (such as orientation changes).

Issues Fixed

Fixes #34973

Tested the behaviour in the following platforms

  • - Windows
  • - Android
  • - iOS
  • - Mac
Before After
Before_fixdatepicker.mov
After_fixdatepicker.mov

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 15, 2026

🚀 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 -- 34980

Or

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

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label Apr 15, 2026
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Hey there @@HarishwaranVijayakumar! 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 dotnet-policy-service Bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label Apr 15, 2026
@sheiksyedm sheiksyedm marked this pull request as ready for review April 15, 2026 14:32
Copilot AI review requested due to automatic review settings April 15, 2026 14:32
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes an Android regression where the DatePicker dialog immediately dismisses after device rotation by adjusting the dialog lifecycle to avoid re-triggering the dialog’s dismiss handling during the rotation re-show flow.

Changes:

  • Renamed ResetDialog() to DestroyDialog() and updated call sites to better reflect behavior (dismiss + null-out).
  • Simplified DismissEvent wiring by removing per-show/per-hide subscribe/unsubscribe and keeping it scoped to dialog creation/destruction.
  • Updated OnMainDisplayInfoChanged to capture the currently selected date, destroy the existing dialog, and recreate/show a new dialog with the captured date.

@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Apr 15, 2026
@dotnet dotnet deleted a comment from MauiBot Apr 17, 2026
@dotnet dotnet deleted a comment from MauiBot Apr 17, 2026
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented Apr 17, 2026

/azp run maui-pr-uitests , maui-pr-devicetests

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 2 pipeline(s).

@dotnet dotnet deleted a comment from MauiBot Apr 26, 2026
PureWeen pushed a commit that referenced this pull request Apr 30, 2026
…ability (#35133)

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

> **Depends on #35136** (pipeline category detection — should merge
first)

## What this does

Two things:

### 1. UI test category detection in PR review

During the PR review workflow, Step 0.5 detects which UI test categories
the PR impacts and writes the result to the AI summary comment. This
gives reviewers visibility into which UI tests are relevant.

**Detection** reuses the 3-tier script from #35136 (test attributes →
source paths → AI reasoning).

**AI summary** shows a new 🧪 UI Tests section with detected categories
before the gate section.

### 2. Gate reliability fixes

Multiple fixes to make the gate (`verify-tests-fail.ps1`) more
deterministic:

| Fix | Problem it solves |
|-----|-------------------|
| **Absolute path resolution** | Gate scripts not found on Linux CI
agents (`Resolve-Path`, `GetFullPath`) |
| **File existence check** | Instant cryptic failure when verify script
is missing — now logs clear error |
| **3x retry on ENV ERROR** | Emulator timeouts, ADB failures, app
crashes — transient issues that pass on retry |
| **Strip bad report blocks** | Old verify script produces `Passed:
False` with empty counts — stripped instead of shown |
| **Gate log in fallback** | When report is missing, shows last 20 lines
of gate output instead of just `❌ FAILED / Platform: IOS` |

## Files

| File | Changes |
|------|---------|
| `.github/scripts/Review-PR.ps1` | Step 0.5 category detection + all 5
gate fixes |
| `.github/scripts/post-ai-summary-comment.ps1` | Add `uitests` phase to
render detected categories |
| `.github/pr-review/pr-preflight.md` | Step 7: AI identifies impacted
UI test categories |

## Validation — PR reviewer builds (Apr 26)

10 builds against real PRs — all succeeded ✅. Category detection shown
in AI summary comment.

| PR | Categories Detected | Build | AI Summary |
|----|-------------------|-------|------------|
| #35037 (WebView theme) | `ViewBaseTests,WebView` |
[13940071](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940071)
|
[comment](#35037 (comment))
|
| #35031 (Shell memory leak) | `Shell` |
[13940072](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940072)
|
[comment](#35031 (comment))
|
| #35020 (XAML Hot Reload) | _(none — XAML only)_ |
[13940073](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940073)
| ✅ Shows "No UI test categories" |
| #35008 (Shell SearchHandler) | `Shell` |
[13940074](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940074)
| ✅ |
| #34997 (RadioButton gradient) | `RadioButton,ViewBaseTests` |
[13940075](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940075)
| ✅ |
| #34980 (DatePicker rotation) | `ViewBaseTests` |
[13940076](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940076)
| ✅ |
| #34974 (Picker CharacterSpacing) | `ViewBaseTests` |
[13940077](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940077)
| ✅ |
| #34923 (SwipeView threshold) | `SwipeView,ViewBaseTests` |
[13940078](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940078)
| ✅ |
| #34907 (CollectionView ScrollTo) | `CollectionView` |
[13940079](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940079)
| ✅ |
| #34845 (RefreshView binding) | `RefreshView,ViewBaseTests` |
[13940080](https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13940080)
| ✅ |

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet dotnet deleted a comment from MauiBot May 2, 2026
Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 3 findings

See inline comments for details.

@dotnet dotnet deleted a comment from MauiBot May 3, 2026
@dotnet dotnet deleted a comment from MauiBot May 3, 2026
MauiBot
MauiBot previously requested changes May 3, 2026
Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Automated review — alternative fix proposed

The expert-reviewer evaluation compared the PR fix against #2 automatically generated candidates and selected try-fix-2 as the strongest fix.

Why: try-fix-2 wins with a minimal 9-line change to OnMainDisplayInfoChanged that uses the existing HidePickerDialog() method (which calls Hide() not Dismiss(), preventing DismissEvent from firing) then nulls _dialog to force fresh dialog creation via CreateDatePickerDialog. All DatePicker device tests and both regression tests (Issue19256, Issue33583) pass explicitly. The PR's fix has a Gate failure and code-review NEEDS_CHANGES (missing regression test, stale dialog guard too narrow), making it ineligible as-is.

Please consider applying the candidate diff below (or use it as guidance). Once you push an update, this workflow will re-trigger and re-evaluate.

Candidate diff (`try-fix-2`)
diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
index 1751349534..6b148f11c3 100644
--- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
+++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
@@ -240,9 +240,19 @@ namespace Microsoft.Maui.Handlers
 
 			if (currentDialog is not null && currentDialog.IsShowing)
 			{
-				currentDialog.Dismiss();
+				var date = currentDialog.DatePicker.DateTime;
 
-				ShowPickerDialog(currentDialog.DatePicker.DateTime);
+				// Unsubscribe DismissEvent and hide before dismissing so that the
+				// queued DismissEvent cannot re-enter OnDialogDismiss and dismiss
+				// the new dialog we are about to create.
+				HidePickerDialog();
+
+				// Null the reference so ShowPickerDialog takes the clean
+				// CreateDatePickerDialog path rather than the else-branch that
+				// re-subscribes DismissEvent on the stale dialog.
+				_dialog = null;
+
+				ShowPickerDialog(date);
 			}
 		}
 	}

@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates labels May 3, 2026
@dotnet dotnet deleted a comment from MauiBot May 4, 2026
@kubaflo kubaflo dismissed MauiBot’s stale review May 4, 2026 08:51

Resetting for re-review

MauiBot
MauiBot previously requested changes May 4, 2026
Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Automated review — alternative fix proposed

The expert-reviewer evaluation compared the PR fix against #2 automatically generated candidates and selected try-fix-2 as the strongest fix.

Why: try-fix-2 is the strongest candidate: it passed device tests, includes the missing regression test (DatePickerDialogRemainsOpenAfterRotation), and adds the VirtualView null guard identified by code review. Its approach — using Hide() instead of Dismiss() in OnMainDisplayInfoChanged, then nulling _dialog to force fresh creation — eliminates the DismissEvent race condition at its source.

Please consider applying the candidate diff below (or use it as guidance). Once you push an update, this workflow will re-trigger and re-evaluate.

Candidate diff (`try-fix-2`)
diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
index 1751349534..d2bfccfa29 100644
--- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
+++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs
@@ -226,7 +226,8 @@ namespace Microsoft.Maui.Handlers
 				_dialog.Hide();
 			}
 
-			VirtualView.IsOpen = false;
+			if (VirtualView is not null)
+				VirtualView.IsOpen = false;
 		}
 
 		void OnDialogDismiss(object? sender, EventArgs e)
@@ -236,13 +237,19 @@ namespace Microsoft.Maui.Handlers
 
 		void OnMainDisplayInfoChanged(object? sender, DisplayInfoChangedEventArgs e)
 		{
-			DatePickerDialog? currentDialog = _dialog;
-
-			if (currentDialog is not null && currentDialog.IsShowing)
+			if (_dialog is not null && _dialog.IsShowing)
 			{
-				currentDialog.Dismiss();
+				var date = _dialog.DatePicker.DateTime;
+
+				// Unsubscribe and hide using Hide() (not Dismiss()) without touching
+				// VirtualView.IsOpen — rotation is a transparent rebuild, not a user dismissal.
+				// Null _dialog to force ShowPickerDialog() to allocate a fresh DatePickerDialog
+				// via CreateDatePickerDialog() — Android's window context changes on rotation.
+				_dialog.DismissEvent -= OnDialogDismiss;
+				_dialog.Hide();
+				_dialog = null;
 
-				ShowPickerDialog(currentDialog.DatePicker.DateTime);
+				ShowPickerDialog(date);
 			}
 		}
 	}
diff --git a/src/Core/tests/DeviceTests/Handlers/DatePicker/DatePickerHandlerTests.Android.cs b/src/Core/tests/DeviceTests/Handlers/DatePicker/DatePickerHandlerTests.Android.cs
index 528a2f7200..dfc4710230 100644
--- a/src/Core/tests/DeviceTests/Handlers/DatePicker/DatePickerHandlerTests.Android.cs
+++ b/src/Core/tests/DeviceTests/Handlers/DatePicker/DatePickerHandlerTests.Android.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Threading.Tasks;
+using Microsoft.Maui.Devices;
 using Microsoft.Maui.DeviceTests.Stubs;
 using Xunit;
 using AColor = Android.Graphics.Color;
@@ -144,5 +145,44 @@ namespace Microsoft.Maui.DeviceTests
 			datePicker.IsOpen = false;
 			handler.UpdateValue(nameof(IDatePicker.IsOpen));
 		}
+
+		[Fact(DisplayName = "Dialog Stays Visible After Rotation (OnMainDisplayInfoChanged)")]
+		public async Task DialogRemainsOpenAfterRotation()
+		{
+			var datePicker = new DatePickerStub
+			{
+				Date = DateTime.Today
+			};
+
+			await InvokeOnMainThreadAsync(async () =>
+			{
+				var handler = await CreateHandlerAsync(datePicker) as DatePickerHandler;
+				Assert.NotNull(handler);
+
+				// Open the picker dialog
+				datePicker.IsOpen = true;
+				handler.UpdateValue(nameof(IDatePicker.IsOpen));
+
+				Assert.True(handler.DatePickerDialog?.IsShowing, "Dialog should be showing before rotation");
+
+				// Simulate device rotation by invoking OnMainDisplayInfoChanged via reflection
+				var method = typeof(DatePickerHandler).GetMethod(
+					"OnMainDisplayInfoChanged",
+					System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+				Assert.NotNull(method);
+
+				var displayInfo = new DisplayInfoChangedEventArgs(new Devices.DisplayInfo());
+				method.Invoke(handler, new object?[] { null, displayInfo });
+
+				// Yield so any asynchronous DismissEvent posted by Dismiss() has a chance to fire.
+				// With the broken code, the deferred DismissEvent fires here and dismisses the dialog.
+				await Task.Delay(500);
+
+				// After rotation the dialog should still be showing and IsOpen should still be true
+				// (rotation is a transparent rebuild, not a user dismiss).
+				Assert.True(handler.DatePickerDialog?.IsShowing, "Dialog should still be showing after rotation");
+				Assert.True(datePicker.IsOpen, "VirtualView.IsOpen should remain true after rotation");
+			});
+		}
 	}
 }
\ No newline at end of file

@dotnet dotnet deleted a comment from MauiBot May 6, 2026
@kubaflo kubaflo dismissed MauiBot’s stale review May 6, 2026 18:58

Resetting for re-review

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented May 6, 2026

🤖 AI Summary

👋 @HarishwaranVijayakumar — new AI review results are available. Please review the latest session below.

📊 Review Sessione77ceb5 · Modify stale comments · 2026-05-06 22:26 UTC
🚦 Gate — Test Before & After Fix

Gate Result: ❌ FAILED

Platform: ANDROID · Base: main · Merge base: 1463c4c5

🩺 Fix breaks tests — one or more tests fail with the fix applied, and none of the failures are resolved by the fix.

Test Without Fix (expect FAIL) With Fix (expect PASS)
📱 DatePickerHandlerTests DatePickerHandlerTests ✅ FAIL — 1068s ❌ FAIL — 319s
📱 DatePickerTests DatePickerTests ❌ PASS — 1367s ✅ PASS — 1046s
🔴 Without fix — 📱 DatePickerHandlerTests: FAIL ✅ · 1068s

(truncated to last 15,000 chars)

oding.dll -> System.Text.Encoding.dll.so
  [112/128] System.Security.Cryptography.dll -> System.Security.Cryptography.dll.so
  [37/128] Xamarin.AndroidX.Core.dll -> Xamarin.AndroidX.Core.dll.so
  [113/128] System.Text.Encodings.Web.dll -> System.Text.Encodings.Web.dll.so
  [38/128] Xamarin.AndroidX.CursorAdapter.dll -> Xamarin.AndroidX.CursorAdapter.dll.so
  [39/128] Xamarin.AndroidX.CustomView.dll -> Xamarin.AndroidX.CustomView.dll.so
  [40/128] Xamarin.AndroidX.DrawerLayout.dll -> Xamarin.AndroidX.DrawerLayout.dll.so
  [41/128] Xamarin.AndroidX.Fragment.dll -> Xamarin.AndroidX.Fragment.dll.so
  [42/128] Xamarin.AndroidX.Lifecycle.Common.Jvm.dll -> Xamarin.AndroidX.Lifecycle.Common.Jvm.dll.so
  [43/128] Xamarin.AndroidX.Lifecycle.LiveData.Core.dll -> Xamarin.AndroidX.Lifecycle.LiveData.Core.dll.so
  [114/128] System.Text.RegularExpressions.dll -> System.Text.RegularExpressions.dll.so
  [44/128] Xamarin.AndroidX.Lifecycle.ViewModel.Android.dll -> Xamarin.AndroidX.Lifecycle.ViewModel.Android.dll.so
  [115/128] System.Threading.Tasks.dll -> System.Threading.Tasks.dll.so
  [45/128] Xamarin.AndroidX.Lifecycle.ViewModelSavedState.Android.dll -> Xamarin.AndroidX.Lifecycle.ViewModelSavedState.Android.dll.so
  [116/128] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
  [117/128] System.Text.Json.dll -> System.Text.Json.dll.so
  [46/128] Xamarin.AndroidX.Loader.dll -> Xamarin.AndroidX.Loader.dll.so
  [118/128] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
  [119/128] System.Threading.dll -> System.Threading.dll.so
  [120/128] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
  [47/128] Xamarin.AndroidX.Navigation.Common.Android.dll -> Xamarin.AndroidX.Navigation.Common.Android.dll.so
  [121/128] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
  [48/128] Xamarin.AndroidX.Navigation.Fragment.dll -> Xamarin.AndroidX.Navigation.Fragment.dll.so
  [122/128] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
  [123/128] System.dll -> System.dll.so
  [49/128] Xamarin.AndroidX.Navigation.Runtime.Android.dll -> Xamarin.AndroidX.Navigation.Runtime.Android.dll.so
  [124/128] netstandard.dll -> netstandard.dll.so
  [125/128] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
  [50/128] Xamarin.AndroidX.Navigation.UI.dll -> Xamarin.AndroidX.Navigation.UI.dll.so
  [126/128] Java.Interop.dll -> Java.Interop.dll.so
  [51/128] Xamarin.AndroidX.RecyclerView.dll -> Xamarin.AndroidX.RecyclerView.dll.so
  [52/128] Xamarin.AndroidX.SavedState.SavedState.Android.dll -> Xamarin.AndroidX.SavedState.SavedState.Android.dll.so
  [53/128] Xamarin.AndroidX.SwipeRefreshLayout.dll -> Xamarin.AndroidX.SwipeRefreshLayout.dll.so
  [54/128] Xamarin.AndroidX.ViewPager.dll -> Xamarin.AndroidX.ViewPager.dll.so
  [55/128] Xamarin.AndroidX.ViewPager2.dll -> Xamarin.AndroidX.ViewPager2.dll.so
  [56/128] Xamarin.Google.Android.Material.dll -> Xamarin.Google.Android.Material.dll.so
  [57/128] Xamarin.Kotlin.StdLib.dll -> Xamarin.Kotlin.StdLib.dll.so
  [127/128] Mono.Android.dll -> Mono.Android.dll.so
  [58/128] Xamarin.KotlinX.Coroutines.Core.Jvm.dll -> Xamarin.KotlinX.Coroutines.Core.Jvm.dll.so
  [59/128] Xamarin.KotlinX.Serialization.Core.Jvm.dll -> Xamarin.KotlinX.Serialization.Core.Jvm.dll.so
  [60/128] xunit.abstractions.dll -> xunit.abstractions.dll.so
  [61/128] xunit.assert.dll -> xunit.assert.dll.so
  [62/128] xunit.core.dll -> xunit.core.dll.so
  [63/128] xunit.execution.dotnet.dll -> xunit.execution.dotnet.dll.so
  [64/128] xunit.runner.utility.netcoreapp10.dll -> xunit.runner.utility.netcoreapp10.dll.so
  [65/128] System.Collections.Concurrent.dll -> System.Collections.Concurrent.dll.so
  [66/128] System.Collections.Immutable.dll -> System.Collections.Immutable.dll.so
  [67/128] System.Collections.NonGeneric.dll -> System.Collections.NonGeneric.dll.so
  [68/128] System.Collections.Specialized.dll -> System.Collections.Specialized.dll.so
  [69/128] System.Collections.dll -> System.Collections.dll.so
  [70/128] System.ComponentModel.Primitives.dll -> System.ComponentModel.Primitives.dll.so
  [71/128] System.ComponentModel.TypeConverter.dll -> System.ComponentModel.TypeConverter.dll.so
  [72/128] System.ComponentModel.dll -> System.ComponentModel.dll.so
  [73/128] System.Console.dll -> System.Console.dll.so
  [74/128] System.Diagnostics.Debug.dll -> System.Diagnostics.Debug.dll.so
  [75/128] System.Diagnostics.DiagnosticSource.dll -> System.Diagnostics.DiagnosticSource.dll.so
  [76/128] System.Diagnostics.Process.dll -> System.Diagnostics.Process.dll.so
  [77/128] System.Diagnostics.Tools.dll -> System.Diagnostics.Tools.dll.so
  [78/128] System.Diagnostics.TraceSource.dll -> System.Diagnostics.TraceSource.dll.so
  [79/128] System.Diagnostics.Tracing.dll -> System.Diagnostics.Tracing.dll.so
  [80/128] System.Drawing.Primitives.dll -> System.Drawing.Primitives.dll.so
  [81/128] System.Drawing.dll -> System.Drawing.dll.so
  [128/128] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so
  [82/128] System.Formats.Asn1.dll -> System.Formats.Asn1.dll.so
  [83/128] System.Globalization.dll -> System.Globalization.dll.so
  [84/128] System.IO.Compression.Brotli.dll -> System.IO.Compression.Brotli.dll.so
  [85/128] System.IO.Compression.dll -> System.IO.Compression.dll.so
  [86/128] System.IO.FileSystem.dll -> System.IO.FileSystem.dll.so
  [87/128] System.IO.Pipelines.dll -> System.IO.Pipelines.dll.so
  [88/128] System.IO.dll -> System.IO.dll.so
  [89/128] System.Linq.Expressions.dll -> System.Linq.Expressions.dll.so
  [90/128] System.Linq.dll -> System.Linq.dll.so
  [91/128] System.Memory.dll -> System.Memory.dll.so
  [92/128] System.Net.Http.dll -> System.Net.Http.dll.so
  [93/128] System.Net.NameResolution.dll -> System.Net.NameResolution.dll.so
  [94/128] System.Net.Primitives.dll -> System.Net.Primitives.dll.so
  [95/128] System.Net.Requests.dll -> System.Net.Requests.dll.so
  [96/128] System.Net.Sockets.dll -> System.Net.Sockets.dll.so
  [97/128] System.Numerics.Vectors.dll -> System.Numerics.Vectors.dll.so
  [98/128] System.ObjectModel.dll -> System.ObjectModel.dll.so
  [99/128] System.Private.Uri.dll -> System.Private.Uri.dll.so
  [100/128] System.Private.Xml.Linq.dll -> System.Private.Xml.Linq.dll.so
  [101/128] System.Private.Xml.dll -> System.Private.Xml.dll.so
  [102/128] System.Reflection.Extensions.dll -> System.Reflection.Extensions.dll.so
  [103/128] System.Reflection.TypeExtensions.dll -> System.Reflection.TypeExtensions.dll.so
  [104/128] System.Reflection.dll -> System.Reflection.dll.so
  [105/128] System.Runtime.Extensions.dll -> System.Runtime.Extensions.dll.so
  [106/128] System.Runtime.InteropServices.RuntimeInformation.dll -> System.Runtime.InteropServices.RuntimeInformation.dll.so
  [107/128] System.Runtime.InteropServices.dll -> System.Runtime.InteropServices.dll.so
  [108/128] System.Runtime.Loader.dll -> System.Runtime.Loader.dll.so
  [109/128] System.Runtime.Numerics.dll -> System.Runtime.Numerics.dll.so
  [110/128] System.Runtime.dll -> System.Runtime.dll.so
  [111/128] System.Security.Cryptography.dll -> System.Security.Cryptography.dll.so
  [112/128] System.Text.Encoding.dll -> System.Text.Encoding.dll.so
  [113/128] System.Text.Encodings.Web.dll -> System.Text.Encodings.Web.dll.so
  [114/128] System.Text.Json.dll -> System.Text.Json.dll.so
  [115/128] System.Text.RegularExpressions.dll -> System.Text.RegularExpressions.dll.so
  [116/128] System.Threading.Tasks.dll -> System.Threading.Tasks.dll.so
  [117/128] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
  [118/128] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
  [119/128] System.Threading.dll -> System.Threading.dll.so
  [120/128] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
  [121/128] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
  [122/128] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
  [123/128] System.dll -> System.dll.so
  [124/128] netstandard.dll -> netstandard.dll.so
  [125/128] Java.Interop.dll -> Java.Interop.dll.so
  [126/128] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
  [127/128] Mono.Android.dll -> Mono.Android.dll.so
  [128/128] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:08:26.44
[11.0.0-prerelease.26107.1+bfbac237157e59cdbd19334325b2af80bd6e9828] XHarness command issued: android test --app /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk --package-name com.microsoft.maui.core.devicetests --device-id emulator-5554 -o artifacts/log --timeout 01:00:00 -v --arg TestFilter=DatePickerHandlerTests
�[40m�[37mdbug�[39m�[22m�[49m: ADBRunner using ADB.exe supplied from /home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/tools/net10.0/any/../../../runtimes/any/native/adb/linux/adb
�[40m�[37mdbug�[39m�[22m�[49m: Full resolved path:'/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb'
�[40m�[32minfo�[39m�[22m�[49m: Will attempt to find device supporting architectures: 'arm64-v8a', 'x86_64'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb start-server'
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[32minfo�[39m�[22m�[49m: Finding attached devices/emulators...
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb devices -l'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices
�[40m�[37mdbug�[39m�[22m�[49m: Evaluating output line for device serial: emulator-5554          device product:sdk_gphone_x86_64 model:sdk_gphone_x86_64 device:generic_x86_64_arm64 transport_id:2
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 shell getprop ro.product.cpu.abilist'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices. Using 'emulator-5554'
�[40m�[32minfo�[39m�[22m�[49m: Active Android device set to serial 'emulator-5554'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.product.cpu.abi'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.build.version.sdk'
�[40m�[32minfo�[39m�[22m�[49m: Waiting for device to be available (max 5 minutes)
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 wait-for-device'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop sys.boot_completed'
�[40m�[37mdbug�[39m�[22m�[49m: sys.boot_completed = '1'
�[40m�[37mdbug�[39m�[22m�[49m: Waited 0 seconds for device boot completion
�[40m�[37mdbug�[39m�[22m�[49m: Working with emulator-5554 (API 30)
�[40m�[37mdbug�[39m�[22m�[49m: Check current adb install and/or package verification settings
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global verifier_verify_adb_installs'
�[40m�[37mdbug�[39m�[22m�[49m: verifier_verify_adb_installs = 0
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global package_verifier_enable'
�[40m�[37mdbug�[39m�[22m�[49m: package_verifier_enable = 
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Installing debug apks on a device might be rejected with INSTALL_FAILED_VERIFICATION_FAILURE. Make sure to set 'package_verifier_enable' to '0'
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Waiting for command timed out: execution may be compromised
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: -2
      Std out:
      
      
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk'
�[41m�[30mfail�[39m�[22m�[49m: Error:
      Exit code: 1
      Std out:
      Serving...
      Performing Incremental Install
      cmd: Failure calling service package: Broken pipe (32)
      Performing Streamed Install
      
      
      Std err:
      All files should be loaded. Notifying the device.
      adb: failed to install /home/vsts/work/1/s/artifacts/bin/Core.DeviceTests/Release/net10.0-android/com.microsoft.maui.core.devicetests-Signed.apk: cmd: Can't find service: package
      
      
      
�[41m�[1m�[37mcrit�[39m�[22m�[49m: Install failure: Test command cannot continue
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
      Std out:
      
      
      Std err:
      cmd: Can't find service: package
      
      
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
      Std out:
      
      
      Std err:
      cmd: Can't find service: package
      
      
      
XHarness exit code: 78 (PACKAGE_INSTALLATION_FAILURE)
  Tests completed with exit code: 78

🟢 With fix — 📱 DatePickerHandlerTests: FAIL ❌ · 319s

(truncated to last 15,000 chars)

ed 8us total 7.640ms
      05-06 15:55:59.142 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 48(31KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 7us total 8.174ms
      05-06 15:55:59.167 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 14(16KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 7us total 7.682ms
      05-06 15:55:59.191 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 48(31KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 7us total 7.610ms
      05-06 15:55:59.215 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 14(16KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 7us total 7.529ms
      05-06 15:55:59.243 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 48(31KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 7us total 7.770ms
      05-06 15:55:59.267 20666 20686 I ore.devicetest: Explicit concurrent copying GC freed 14(16KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 11MB/22MB, paused 8us total 7.545ms
      05-06 15:55:59.279 20666 22486 I DOTNET  : 	[PASS] TheSameImageSourceReturnsTheSameBitmap
      05-06 15:55:59.280 20666 22486 I DOTNET  : 	[PASS] ThrowsWhenMissingService
      05-06 15:55:59.280 20666 22486 I DOTNET  : 	[PASS] CanResolveCorrectService
      05-06 15:55:59.281 20666 22486 I DOTNET  : 	[PASS] CustomReleasingImageSourceReturnsDifferentBitmap
      05-06 15:55:59.281 20666 22486 I DOTNET  : 	[PASS] ThrowsWhenNotASpecificImageSource
      05-06 15:55:59.282 20666 22486 I DOTNET  : 	[PASS] GlideStaticEqualsGlideGet
      05-06 15:55:59.282 20666 22486 I DOTNET  : Microsoft.Maui.DeviceTests.ImageSourceServiceTests 5.2145909 ms
      05-06 15:55:59.290 20666 20686 I DOTNET  : Failed tests:
      05-06 15:55:59.290 20666 20686 I DOTNET  : 1) 	[FAIL] Thumb Color Updates Correctly   Test name: Thumb Color Updates Correctly
      05-06 15:55:59.290 20666 20686 I DOTNET  :    Assembly:  [Microsoft.Maui.Core.DeviceTests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=null]
      05-06 15:55:59.290 20666 20686 I DOTNET  :    Exception messages: Color Color [A=255, R=255, G=0, B=0] not found. This is what it looked like:<img>iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAA/rSURBVHic7Z17jB3Vfcc/v3Nm7mMf9u567QVjMDYuD2NMk7agKGkxhTTpU6iCVG1FGlo1UdWmUtWHQqMKXKlVioRKojRRWjVUrdSWh1pUgigtLyUNJBQwxtjYYDCY9WO99q69r7t3Zs45/WPu7J293vWuvXvte+n5SKM7unfuvM53fr/f+Z3HgMfj8Xg8Ho/H4/F4PB6Px+PxeDwej8fj8Xg8Ho/H4/F4PB6Px+PxeDwej8fj8Xg8Ho/H4/F4PB6Px+PxeNoTudAn8P+c/P13F+wscnhBNJf57q80rOfFMJ8wzotgvCCWn8bCXmi9kfnEsRjRLBkviOWh8T5Kw6eaZ9v5XEZ+3TZ81yiGZRWHF8TSaSzgvAjywpAfAxWDXF777Mr9dwJcCO49sCG4V1IhOGYLIS+OplgML4hzZ64nXTWurwPpA9UHcgz4XeAWkCLoXhABceBGwVXBPAPub4A1wAi4EbCDdQHkBdFoORrXl3xRnsXTKAYFyGaQPaA+BvIBEIO6Cwq/BX290HcCLumA9WVYq2BlAEUHIRAbqFo4VYHDU/D+Kjg0CiN/DyMPQhSCvRR4sS6GvEiWTRReEGfPLDdAThBrQa8HdxsEt8LAari2CB8pw/UhXCmwSkEnUJb0P87VdyguLdyKhUkHJxJ4awp2TsGOEdj9NAw9Bsn7IIfBcLo45oszzvriPIsjCw5niWEt6MPg/gD4FdhwDdysYFsI1ytYDxTIFZKQlqICV/vEgqjaRrl6qACRhfdj2Gnh+TfhuYfgwF8Da+vCmEsUmUs5K7wgFsd8VkFthiCC+DroehDuKMDtCrYo6AOC3H9
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at System.Threading.Tasks.Task.<>c.<.cctor>b__288_0(Object obj)
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread , ExecutionContext , ContextCallback , Object )
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread , ExecutionContext , ContextCallback , Object )
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& , Thread )
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at Microsoft.Maui.DeviceTests.AssertionExtensions.AssertContainsColor(View view, Color expectedColor, IMauiContext mauiContext, Nullable`1 tolerance)
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at Microsoft.Maui.DeviceTests.HandlerTestBasement.<>c__DisplayClass18_0.<<ValidateHasColor>b__0>d.MoveNext()
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d[[System.Boolean, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    at Microsoft.Maui.DeviceTests.SwitchHandlerTests.ThumbColorUpdatesCorrectly()
      05-06 15:55:59.290 20666 20686 I DOTNET  : --- End of stack trace from previous location ---
      05-06 15:55:59.290 20666 20686 I DOTNET  :    Execution time: 0.3038949
      05-06 15:55:59.290 20666 20686 I DOTNET  :    Test trait name: Category
      05-06 15:55:59.290 20666 20686 I DOTNET  :       value: Switch
      05-06 15:55:59.290 20666 20686 I DOTNET  : 
      05-06 15:55:59.324 20666 20686 I DOTNET  : Xml file was written to the provided writer.
      05-06 15:55:59.326 20666 20686 I DOTNET  : Tests run: 3015 Passed: 2942 Inconclusive: 0 Failed: 1 Ignored: 0
      05-06 15:55:59.340 10925 12155 D CompatibilityChangeReporter: Compat change id reported: 149924527; UID 10155; state: ENABLED
      05-06 15:55:59.341 10925 12155 D CompatibilityChangeReporter: Compat change id reported: 132649864; UID 10155; state: DISABLED
      05-06 15:55:59.364 11859 11876 I MediaProvider: Using lower FS for /storage/emulated/0/Download/com.microsoft.maui.core.devicetests/dc380acd07ba454d970e816e5878de66/testResults.xml
      05-06 15:55:59.370 10925 12155 I ActivityManager: Force stopping com.microsoft.maui.core.devicetests appid=10155 user=0: finished inst
      05-06 15:55:59.371 10925 12155 I ActivityManager: Killing 20666:com.microsoft.maui.core.devicetests/u0a155 (adj 0): stop com.microsoft.maui.core.devicetests due to finished inst
      05-06 15:55:59.376 10925 12155 W ActivityTaskManager: Force removing ActivityRecord{c516620 u0 com.microsoft.maui.core.devicetests/.TestActivity t12 f}}: app died, no saved state
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.382 10925 12155 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 15:55:59.424 10925 13452 W ActivityManager: Unable to start service Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } U=0: not found
      05-06 15:55:59.424 10925 13452 W RemoteAppPredictionService: could not bind to Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } using flags 67108865
      05-06 15:55:59.426   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f4000000 0x3f47e9000]
      05-06 15:55:59.439   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f57bb000 0x3f5fa4000]
      05-06 15:55:59.452   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f5fa4000 0x3f678d000]
      05-06 15:55:59.471   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f678d000 0x3f6f76000]
      05-06 15:55:59.505   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f6f76000 0x3f775f000]
      05-06 15:55:59.591   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3fa966000 0x3fb14f000]
      05-06 15:55:59.771 12201 12201 I bxmb    : onStart
      05-06 15:55:59.775 20654 20654 D AndroidRuntime: Shutting down VM
      05-06 15:56:00.130 10925 12155 D ConnectivityService: requestNetwork for uid/pid:10107/12201 NetworkRequest [ TRACK_DEFAULT id=102, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ]
      05-06 15:56:00.132 10925 11040 D ConnectivityService: NetReassign [102 : null → 101]
      05-06 15:56:00.132 10925 11035 D UntrustedWifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=102, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:56:00.133 11402 11402 D PhoneSwitcherNetworkRequstListener: got request NetworkRequest [ TRACK_DEFAULT id=102, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:56:00.139 10925 11035 D WifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=102, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:56:00.146 12201 12201 I bvgd    : (REDACTED) [%s] onStart()
      05-06 15:56:00.144 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 15:56:00.146 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 15:56:00.146 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 15:56:00.147 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@15c4242 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 15:56:00.158 12201 12201 E NetworkErrorMessage: (REDACTED) Invalid connectivity state: %s
      05-06 15:56:00.159 12201 12201 I bxmb    : onResume
      05-06 15:56:00.175 12201 12201 I Choreographer: Skipped 44 frames!  The application may be doing too much work on its main thread.
      05-06 15:56:00.296 12201 12419 I OpenGLRenderer: Davey! duration=869ms; Flags=0, IntendedVsync=3065981016398, Vsync=3066714349702, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=3066729050070, AnimationStart=3066729051162, PerformTraversalsStart=3066729055731, DrawStart=3066743191092, SyncQueued=3066745483176, SyncStart=3066745601417, IssueDrawCommandsStart=3066745664124, SwapBuffers=3066779092596, FrameCompleted=3066850230491, DequeueBufferDuration=29965, QueueBufferDuration=144991, GpuCompleted=3343197489899464494, 
      05-06 15:56:00.409 10925 10943 W ActivityManager: setHasOverlayUi called on unknown pid: 20666
      05-06 15:56:00.419 10925 12155 D AutofillSession: handling death of Token{8632a56 ActivityRecord{c516620 u0 com.microsoft.maui.core.devicetests/.TestActivity t-1 f}}} when saving=false
      05-06 15:56:00.426 10885 10885 I Zygote  : Process 20666 exited due to signal 9 (Killed)
      05-06 15:56:00.502 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 10155 pid 20666 in 1126ms
      
�[41m�[30mfail�[39m�[22m�[49m: Non-success instrumentation exit code: 1, expected: 0
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.core.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.core.devicetests'
�[40m�[32minfo�[39m�[22m�[49m: Successfully uninstalled com.microsoft.maui.core.devicetests
XHarness exit code: 1 (TESTS_FAILED)
  Tests completed with exit code: 1

🔴 Without fix — 📱 DatePickerTests: PASS ❌ · 1367s

(truncated to last 15,000 chars)

io_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.481 10925 14614 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.481 10925 14614 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.481 10925 14614 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.481 10925 14614 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.481 10925 14614 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.482 10925 14614 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 15:50:38.484 10925 14614 I ActivityManager: Killing 17657:com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:4/u0a154i4 (adj 0): isolated not needed
      05-06 15:50:38.488 15921 15921 D AndroidRuntime: Shutting down VM
      05-06 15:50:38.513 10925 12156 I ActivityManager: Killing 13915:com.google.android.apps.photos/u0a123 (adj 975): empty #17
      05-06 15:50:38.523 12201 12419 D HostConnection: HostConnection::get() New Host Connection established 0x7e1f0e575010, tid 12419
      05-06 15:50:38.526 12201 12419 D HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma ANDROID_EMU_hwc_color_transform GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
      05-06 15:50:38.541 10886 10886 I Zygote  : Process 13915 exited due to signal 9 (Killed)
      05-06 15:50:38.576 12201 12419 D EGL_emulation: eglCreateContext: 0x7e1efe5e06f0: maj 3 min 0 rcv 3
      05-06 15:50:38.577 12201 12419 D EGL_emulation: eglMakeCurrent: 0x7e1efe5e06f0: ver 3 0 (tinfo 0x7e1e9e5ce260) (first time)
      05-06 15:50:38.602   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f4000000 0x3f47e9000]
      05-06 15:50:38.606   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f47e9000 0x3f4fd2000]
      05-06 15:50:38.608   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f4fd2000 0x3f57bb000]
      05-06 15:50:38.674   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f57bb000 0x3f5fa4000]
      05-06 15:50:38.683   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f5fa4000 0x3f678d000]
      05-06 15:50:38.686   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f678d000 0x3f6f76000]
      05-06 15:50:38.700 10925 10976 E KernelCpuSpeedReader: Failed to read cpu-freq: /sys/devices/system/cpu/cpu1/cpufreq/stats/time_in_state: open failed: ENOENT (No such file or directory)
      05-06 15:50:38.892   186   190 E android.system.suspend@1.0-service: Error opening kernel wakelock stats for: wakeup32: Permission denied
      05-06 15:50:38.914 11228 11228 I Zygote  : Process 17657 exited due to signal 9 (Killed)
      05-06 15:50:39.016   186   190 E android.system.suspend@1.0-service: Error opening kernel wakelock stats for: wakeup33: Permission denied
      05-06 15:50:39.036 10925 10976 D KernelCpuUidUserSysTimeReader: Removing uids 99000-99000
      05-06 15:50:39.037 10925 10976 D KernelCpuUidUserSysTimeReader: Removing uids 99001-99001
      05-06 15:50:39.037 10925 10976 D KernelCpuUidUserSysTimeReader: Removing uids 99002-99002
      05-06 15:50:39.037 10925 10976 D KernelCpuUidUserSysTimeReader: Removing uids 99003-99003
      05-06 15:50:39.037 10925 10941 W Looper  : Slow dispatch took 124ms android.ui h=com.android.server.am.ActivityManagerService$UiHandler c=null m=53
      05-06 15:50:39.038 10925 14614 W ActivityManager: Unable to start service Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } U=0: not found
      05-06 15:50:39.038 10925 14614 W RemoteAppPredictionService: could not bind to Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } using flags 67108865
      05-06 15:50:39.152 12201 12201 I Choreographer: Skipped 37 frames!  The application may be doing too much work on its main thread.
      05-06 15:50:39.157 12201 12201 I bxmb    : onStart
      05-06 15:50:39.409 10925 12333 D ConnectivityService: requestNetwork for uid/pid:10107/12201 NetworkRequest [ TRACK_DEFAULT id=98, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ]
      05-06 15:50:39.410 10925 11040 D ConnectivityService: NetReassign [98 : null → 101]
      05-06 15:50:39.410 10925 11035 D UntrustedWifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=98, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:50:39.410 10925 11035 D WifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=98, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:50:39.410 11402 11402 D PhoneSwitcherNetworkRequstListener: got request NetworkRequest [ TRACK_DEFAULT id=98, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 15:50:39.516 12201 12201 I bvgd    : (REDACTED) [%s] onStart()
      05-06 15:50:39.519 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 15:50:39.520 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@f0ec808 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 15:50:39.521 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 15:50:39.521 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 15:50:39.524 12201 12201 E NetworkErrorMessage: (REDACTED) Invalid connectivity state: %s
      05-06 15:50:39.525 12201 12201 I bxmb    : onResume
      05-06 15:50:39.539 16154 16154 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.inappreach.service.START dat=chimera-action: cmp=com.google.android.gms/.chimera.GmsApiService }
      05-06 15:50:39.542 16154 16154 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.inappreach.service.START dat=chimera-action: cmp=com.google.android.gms/.chimera.GmsApiService }
      05-06 15:50:39.939 10925 10945 I Choreographer: Skipped 36 frames!  The application may be doing too much work on its main thread.
      05-06 15:50:40.046 10925 20106 I ActivityManager: Failure reporting to instrumentation watcher: comp=ComponentInfo{com.microsoft.maui.controls.devicetests/com.microsoft.maui.controls.devicetests.TestInstrumentation} results=Bundle[mParcelledData.dataSize=520]
      05-06 15:50:40.064 10885 10885 I Zygote  : Process 15933 exited due to signal 9 (Killed)
      05-06 15:50:40.065 10925 10943 W ActivityManager: setHasOverlayUi called on unknown pid: 15933
      05-06 15:50:40.067 10925 11879 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ TRACK_DEFAULT id=87, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10154 AdministratorUids: [] RequestorUid: 10154 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@4d4150d)
      05-06 15:50:40.067 10925 11040 D ConnectivityService: releasing NetworkRequest [ TRACK_DEFAULT id=87, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10154 AdministratorUids: [] RequestorUid: 10154 RequestorPackageName: com.microsoft.maui.controls.devicetests] ] (release request)
      05-06 15:50:40.074 10925 14614 D AutofillSession: handling death of Token{12cf4de ActivityRecord{c3f4668 u0 com.microsoft.maui.controls.devicetests/.TestActivity t-1 f}}} when saving=false
      05-06 15:50:40.075 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 10154 pid 15933 in 1631ms
      05-06 15:50:40.075 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 99004 pid 17657 in 0ms
      05-06 15:50:40.076 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 10123 pid 13915 in 0ms
      05-06 15:50:40.078 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 15:50:40.086 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@86dcba1 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 15:50:40.089 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 15:50:40.089 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 15:50:40.092 10925 12333 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ LISTEN id=88, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&FOREGROUND Uid: 10154 AdministratorUids: [] RequestorUid: 10154 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@1c51cc2)
      05-06 15:50:40.092 10925 12333 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ TRACK_DEFAULT id=95, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10154 AdministratorUids: [] RequestorUid: 10154 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@fbc8ad3)
      05-06 15:50:40.092 10925 11040 D ConnectivityService: releasing NetworkRequest [ TRACK_DEFAULT id=95, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10154 AdministratorUids: [] RequestorUid: 10154 RequestorPackageName: com.microsoft.maui.controls.devicetests] ] (release request)
      05-06 15:50:40.100 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 15:50:40.101 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@a50f1c6 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 15:50:40.104 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 15:50:40.104 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 15:50:38.704   186   186 W Binder:186_2: type=1400 audit(0.0:520): avc: denied { read } for name="wakeup32" dev="sysfs" ino=18322 scontext=u:r:system_suspend:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
      05-06 15:50:39.004   186   186 W Binder:186_2: type=1400 audit(0.0:521): avc: denied { read } for name="wakeup33" dev="sysfs" ino=18385 scontext=u:r:system_suspend:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
      05-06 15:50:42.988 13109 13109 W ThreadPoolForeg: type=1400 audit(0.0:522): avc: denied { write } for name="traced_producer" dev="tmpfs" ino=12312 scontext=u:r:gmscore_app:s0:c512,c768 tcontext=u:object_r:traced_producer_socket:s0 tclass=sock_file permissive=0 app=com.google.android.gms
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[40m�[32minfo�[39m�[22m�[49m: Successfully uninstalled com.microsoft.maui.controls.devicetests
XHarness exit code: 0
  Tests completed successfully

🟢 With fix — 📱 DatePickerTests: PASS ✅ · 1046s

(truncated to last 15,000 chars)

ChangeReporter: Compat change id reported: 149924527; UID 10156; state: ENABLED
      05-06 16:13:26.414 10925 11884 D CompatibilityChangeReporter: Compat change id reported: 132649864; UID 10156; state: DISABLED
      05-06 16:13:26.432 11859 20539 I MediaProvider: Using lower FS for /storage/emulated/0/Download/com.microsoft.maui.controls.devicetests/222ea5227f7c4809b27591104bc99db1/testResults.xml
      05-06 16:13:26.440 10925 11884 I ActivityManager: Force stopping com.microsoft.maui.controls.devicetests appid=10156 user=0: finished inst
      05-06 16:13:26.441 10925 11884 I ActivityManager: Killing 22743:com.microsoft.maui.controls.devicetests/u0a156 (adj 0): stop com.microsoft.maui.controls.devicetests due to finished inst
      05-06 16:13:26.444 10925 11884 W ActivityTaskManager: Force removing ActivityRecord{e2caafc u0 com.microsoft.maui.controls.devicetests/.TestActivity t13 f}}: app died, no saved state
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.453 10925 11884 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.454 10925 11884 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
      05-06 16:13:26.456 10925 11884 I ActivityManager: Killing 23463:com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:1/u0a156i8 (adj 0): isolated not needed
      05-06 16:13:26.459 10925 11884 I ActivityManager: Killing 22518:com.android.chrome/u0a120 (adj 985): empty #17
      05-06 16:13:26.509   298  5721 D goldfish-address-space: claimShared: Ask to claim region [0x3f4000000 0x3f47e9000]
      05-06 16:13:26.535   298  5721 D goldfish-address-space: claimShared: Ask to claim region [0x3f57bb000 0x3f5fa4000]
      05-06 16:13:26.539   298  5721 D goldfish-address-space: claimShared: Ask to claim region [0x3f5fa4000 0x3f678d000]
      05-06 16:13:26.591 10925 10941 W Looper  : Slow dispatch took 151ms android.ui h=com.android.server.am.ActivityManagerService$UiHandler c=null m=53
      05-06 16:13:26.642   298  5721 D goldfish-address-space: claimShared: Ask to claim region [0x3f678d000 0x3f6f76000]
      05-06 16:13:26.652   298   298 D goldfish-address-space: claimShared: Ask to claim region [0x3f6f76000 0x3f775f000]
      05-06 16:13:26.683   298  5721 D goldfish-address-space: claimShared: Ask to claim region [0x3f775f000 0x3f7f48000]
      05-06 16:13:26.857 10925 12327 W ActivityManager: Unable to start service Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } U=0: not found
      05-06 16:13:26.857 10925 12327 W RemoteAppPredictionService: could not bind to Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } using flags 67108865
      05-06 16:13:27.056 12201 12201 I Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.
      05-06 16:13:27.058 12201 12201 I bxmb    : onStart
      05-06 16:13:27.065 22731 22731 D AndroidRuntime: Shutting down VM
      05-06 16:13:27.074 10886 10886 I Zygote  : Process 22518 exited due to signal 9 (Killed)
      05-06 16:13:27.111 10925 11879 D ConnectivityService: requestNetwork for uid/pid:10107/12201 NetworkRequest [ TRACK_DEFAULT id=109, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ]
      05-06 16:13:27.119 10925 11040 D ConnectivityService: NetReassign [109 : null → 101]
      05-06 16:13:27.125 12201 12201 I bvgd    : (REDACTED) [%s] onStart()
      05-06 16:13:27.126 10925 11035 D UntrustedWifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=109, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 16:13:27.126 11402 11402 D PhoneSwitcherNetworkRequstListener: got request NetworkRequest [ TRACK_DEFAULT id=109, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 16:13:27.321 12201 12201 E NetworkErrorMessage: (REDACTED) Invalid connectivity state: %s
      05-06 16:13:27.321 12201 12201 I bxmb    : onResume
      05-06 16:13:27.323 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 16:13:27.323 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@f59faf2 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 16:13:27.443 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 16:13:27.443 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 16:13:27.466 10925 11035 D WifiNetworkFactory: got request NetworkRequest [ TRACK_DEFAULT id=109, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10107 AdministratorUids: [] RequestorUid: 10107 RequestorPackageName: com.google.android.googlequicksearchbox] ] with score 60 and providerId 3
      05-06 16:13:27.481 10925 10941 W Looper  : Slow dispatch took 407ms android.ui h=com.android.server.am.ActivityManagerService$UiHandler c=null m=53
      05-06 16:13:27.481 10925 10941 W Looper  : Slow delivery took 375ms android.ui h=com.android.server.wm.BarController$BarHandler c=com.android.server.wm.-$$Lambda$StatusBarController$1$3FiQ0kybPCSlgcNJkCsNm5M12iA@be922f m=0
      05-06 16:13:27.481 10925 10941 W Looper  : Drained
      05-06 16:13:27.564 10925 10976 E KernelCpuSpeedReader: Failed to read cpu-freq: /sys/devices/system/cpu/cpu1/cpufreq/stats/time_in_state: open failed: ENOENT (No such file or directory)
      05-06 16:13:27.581 11228 11228 I Zygote  : Process 23463 exited due to signal 9 (Killed)
      05-06 16:13:27.594   186   190 E android.system.suspend@1.0-service: Error opening kernel wakelock stats for: wakeup32: Permission denied
      05-06 16:13:27.624   186   190 E android.system.suspend@1.0-service: Error opening kernel wakelock stats for: wakeup33: Permission denied
      05-06 16:13:27.628 10925 10976 D KernelCpuUidUserSysTimeReader: Removing uids 99007-99007
      05-06 16:13:27.652 10925 10943 W ActivityManager: setHasOverlayUi called on unknown pid: 22743
      05-06 16:13:27.653 10925 12327 D AutofillSession: handling death of Token{d286fef ActivityRecord{e2caafc u0 com.microsoft.maui.controls.devicetests/.TestActivity t-1 f}}} when saving=false
      05-06 16:13:27.654 10925 12327 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ LISTEN id=106, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&FOREGROUND Uid: 10156 AdministratorUids: [] RequestorUid: 10156 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@cac224b)
      05-06 16:13:27.654 10925 12327 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ TRACK_DEFAULT id=105, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10156 AdministratorUids: [] RequestorUid: 10156 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@8bfa428)
      05-06 16:13:27.654 10925 11040 D ConnectivityService: releasing NetworkRequest [ TRACK_DEFAULT id=105, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10156 AdministratorUids: [] RequestorUid: 10156 RequestorPackageName: com.microsoft.maui.controls.devicetests] ] (release request)
      05-06 16:13:27.658 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 16:13:27.659 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@cf1c543 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 16:13:27.659 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 16:13:27.659 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 16:13:27.661 10925 12327 D ConnectivityService: ConnectivityService NetworkRequestInfo binderDied(NetworkRequest [ TRACK_DEFAULT id=108, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10156 AdministratorUids: [] RequestorUid: 10156 RequestorPackageName: com.microsoft.maui.controls.devicetests] ], android.os.BinderProxy@c8d4541)
      05-06 16:13:27.661 10925 11040 D ConnectivityService: releasing NetworkRequest [ TRACK_DEFAULT id=108, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 10156 AdministratorUids: [] RequestorUid: 10156 RequestorPackageName: com.microsoft.maui.controls.devicetests] ] (release request)
      05-06 16:13:27.664 11097 11097 V KeyguardUpdateMonitor: onSubscriptionInfoChanged()
      05-06 16:13:27.664 11097 11097 V KeyguardUpdateMonitor: SubInfo:{id=1 iccId=890141032[****] simSlotIndex=0 carrierId=1 displayName=T-Mobile carrierName=Android nameSource=3 iconTint=-16746133 number=[****] dataRoaming=0 iconBitmap=android.graphics.Bitmap@1dd97c0 mcc=310 mnc=260 countryIso=us isEmbedded=false nativeAccessRules=null cardString=890141032[****] cardId=-1 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=null hplmns=null subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
      05-06 16:13:27.665 11402 11402 D Telephony: isEmergencyPreferredAccount: subId=1, activeData=1
      05-06 16:13:27.665 11402 11402 D Telephony: isEmergencyPreferredAccount: Device does not require preference.
      05-06 16:13:27.674 10885 10885 I Zygote  : Process 22743 exited due to signal 9 (Killed)
      05-06 16:13:27.707 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 10156 pid 22743 in 1263ms
      05-06 16:13:27.708 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 99008 pid 23463 in 0ms
      05-06 16:13:27.709 10925 10967 I libprocessgroup: Successfully killed process cgroup uid 10120 pid 22518 in 0ms
      05-06 16:13:27.730 16154 16154 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.inappreach.service.START dat=chimera-action: cmp=com.google.android.gms/.chimera.GmsApiService }
      05-06 16:13:27.730 16154 16154 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.inappreach.service.START dat=chimera-action: cmp=com.google.android.gms/.chimera.GmsApiService }
      05-06 16:13:27.580   186   186 W Binder:186_2: type=1400 audit(0.0:670): avc: denied { read } for name="wakeup32" dev="sysfs" ino=18322 scontext=u:r:system_suspend:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
      05-06 16:13:27.616   186   186 W Binder:186_2: type=1400 audit(0.0:671): avc: denied { read } for name="wakeup33" dev="sysfs" ino=18385 scontext=u:r:system_suspend:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0
      05-06 16:13:29.476 16154 16154 W ThreadPoolForeg: type=1400 audit(0.0:672): avc: denied { write } for name="traced_producer" dev="tmpfs" ino=12312 scontext=u:r:gmscore_app:s0:c512,c768 tcontext=u:object_r:traced_producer_socket:s0 tclass=sock_file permissive=0 app=com.google.android.gms
      
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[40m�[32minfo�[39m�[22m�[49m: Successfully uninstalled com.microsoft.maui.controls.devicetests
XHarness exit code: 0
  Tests completed successfully

⚠️ Failure Details

  • DatePickerTests PASSED without fix (should fail) — tests don't catch the bug
  • DatePickerHandlerTests FAILED with fix (should pass)
📁 Fix files reverted (2 files)
  • eng/pipelines/ci-copilot.yml
  • src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs

🧪 UI Tests — Category Detection

Detected UI test categories: ViewBaseTests


🔍 Pre-Flight — Context & Validation

Pre-Flight: PR #34980

PR Summary

Title: [Android] Fix DatePicker dialog dismisses after the device is rotated
Author: HarishwaranVijayakumar
Branch: fix-datepickerdialogdismissmain
Labels: platform/android, community ✨, area-controls-datetimepicker, partner/syncfusion, s/agent-reviewed, s/agent-changes-requested, s/agent-fix-win
Fixes: #34973 — "[Android] [Regression] DatePicker dialog dismisses after the device is rotated"
Milestone: .NET 10 SR7

Issue Description

The DatePicker dialog on Android is unexpectedly dismissed when the device is rotated while the dialog is open. The TimePicker dialog does not exhibit this problem.

Root Cause Analysis (from PR)

PR #29323 introduced a DismissEvent subscription chain that caused a race condition during orientation changes:

  1. OnMainDisplayInfoChanged unsubscribed DismissEvent and called Dismiss() on the current dialog.
  2. ShowPickerDialog() ran synchronously after Dismiss(), entering the else branch and re-subscribing DismissEvent on the same dialog object.
  3. The DismissEvent from step 1 fired after the re-subscription in step 2.
  4. This triggered HidePickerDialog(), which dismissed the newly re-shown dialog.

Changed Files

  • src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs (8 additions, 12 deletions)
  • src/Core/tests/DeviceTests/Handlers/DatePicker/DatePickerHandlerTests.Android.cs (1 addition, 1 deletion — comment only)
  • src/Controls/tests/DeviceTests/Elements/DatePicker/DatePickerTests.cs (1 addition, 1 deletion — comment only)

PR Fix Summary

The PR makes the following changes to DatePickerHandler.Android.cs:

  1. Renames ResetDialog()DestroyDialog(): The new version correctly unsubscribes DismissEvent before calling Dismiss(), preventing any late-firing events from triggering OnDialogDismiss.
  2. Removes re-subscription of DismissEvent in ShowPickerDialog() else branch: Prevents double subscription.
  3. Removes unsubscription of DismissEvent in HidePickerDialog(): Now that the subscription lifecycle is managed solely in CreateDatePickerDialog() and DestroyDialog(), this is unnecessary.
  4. Fixes OnMainDisplayInfoChanged(): Instead of Dismiss() + reuse, it now captures currentDate, calls DestroyDialog() (full cleanup), then calls ShowPickerDialog(currentDate) to create a fresh dialog.

Key Code Observations

Current state after PR (in main branch)

void DestroyDialog()
{
    if (_dialog is not null)
    {
        _dialog.DismissEvent -= OnDialogDismiss;
        _dialog.Dismiss();
        _dialog = null;
    }
}

void OnMainDisplayInfoChanged(object? sender, DisplayInfoChangedEventArgs e)
{
    if (_dialog is not null && _dialog.IsShowing)
    {
        var currentDate = _dialog.DatePicker.DateTime;
        DestroyDialog();
        ShowPickerDialog(currentDate);
    }
}

Potential Concerns

  1. DestroyDialog() called on non-visible dialog: When called from MapMinimumDate/MapMaximumDate, the dialog may not be showing. Android's Dialog.dismiss() is documented to be safe in this state, but it could generate spurious lifecycle callbacks.
  2. VirtualView.IsOpen state after rotation: When OnMainDisplayInfoChanged calls DestroyDialog(), VirtualView.IsOpen stays true (correct, since we're recreating the dialog). However, the flow bypasses the MapIsOpen pathway, so the MAUI virtual view state is not explicitly synchronized.
  3. No new regression test: Test changes are comment-only. No automated test covers the rotation scenario. This is difficult to write as a device test (requires actual rotation), but a unit test simulating OnMainDisplayInfoChanged via reflection or internal access would be valuable.
  4. Comparison with TimePicker: TimePickerHandler.Android.cs always creates a fresh dialog in ShowPickerDialog() and doesn't have an OnMainDisplayInfoChanged handler. The DatePicker behavior diverges from TimePicker's simpler, always-recreate approach.

Gate Result

FAILED — tests did NOT behave as expected (gate already completed externally).

Testing Claimed

  • ✅ Android (manually tested by contributor)
  • ❌ Windows, iOS, Mac (not tested)

🔧 Fix — Analysis & Comparison

Try-Fix Aggregate Narrative — PR #34980

Overview

Four independent candidates were generated, each exploring the rotation-dismissal fix from a different dimension.


Candidate try-fix-1: Handler Lifecycle Alignment (TimePicker Pattern)

Dimension: Handler lifecycle & event subscription symmetry

Approach: Aligns DatePickerHandler with TimePickerHandler's proven always-fresh-dialog pattern:

  • Guards DestroyDialog() with if (_dialog.IsShowing) before calling Dismiss() — avoids dismissing non-visible dialogs from MapMinimumDate/MapMaximumDate
  • HidePickerDialog() unsubscribes DismissEvent + calls Hide() + nulls _dialog — eliminating the zombie dialog
  • ShowPickerDialog() always calls DestroyDialog() first then creates a fresh dialog — removes the complex ShowEvent/else branch entirely

Strengths: Simpler code, no zombie dialogs, consistent with TimePicker, removes deferred ShowEvent callback complexity.
Weaknesses: Still doesn't add null-check for VirtualView.IsOpen = false in HidePickerDialog(). IsOpen sync for min/max change not addressed.


Candidate try-fix-2: _suppressDismiss Flag + VirtualView Safety

Dimension: State management & VirtualView.IsOpen synchronization

Approach: Uses a _suppressDismiss boolean flag — a well-known Android dialog management pattern:

  • DestroyDialog() sets _suppressDismiss = true before Dismiss(), resets after (without unsubscribing)
  • OnDialogDismiss() returns early when _suppressDismiss is true
  • HidePickerDialog() guards VirtualView.IsOpen = false with null check
  • HidePickerDialog() guards _dialog.Hide() with IsShowing check

Strengths: Stable event subscription lifetime, fixes VirtualView null-ref, defensive against redundant Hide() call.
Weaknesses: Adds mutable boolean state with exception-safety risk, doesn't fix IsOpen divergence for min/max mappers, more cognitive overhead than unsubscribe approach.


Candidate try-fix-3: TimePicker Alignment — Always-Fresh + Remove Eager Dialog Creation

Dimension: Android platform patterns & TimePicker alignment

Approach: Most radical simplification — removes eager dialog creation from CreatePlatformView() entirely:

  • Removes _dialog = CreateDatePickerDialog(...) from CreatePlatformView()
  • ShowPickerDialog() always creates fresh (early-return if already showing)
  • HidePickerDialog() unsubscribes, hides, nulls _dialog
  • OnMainDisplayInfoChanged uses DestroyDialog() pattern

Strengths: Maximum alignment with TimePicker, removes zombie dialog entirely, removes ShowEvent complexity, simplest mental model.
Weaknesses: Behavioral change — removes pre-created dialog optimization. Min/max constraint behavior changes slightly (applied at show-time only). Still misses VirtualView null-check.


Candidate try-fix-4: Add Regression Test

Dimension: Missing test coverage

Approach: Adds a reflection-based device test that simulates device rotation via OnMainDisplayInfoChanged:

  1. Opens dialog via IsOpen = true
  2. Invokes private OnMainDisplayInfoChanged via reflection with synthetic DisplayInfoChangedEventArgs (Landscape orientation)
  3. Asserts VirtualView.IsOpen remains true, new dialog is showing, date is preserved

Strengths: Directly catches the pre-fix bug (old code would fail all assertions), catches future regressions in DestroyDialog + ShowPickerDialog path.
Weaknesses: This candidate changes only the test, not production code — it's best combined with another fix candidate.


Cross-Candidate Comparison

Dimension pr pr-plus-reviewer try-fix-1 try-fix-2 try-fix-3 try-fix-4
Fixes rotation bug ✅ (test)
VirtualView null check
IsOpen sync (min/max)
DestroyDialog IsShowing guard
ShowEvent closure fix N/A (removed) N/A (removed)
Regression test
Code simplification minor significant minor significant
Alignment with TimePicker partial partial full partial full

📋 Report — Final Recommendation

Phase 3 — Comparative Analysis Report: PR #34980

Candidates Evaluated

Candidate Description
pr Raw PR #34980 fix as submitted
pr-plus-reviewer PR fix + all expert reviewer major findings applied
try-fix-1 Handler lifecycle alignment (TimePicker always-fresh + IsShowing guard + HidePickerDialog nulls _dialog)
try-fix-2 _suppressDismiss flag + VirtualView null safety + IsShowing guard in HidePickerDialog
try-fix-3 TimePicker full alignment (remove eager dialog creation, always-fresh, HidePickerDialog nulls _dialog)
try-fix-4 Regression test addition via reflection-based OnMainDisplayInfoChanged simulation

Bug Summary

Issue #34973 — DatePicker dialog dismissed on Android device rotation.

Root cause: OnMainDisplayInfoChanged called currentDialog.Dismiss() directly, firing DismissEventOnDialogDismissHidePickerDialogVirtualView.IsOpen = false. The ShowPickerDialog call immediately after was undone because MapIsOpen(false) had already collapsed the newly-shown dialog. Additionally, the ShowPickerDialog else-branch re-subscribed DismissEvent on each reuse, causing double-subscription accumulation on repeated rotations.


Candidate-by-Candidate Analysis

pr (Raw PR fix)

Core fix: Correct. DestroyDialog() unsubscribes DismissEvent before calling Dismiss(), breaking the event chain. Rotation flow works correctly.

Issues remaining:

  • 🔴 VirtualView.IsOpen = false without null check in HidePickerDialog — NRE risk during handler disconnect while dialog is showing
  • 🔴 DestroyDialog() in min/max mappers silently kills a visible dialog without setting VirtualView.IsOpen = false — state divergence
  • 🔴 No regression test for the rotation scenario
  • 🟡 ShowEvent closure captures _dialog field reference with null-forgiving operator
  • 🟡 DestroyDialog() calls Dismiss() on dialogs that may never have been shown

Gate: ❌ FAILED

Verdict: Correct for the primary bug but has three unresolved major findings that block merge.


pr-plus-reviewer (PR + expert reviewer feedback)

Core fix: All of pr's rotation fix, plus:

  • VirtualView.IsOpen = false guarded with if (VirtualView is not null) — eliminates NRE
  • MapMinimumDate/MapMaximumDate: captures wasShowing before DestroyDialog(), sets VirtualView.IsOpen = false if dialog was visible — fixes state divergence
  • DestroyDialog(): if (_dialog.IsShowing) guard before Dismiss() — avoids spurious dismiss on never-shown dialogs
  • ShowEvent closure: captures capturedDialog local — eliminates null-forgiving and field-reference race
  • OnMainDisplayInfoChanged: adds clarifying comment

Issues remaining:

  • No regression test (difficult to add without device test infrastructure changes)
  • The ShowEvent/else-branch reuse pattern is still present (vs try-fix-1/try-fix-3's simpler approach)

Verdict: Most complete fix. Addresses all major/minor findings. Does not attempt radical simplification, keeping the diff minimal and reviewable.


try-fix-1 (Handler Lifecycle / TimePicker alignment)

Core fix: Rotation bug fixed. Additionally:

  • DestroyDialog() guards with if (_dialog.IsShowing) before Dismiss()
  • HidePickerDialog() unsubscribes DismissEvent + nulls _dialog — no zombie dialog
  • ShowPickerDialog() always calls DestroyDialog() first — removes ShowEvent/else complexity

Issues remaining:

  • 🔴 VirtualView.IsOpen = false still has no null check (missed in this candidate)
  • 🔴 IsOpen not synced when min/max mappers destroy dialog (same as pr)
  • 🔴 No regression test

Verdict: Good simplification but misses two major safety issues. More invasive diff than pr-plus-reviewer.


try-fix-2 (_suppressDismiss flag)

Core fix: Rotation bug fixed via flag-based suppression.

  • VirtualView.IsOpen = false guarded with null check
  • _dialog.Hide() guarded with IsShowing check
  • ❌ No IsShowing guard in DestroyDialog() before Dismiss()
  • ❌ IsOpen not synced in min/max mappers

Issues remaining:

  • Mutable _suppressDismiss boolean with exception-safety risk (no try/finally)
  • More cognitive overhead than unsubscribe approach
  • Does not address IsOpen divergence for min/max mappers
  • More complex without being more correct

Verdict: Adds correctness in one area (VirtualView null-check) but overall more complex than necessary. Dominated by pr-plus-reviewer.


try-fix-3 (Full TimePicker alignment)

Core fix: Most radical — removes eager dialog creation from CreatePlatformView().

  • ✅ Removes zombie dialogs entirely
  • ✅ Always-fresh dialog on each show
  • HidePickerDialog() nulls _dialog
  • ✅ Removes ShowEvent complexity
  • 🔴 VirtualView.IsOpen = false still no null check
  • 🔴 IsOpen not synced in min/max mappers
  • Behavioral change: lazy dialog creation means first-show allocates dialog (minor)

Verdict: Elegant simplification but changes behavior (lazy creation) and still misses two major safety issues. A good candidate for a follow-up cleanup PR, not the current bug fix.


try-fix-4 (Regression test only)

Core fix: No production code change. Adds a reflection-based device test that:

  • Simulates rotation via OnMainDisplayInfoChanged invocation
  • Asserts VirtualView.IsOpen remains true, dialog is non-null and showing, date preserved

Issues remaining:

  • Does not fix any of the major issues in pr
  • Best combined with another candidate, not standalone

Verdict: Excellent test design. The test is necessary but insufficient alone. Should be incorporated into whichever candidate wins.


Scoring Matrix

Criterion pr pr-plus-reviewer try-fix-1 try-fix-2 try-fix-3 try-fix-4
Fixes rotation bug ✅ (test)
VirtualView null safety
IsOpen sync (min/max)
DestroyDialog IsShowing guard
ShowEvent closure correctness N/A N/A
Regression test
Minimal diff / low risk
Code simplification minor significant minor significant

Winner: pr-plus-reviewer

Rationale:

pr-plus-reviewer is the only candidate that addresses all three major findings identified by the expert reviewer (VirtualView null safety, IsOpen state sync, and DestroyDialog IsShowing guard) while keeping the diff minimal and targeted. It extends the correct core rotation fix from the submitted PR without introducing new behavioral changes or refactoring risk.

The more radical candidates (try-fix-1, try-fix-3) are appealing for their simplicity but miss the VirtualView null safety issue and IsOpen state sync — both of which could cause real crashes or incorrect behavior in production. try-fix-2 adds the VirtualView fix but introduces a mutable flag with exception-safety concerns.

try-fix-4's regression test should be incorporated into whichever PR is merged, but the test design (reflection-based OnMainDisplayInfoChanged invocation) is valid and directly catches the pre-fix bug.

The gate failure (❌) is consistent with the VirtualView null check issue being triggered in test teardown while a dialog is showing — the pr-plus-reviewer null check directly addresses this.

Recommended next step: Author should apply the pr-plus-reviewer diff and add the regression test from try-fix-4.


Copy link
Copy Markdown
Collaborator

@MauiBot MauiBot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 6 findings

See inline comments for details.

if (datePicker.MinimumDate is not null)
{
platformHandler.ResetDialog();
platformHandler.DestroyDialog();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] State ManagementMapMinimumDate and MapMaximumDate call DestroyDialog() when a constraint is set (lines 110 and 128). DestroyDialog() unsubscribes DismissEvent before calling Dismiss(), which is correct for the rotation fix, but it means OnDialogDismissHidePickerDialog() never runs. So if the user has the picker open when MinimumDate/MaximumDate changes, the dialog disappears but VirtualView.IsOpen stays true. The picker cannot be reopened until IsOpen is reset externally. This was pre-existing in the old ResetDialog() but the rename to DestroyDialog() makes the omission more surprising.

Recommended fix — after destroying the dialog in both mappers, reset IsOpen if the dialog was previously shown:

if (datePicker.MinimumDate is not null)
{
    bool wasShowing = platformHandler._dialog?.IsShowing == true;
    platformHandler.DestroyDialog();
    if (wasShowing && platformHandler.VirtualView is not null)
        platformHandler.VirtualView.IsOpen = false;
}

ShowPickerDialog(currentDialog.DatePicker.DateTime);
var currentDate = _dialog.DatePicker.DateTime;
DestroyDialog();
ShowPickerDialog(currentDate);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] Regression Prevention — The PR fixes the rotation-dismissal bug but includes no device test that reproduces it. The fix should be accompanied by an Issue34973 UI test that:

  1. Opens the date picker
  2. Simulates a device rotation (via App.SetOrientationLandscape() / App.SetOrientationPortrait())
  3. Asserts the date picker is still visible after rotation
  4. Asserts VirtualView.IsOpen remains true

Without a regression test, any future refactoring of OnMainDisplayInfoChanged or DestroyDialog can silently re-introduce this bug. Related tests for the same handler (Issue33583, Issue19256) demonstrate the expected pattern.

@@ -212,7 +212,6 @@ void ShowPickerDialog(DateTime? date)
EventHandler? setDateLater = null;
setDateLater = (sender, e) => { _dialog!.UpdateDate(year, month, day); _dialog.ShowEvent -= setDateLater; };
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[minor] Code Quality — The ShowEvent closure on line 213 captures _dialog as a field reference and uses _dialog!.UpdateDate(...). The ! (null-forgiving) annotation is misleading: in this code path _dialog is provably non-null (we are in the else branch where _dialog is not null). More importantly, the closure's _dialog.ShowEvent -= setDateLater would unsubscribe from the WRONG dialog if DestroyDialog() + ShowPickerDialog is called between _dialog.ShowEvent += setDateLater (line 214) and _dialog.Show() (line 217) — though in practice this path is synchronous and the risk is theoretical.

Recommended fix — capture the dialog in a local to be explicit:

var dialog = _dialog;
EventHandler? setDateLater = null;
setDateLater = (sender, e) => { dialog.UpdateDate(year, month, day); dialog.ShowEvent -= setDateLater; };
dialog.ShowEvent += setDateLater;

}

void ResetDialog()
void DestroyDialog()
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[minor] Platform Code CorrectnessCreatePlatformView() (line 23) creates _dialog eagerly if VirtualView?.Date is not null. If DisconnectHandler is called before the user ever opens the picker, DestroyDialog() calls _dialog.Dismiss() on a dialog that was never shown. Android's Dialog.dismiss() checks an internal mShowing flag and returns early if false, so in practice this is a no-op and does not crash. However, the intent is confusing — Dismiss() is semantically a UI operation and should be guarded. Consider adding if (_dialog.IsShowing) before calling Dismiss():

void DestroyDialog()
{
    if (_dialog is not null)
    {
        _dialog.DismissEvent -= OnDialogDismiss;
        if (_dialog.IsShowing)
            _dialog.Dismiss();
        _dialog = null;
    }
}

@@ -236,13 +234,11 @@ void OnDialogDismiss(object? sender, EventArgs e)

void OnMainDisplayInfoChanged(object? sender, DisplayInfoChangedEventArgs e)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] Edge CaseOnMainDisplayInfoChanged only acts when _dialog is not null && _dialog.IsShowing. If the dialog was opened, then the user hid it (e.g., IsOpen = false set programmatically), and then the device is rotated, _dialog is non-null but not showing, so no action is taken. This is correct behavior — the dialog is not visible so there is nothing to reconstruct. Worth adding a brief code comment to make the intent explicit: // Only reconstruct if currently visible; a hidden dialog will be re-created fresh on next Show.

@MauiBot MauiBot added s/agent-review-incomplete AI agent could not complete all phases (blocker, timeout, error) and removed s/agent-changes-requested AI agent recommends changes - found a better alternative or issues labels May 6, 2026
Copy link
Copy Markdown
Contributor

@kubaflo kubaflo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please check the ai's suggestions?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-controls-datetimepicker DatePicker, TimePicker community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/android s/agent-fix-win AI found a better alternative fix than the PR s/agent-review-incomplete AI agent could not complete all phases (blocker, timeout, error) 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.

[Android] [Regression] DatePicker dialog dismisses after the device is rotated

6 participants