Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom#29028
Conversation
There was a problem hiding this comment.
Pull Request Overview
This PR addresses the issue of the Shell flyout not displaying on Android when FlyoutWidth is specified only for Desktop by ensuring a proper default value is retrieved via the OnIdiomExtension. Key changes include:
- Adding a test case in TestCases.Shared.Tests to verify the flyout displays correctly.
- Creating corresponding host app UI pages in TestCases.HostApp.
- Updating the OnIdiomExtension to retrieve the default value from the bindable property when no explicit value is provided.
Reviewed Changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue13243.cs | Added a new automated UITest verifying the flyout behavior. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue13243.xaml.cs | Introduced new UI pages to support the test for the flyout issue. |
| src/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cs | Modified null handling to retrieve the default value from the bindable property. |
Files not reviewed (1)
- src/Controls/tests/TestCases.HostApp/Issues/Issue13243.xaml: Language not supported
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
cc5d1b2 to
3392127
Compare
3392127 to
de80c65
Compare
|
@StephaneDelcroix @simonrozsival Could you please review? |
🚦 Gate — Test Before and After Fix
🚦 Gate Session —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue13243 Issue13243 |
✅ FAIL — 793s | ✅ PASS — 1305s |
🔴 Without fix — 🖥️ Issue13243: FAIL ✅ · 793s
Determining projects to restore...
Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 6.33 sec).
Restored /home/vsts/work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 6.26 sec).
Restored /home/vsts/work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 168 ms).
Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 8 ms).
Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 14 ms).
Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 48 ms).
Restored /home/vsts/work/1/s/src/Core/maps/src/Maps.csproj (in 27 ms).
Restored /home/vsts/work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 1.32 sec).
Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 33 ms).
Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 1.11 sec).
1 of 11 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:08:39.77
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 1.07 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 851 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 8 ms).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 1.43 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 2.59 sec).
Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 9.39 sec).
Restored /home/vsts/work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 9 ms).
Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 3.2 sec).
5 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.18] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.54] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/18/2026 13:48:01 FixtureSetup for Issue13243(Android)
>>>>> 04/18/2026 13:48:05 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Start
>>>>> 04/18/2026 13:48:24 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Stop
>>>>> 04/18/2026 13:48:24 Log types: logcat, bugreport, server
Failed ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue [20 s]
Error Message:
System.TimeoutException : Timed out waiting for element...
Stack Trace:
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.Issues.Issue13243.ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue13243.cs:line 20
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
NUnit Adapter 4.5.0.0: Test execution complete
Total tests: 1
Failed: 1
Test Run Failed.
Total time: 1.4385 Minutes
🟢 With fix — 🖥️ Issue13243: PASS ✅ · 1305s
(truncated to last 15,000 chars)
ostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
Build FAILED.
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: Mono.AndroidTools.InstallFailedException: Unexpected install output: cmd: Failure calling service package: Broken pipe (32) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass105_0.<InstallPackage>b__0(Task`1 t) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
0 Warning(s)
1 Error(s)
Time Elapsed 00:10:48.69
* daemon not running; starting now at tcp:5037
* daemon started successfully
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:08:41.56
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.13876742
Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12] Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.30] Discovered: Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 04/18/2026 14:10:04 FixtureSetup for Issue13243(Android)
>>>>> 04/18/2026 14:10:08 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Start
>>>>> 04/18/2026 14:10:11 ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue Stop
Passed ShouldDisplayFlyoutWhenOnIdiomHasNoDefaultValue [3 s]
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 24.3115 Seconds
📁 Fix files reverted (1 files)
src/Controls/src/Xaml/MarkupExtensions/OnIdiomExtension.cs
🤖 AI Summary
📊 Review Session —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #29028 | Call bp.GetDefaultValue(targetObject as BindableObject) when idiom doesn't match; return null for Setter targets |
✅ PASSED (Gate) | OnIdiomExtension.cs + 3 test files |
Mirrors OnPlatformExtension pattern |
🔬 Code Review — Deep Analysis
Code Review — PR #29028
Independent Assessment
What this changes: OnIdiomExtension.ProvideValue expands the null-value branch (when no idiom-specific value is set and no Default is specified). Previously it returned Activator.CreateInstance(propertyType) (the zero-value) for any value-type property. The new code, when a BindableProperty is in play, branches on the target type: returns null for a Setter target; returns bp.GetDefaultValue(targetObject as BindableObject) otherwise. The old Activator.CreateInstance fallback is kept for non-BindableProperty value types.
Inferred motivation: A double BindableProperty like Shell.FlyoutWidthProperty has a non-zero default (-1.0, the sentinel for "auto-width"). When {OnIdiom Desktop=150} is used without a Default on Android (idiom is Phone or Tablet, not Desktop), GetValue() returns null. The old code set FlyoutWidth = 0.0, making the flyout invisible. The fix returns the property's actual registered default value (-1.0), restoring correct behavior.
Reconciliation with PR Narrative
Author claims: Retrieving the default value from the BindableProperty and handling the Setter target case when the value is null; references the same pattern in OnPlatformExtension.
Agreement: ✅ The root cause analysis is correct. Activator.CreateInstance(typeof(double)) = 0.0 ≠ FlyoutWidthProperty.DefaultValue = -1.0. The fix exactly mirrors the pattern already established in OnPlatformExtension.cs (lines 115–120). The diff is functionally a port of that logic.
Findings
⚠️ Warning — Failing CI check: maui-pr (Build .NET MAUI Build macOS (Release))
gh pr checks 29028 shows maui-pr (Build .NET MAUI Build macOS (Release)) as fail while macOS Debug passed. The fix is pure C# with no platform-specific code, so this is likely an infra flake. The author should confirm it's not caused by the PR before merging.
The failing UI test jobs (Entry, WebView, CollectionView2, SafeAreaEdges, ScrollView, Cells/CheckBox) are in categories completely orthogonal to this change and appear to be pre-existing flakes unrelated to Shell/OnIdiom.
💡 Suggestion — Missing newline at end of two new test files
Both Issue13243.xaml and Issue13243.cs (test file) end with \ No newline at end of file. Minor inconsistency with the rest of the repo.
💡 Suggestion — No XAML unit test for the core BindableProperty default-value path
The behavioral change in OnIdiomExtension.cs is untested at the unit-test level. A test in src/Controls/tests/Xaml.UnitTests/Issues/ that mocks an idiom and asserts a double BindableProperty with a non-zero default returns the correct value (not 0.0) when the idiom doesn't match would provide a faster, more reliable regression guard.
Devil's Advocate
"Is bp.GetDefaultValue(targetObject as BindableObject) safe here?" Yes. TargetObject is the partially-inflated XAML object (e.g., the Shell instance), which is a BindableObject. FlyoutWidthProperty uses a static default (-1d), not a DefaultValueCreator, so there's no concern about calling a creator on a partially-constructed object. This exact pattern is already in production in OnPlatformExtension.
"Could this regress the existing Maui24500 test?" No. Maui24500.xaml uses {OnIdiom Default={Binding EditingMode}, Phone=False} — GetValue() returns a non-null value for both Phone and Desktop idioms, so the new null-branch code is never entered.
"Does returning null for a Setter target break style sheets?" No — this matches OnPlatformExtension's established pattern. A Setter that resolves to null means "don't override", which is correct when no idiom matches.
Verdict: NEEDS_DISCUSSION
Confidence: high
Summary: The fix is correct, well-scoped, and directly mirrors the identical pattern in OnPlatformExtension. The code change itself is ready. The main open question is the failing maui-pr (Build .NET MAUI Build macOS (Release)) CI check — the author should verify it is a pre-existing infra flake before merge. A XAML unit test would provide a more durable regression guard than the UI test alone, but is not a blocker.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (claude-opus-4.6) | Use bindable.GetValue(bp) to read effective current value from target BindableObject |
✅ PASS | OnIdiomExtension.cs |
Goes through full value pipeline; handles styles/triggers |
| 2 | try-fix (claude-sonnet-4.6) | s_notset sentinel pattern — init all properties to sentinel, replace GetValue() with TryGetValue(); mirrors OnPlatformExtension exactly |
✅ PASS | OnIdiomExtension.cs |
Most complete redesign; eliminates null-vs-notset ambiguity |
| 3 | try-fix (gpt-5.3-codex) | Pre-compute fallbackValue = bp.GetDefaultValue(...) before calling GetValue(fallbackValue) which uses it via ?? chain |
✅ PASS | OnIdiomExtension.cs |
Fixes both null idiom and null Default simultaneously |
| 4 | try-fix (gpt-5.4) | Use bp.DefaultValue static property (no method, no arg) as fallback — skips DefaultValueCreator |
✅ PASS | OnIdiomExtension.cs |
Simpler but ignores instance-specific DefaultValueCreator |
| PR | PR #29028 | Call bp.GetDefaultValue(targetObject as BindableObject) when idiom doesn't match; return null for Setter targets |
✅ PASSED (Gate) | OnIdiomExtension.cs + 3 test files |
Mirrors OnPlatformExtension pattern; handles DefaultValueCreator |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | No | Solution space exhausted across all key dimensions |
Exhausted: Yes
Selected Fix: PR #29028 fix — Reason: The PR's bp.GetDefaultValue(targetObject as BindableObject) is the strongest approach because it (1) exactly mirrors the proven OnPlatformExtension pattern in production, (2) handles both static DefaultValue and DefaultValueCreator delegates with instance context (unlike Attempt 4 which only uses bp.DefaultValue), (3) is the smallest diff (surgical change in null branch only), and (4) has already passed Gate testing. Attempts 1-4 all passed, but the PR's approach is the most semantically correct and maintainable.
📋 Report — Final Recommendation
✅ Final Recommendation: APPROVE
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | Issue #13243 context gathered; 1 impl file + 3 test files classified |
| Code Review | NEEDS_DISCUSSION (high) | 0 errors, 1 warning (CI flake), 2 suggestions |
| Gate | ✅ PASSED | Android — test fails without fix, passes with fix |
| Try-Fix | ✅ COMPLETE | 4 attempts, 4 passing |
| Report | ✅ COMPLETE |
Code Review Impact on Try-Fix
Code review found no ❌ Errors — no hard gates triggered. The one Activator.CreateInstance(double) = 0.0 vs. the registered default of -1.0 directly confirmed the root cause hypothesis and guided all 4 try-fix models toward the correct fix location. All 4 models converged independently on the same structural fix (return the BindableProperty's registered default rather than 0.0), reinforcing confidence in the approach.
Summary
PR #29028 fixes a real bug in OnIdiomExtension.ProvideValue: when no idiom-specific value is set and no Default is provided, the old code returned Activator.CreateInstance(propertyType) — which is 0.0 for double — instead of the BindableProperty's registered default (-1.0 for FlyoutWidthProperty). The fix correctly calls bp.GetDefaultValue(targetObject as BindableObject), mirroring the identical pattern already in OnPlatformExtension. Gate testing confirmed the fix works on Android. Four independent try-fix models all passed with similar approaches, confirming the fix direction is sound. Code review verdict was NEEDS_DISCUSSION (not NEEDS_CHANGES) — no errors found.
Root Cause
Shell.FlyoutWidthProperty is registered with a default value of -1.0 (sentinel for "use platform auto-width"). When {OnIdiom Desktop=150} is used and the running platform is Android (idiom = Phone), GetValue() returns null (no Phone or Default is set). The old code path if (value == null && propertyType.IsValueType) return Activator.CreateInstance(propertyType) returned 0.0 for double, overwriting the -1.0 default and causing the flyout to render with zero width — making it invisible.
Fix Quality
The fix is correct, minimal, and well-aligned with codebase conventions. Specifically:
- Correctness: Returns the property's registered default (
-1.0) instead of a zero-initialized value type (0.0), resolving the invisible flyout. - Pattern consistency: Mirrors
OnPlatformExtension.cslines 115–120 exactly — this exact pattern is already in production. - Scope: Single file change in implementation; test files are well-structured (XAML + code-behind + NUnit test with Shell category).
- Minor gaps: Missing newline at EOF in two test files (cosmetic); no XAML unit test for the core path (the UI test is sufficient for merge, but a unit test would add durable regression protection).
- Try-Fix comparison: PR's fix (
bp.GetDefaultValue(targetObject as BindableObject)) was selected as best — it handles bothDefaultValueandDefaultValueCreatordelegates (unlike Attempt 4'sbp.DefaultValue), is more minimal than Attempt 2's full sentinel redesign, and is semantically cleaner than Attempt 3's parameter-passing approach.
…r Desktop via OnIdiom (#29028) ### Issue Details The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom. ### Root Cause The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform. ### Description of Changes Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom. ### Reference https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74 ### Issues Fixed Fixes #13243 Validated the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Android |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89" >| <video src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28" >| iOS |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d" >| <video src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
…r Desktop via OnIdiom (#29028) ### Issue Details The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom. ### Root Cause The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform. ### Description of Changes Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom. ### Reference https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74 ### Issues Fixed Fixes #13243 Validated the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Android |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89" >| <video src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28" >| iOS |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d" >| <video src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
…r Desktop via OnIdiom (#29028) ### Issue Details The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom. ### Root Cause The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform. ### Description of Changes Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom. ### Reference https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74 ### Issues Fixed Fixes #13243 Validated the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Android |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89" >| <video src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28" >| iOS |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d" >| <video src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
…r Desktop via OnIdiom (#29028) ### Issue Details The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom. ### Root Cause The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform. ### Description of Changes Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom. ### Reference https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74 ### Issues Fixed Fixes #13243 Validated the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Android |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/b24347f6-8f56-4fa7-b8c1-d29778711b89" >| <video src="https://github.com/user-attachments/assets/6cc923eb-072c-468d-bf9b-c7dfc74c8a28" >| iOS |Before|After| |--|--| | <video src="https://github.com/user-attachments/assets/dd861cc8-b80f-4af7-b581-cb50889b553d" >| <video src="https://github.com/user-attachments/assets/78966ebb-6f4e-4500-b414-5072c7305813">|
Issue Details
The Shell flyout is not displayed due to the absence of a specified FlyoutWidth value for the current idiom, and no default value is provided in the OnIdiom.
Root Cause
The FlyoutWidth property returns a value of 0 instead of its default value (-1) from the OnIdiom extension when FlyoutWidth is set only for the Desktop idiom and no default value is provided. As a result, the flyout is not displayed when the application is run on the Android platform.
Description of Changes
Retrieved the default value using the GetDefaultValue method from the bindable property and handled the target setter case in the OnIdiomExtension when the value is null due to the absence of a specified value for the current idiom.
Reference
https://github.com/NanthiniMahalingam/maui/blob/35ee660a3219f11cd391fcc838c23c6c5fcad10b/src/Controls/src/Xaml/MarkupExtensions/OnPlatformExtension.cs#L74
Issues Fixed
Fixes #13243
Validated the behaviour in the following platforms
Output
Android
Before_Android.mov
After_Android.mov
iOS
Before_iOS.mp4
After_iOS.mp4