[Android] Fix DatePicker dialog dismisses after the device is rotated#34980
[Android] Fix DatePicker dialog dismisses after the device is rotated#34980HarishwaranVijayakumar wants to merge 3 commits intodotnet:mainfrom
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34980Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34980" |
|
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. |
There was a problem hiding this comment.
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()toDestroyDialog()and updated call sites to better reflect behavior (dismiss + null-out). - Simplified
DismissEventwiring by removing per-show/per-hide subscribe/unsubscribe and keeping it scoped to dialog creation/destruction. - Updated
OnMainDisplayInfoChangedto capture the currently selected date, destroy the existing dialog, and recreate/show a new dialog with the captured date.
|
/azp run maui-pr-uitests , maui-pr-devicetests |
|
Azure Pipelines successfully started running 2 pipeline(s). |
…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>
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 3 findings
See inline comments for details.
MauiBot
left a comment
There was a problem hiding this comment.
🤖 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
left a comment
There was a problem hiding this comment.
🤖 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
🤖 AI Summary
📊 Review Session —
|
| 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.ymlsrc/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-datepickerdialogdismiss → main
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:
OnMainDisplayInfoChangedunsubscribedDismissEventand calledDismiss()on the current dialog.ShowPickerDialog()ran synchronously afterDismiss(), entering theelsebranch and re-subscribingDismissEventon the same dialog object.- The
DismissEventfrom step 1 fired after the re-subscription in step 2. - 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:
- Renames
ResetDialog()→DestroyDialog(): The new version correctly unsubscribesDismissEventbefore callingDismiss(), preventing any late-firing events from triggeringOnDialogDismiss. - Removes re-subscription of
DismissEventinShowPickerDialog()else branch: Prevents double subscription. - Removes unsubscription of
DismissEventinHidePickerDialog(): Now that the subscription lifecycle is managed solely inCreateDatePickerDialog()andDestroyDialog(), this is unnecessary. - Fixes
OnMainDisplayInfoChanged(): Instead ofDismiss()+ reuse, it now capturescurrentDate, callsDestroyDialog()(full cleanup), then callsShowPickerDialog(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
DestroyDialog()called on non-visible dialog: When called fromMapMinimumDate/MapMaximumDate, the dialog may not be showing. Android'sDialog.dismiss()is documented to be safe in this state, but it could generate spurious lifecycle callbacks.VirtualView.IsOpenstate after rotation: WhenOnMainDisplayInfoChangedcallsDestroyDialog(),VirtualView.IsOpenstaystrue(correct, since we're recreating the dialog). However, the flow bypasses theMapIsOpenpathway, so the MAUI virtual view state is not explicitly synchronized.- 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
OnMainDisplayInfoChangedvia reflection orinternalaccess would be valuable. - Comparison with
TimePicker:TimePickerHandler.Android.csalways creates a fresh dialog inShowPickerDialog()and doesn't have anOnMainDisplayInfoChangedhandler. TheDatePickerbehavior diverges fromTimePicker'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()withif (_dialog.IsShowing)before callingDismiss()— avoids dismissing non-visible dialogs fromMapMinimumDate/MapMaximumDate HidePickerDialog()unsubscribesDismissEvent+ callsHide()+ nulls_dialog— eliminating the zombie dialogShowPickerDialog()always callsDestroyDialog()first then creates a fresh dialog — removes the complexShowEvent/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 = truebeforeDismiss(), resets after (without unsubscribing)OnDialogDismiss()returns early when_suppressDismissis trueHidePickerDialog()guardsVirtualView.IsOpen = falsewith null checkHidePickerDialog()guards_dialog.Hide()withIsShowingcheck
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(...)fromCreatePlatformView() ShowPickerDialog()always creates fresh (early-return if already showing)HidePickerDialog()unsubscribes, hides, nulls_dialogOnMainDisplayInfoChangedusesDestroyDialog()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:
- Opens dialog via
IsOpen = true - Invokes private
OnMainDisplayInfoChangedvia reflection with syntheticDisplayInfoChangedEventArgs(Landscape orientation) - Asserts
VirtualView.IsOpenremainstrue, 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 DismissEvent → OnDialogDismiss → HidePickerDialog → VirtualView.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 = falsewithout null check inHidePickerDialog— NRE risk during handler disconnect while dialog is showing - 🔴
DestroyDialog()in min/max mappers silently kills a visible dialog without settingVirtualView.IsOpen = false— state divergence - 🔴 No regression test for the rotation scenario
- 🟡
ShowEventclosure captures_dialogfield reference with null-forgiving operator - 🟡
DestroyDialog()callsDismiss()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 = falseguarded withif (VirtualView is not null)— eliminates NRE - ✅
MapMinimumDate/MapMaximumDate: captureswasShowingbeforeDestroyDialog(), setsVirtualView.IsOpen = falseif dialog was visible — fixes state divergence - ✅
DestroyDialog():if (_dialog.IsShowing)guard beforeDismiss()— avoids spurious dismiss on never-shown dialogs - ✅
ShowEventclosure: capturescapturedDialoglocal — 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 withif (_dialog.IsShowing)beforeDismiss() - ✅
HidePickerDialog()unsubscribesDismissEvent+ nulls_dialog— no zombie dialog - ✅
ShowPickerDialog()always callsDestroyDialog()first — removes ShowEvent/else complexity
Issues remaining:
- 🔴
VirtualView.IsOpen = falsestill 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 = falseguarded with null check - ✅
_dialog.Hide()guarded withIsShowingcheck - ❌ No IsShowing guard in
DestroyDialog()beforeDismiss() - ❌ IsOpen not synced in min/max mappers
Issues remaining:
- Mutable
_suppressDismissboolean 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 = falsestill 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
OnMainDisplayInfoChangedinvocation - Asserts
VirtualView.IsOpenremainstrue, 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.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 6 findings
See inline comments for details.
| if (datePicker.MinimumDate is not null) | ||
| { | ||
| platformHandler.ResetDialog(); | ||
| platformHandler.DestroyDialog(); |
There was a problem hiding this comment.
[major] State Management — MapMinimumDate 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 OnDialogDismiss → HidePickerDialog() 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); |
There was a problem hiding this comment.
[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:
- Opens the date picker
- Simulates a device rotation (via
App.SetOrientationLandscape()/App.SetOrientationPortrait()) - Asserts the date picker is still visible after rotation
- Asserts
VirtualView.IsOpenremainstrue
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; }; | |||
There was a problem hiding this comment.
[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() |
There was a problem hiding this comment.
[minor] Platform Code Correctness — CreatePlatformView() (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) | |||
There was a problem hiding this comment.
[nit] Edge Case — OnMainDisplayInfoChanged 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.
kubaflo
left a comment
There was a problem hiding this comment.
Could you please check the ai's suggestions?
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
Root Cause of the issue
Description of Change
Dialog lifecycle and event handling improvements:
ResetDialog()toDestroyDialog()and updated all references accordingly to clarify its purpose and ensure consistent dialog destruction and recreation.DismissEvent, simplifying dialog event handling in bothShowPickerDialog()andHidePickerDialog().Display info change handling:
OnMainDisplayInfoChangedto 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
Before_fixdatepicker.mov
After_fixdatepicker.mov