[Android] Implemented Material3 support for Picker#33668
[Android] Implemented Material3 support for Picker#33668jfversluis merged 10 commits intodotnet:inflight/currentfrom
Conversation
|
Hey there @@SyedAbdulAzeemSF4852! 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
This PR implements Material 3 support for the Android Picker control by introducing a new internal handler (PickerHandler2) that uses Material 3-styled components. The implementation is backward compatible and only activates when the Material 3 feature flag is enabled.
Changes:
- Introduced
PickerHandler2for Material 3 support with proper dialog theming and event handling - Created
MauiMaterialPickerandMauiMaterialPickerBaseclasses extendingTextInputEditTextfor Material 3 styling - Added Material 3-specific extension methods in
PickerExtensions.csfor picker updates - Updated handler registration logic to conditionally use
PickerHandler2when Material 3 is enabled on Android
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
src/Core/src/Platform/Android/PickerExtensions.cs |
Adds extension methods for MauiMaterialPicker to handle title, title color, selected index, and flow direction updates for Material 3 |
src/Core/src/Platform/Android/Material3Controls/MauiMaterialPicker.cs |
Implements MauiMaterialPicker and MauiMaterialPickerBase classes using TextInputEditText with Material 3 theming and proper disposal |
src/Core/src/Handlers/Picker/PickerHandler2.Android.cs |
Implements Material 3-specific picker handler with dialog creation, property mappings, and event handling |
src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs |
Updates handler registration to conditionally use PickerHandler2 when Material 3 is enabled on Android |
PR Review SummaryThe pr agent has completed its analysis of PR #33668 - [Android] Implemented Material3 support for Picker: Status: IN PROGRESS (Gate Phase)The PR implements Material 3 support for the Picker control on Android. Here's what's been completed: ✅ Pre-Flight Phase - COMPLETE
✅ Tests Phase - COMPLETE
🚧 Gate Phase - IN PROGRESS
Code Review FindingsTwo concerns identified by Copilot reviewer:
Next StepsThe full review report is available at |
🤖 AI Summary📊 Expand Full Review🔍 Pre-Flight — Context & Validation📝 Review Session — Introduced a common base method for Material 2 and Material 3; cleaned up pragma warnings ·
|
| File | Changes | Type |
|---|---|---|
src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs |
+12 -1 | Handler registration |
src/Core/src/Handlers/Picker/PickerHandler.Android.cs |
+0 -2 | Remove internal modifier? |
src/Core/src/Handlers/Picker/PickerHandler2.Android.cs |
+275 -0 | New Material3 handler |
src/Core/src/Platform/Android/Material3Controls/MauiMaterialPicker.cs |
+41 -0 | New Material3 view |
src/Core/src/Platform/Android/PickerExtensions.cs |
+66 -11 | Extended extensions |
No test files in PR.
Key Technical Approach
- New
PickerHandler2(internal, to be public in .NET 11) handling Material 3 Picker MauiMaterialPickerextendsTextInputEditTextwith Material 3 theming viaMauiMaterialContextThemeWrapper- Handler registration logic in
AppHostBuilderExtensions.csselectsPickerHandler2whenRuntimeFeature.IsMaterial3Enabled - Extension methods refactored to use shared
UpdatePickerCore/UpdateTitleColorCore/UpdateFlowDirectionCorehelpers
Code Review Findings (Copilot inline review)
| File:Line | Issue | Status |
|---|---|---|
PickerHandler2.Android.cs:195 |
Missing #pragma warning disable CA1416 for ForegroundColorSpan usage (original PickerHandler has INVESTIGATE |
this) |
PickerExtensions.cs:130 |
Code duplication between MauiPicker and MauiMaterialPicker extension NOTE | methods |
Prior Agent Review
A prior agent run (by rmarinho) is present in PR comments. The prior review stated tests were "created" but they are NOT present in the PR diff.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33668 | New PickerHandler2 + MauiMaterialPicker with Material3 theming, registered via RuntimeFeature. PENDING (Gate) | 5 files (+390/-14) | Original PR | IsMaterial3Enabled |
🚦 Gate — Test Verification
📝 Review Session — Introduced a common base method for Material 2 and Material 3; cleaned up pragma warnings · 238a688
** FAILEDResult:**
Platform: android
Mode: Test Existence Check
Test Status
No UI tests found in the PR or in the repository for issue #33665 or #33668.
gh pr diff 33668shows no test files (noTestCases.HostApporTestCases.Shared.Testsfiles)find src/Controls/tests -name "*33665*" -o -name "*33668*"found nothing
Why Gate Failed
The PR does not include any tests to verify the Material 3 Picker behavior works correctly.
Tests are required to:
- Verify the Picker opens with Material 3 styling when Material 3 is enabled
- Verify item selection works correctly with the new handler
- Verify title and title color update correctly
Prior Agent Note
A prior agent review comment on the PR mentioned tests were "created" but they are not present in the current PR diff. The tests may have been described but never committed/pushed to the PR branch.
🔧 Fix — Analysis & Comparison
📝 Review Session — Introduced a common base method for Material 2 and Material 3; cleaned up pragma warnings · 238a688
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33668 | New PickerHandler2 + MauiMaterialPicker with Material3 SKIPPED (Gate failed) | 5 files | Original PR | theming |
Exhausted: N/ Fix phase skipped because Gate failed (no tests in PR)A
Selected Fix: N/A
📋 Report — Final Recommendation
📝 Review Session — Introduced a common base method for Material 2 and Material 3; cleaned up pragma warnings · 238a688
Final Recommendation: REQUEST CHANGES##
Summary
PR #33668 implements Material 3 support for the Picker control on Android by introducing a new PickerHandler2 (internal, targeted for .NET 11 public API) that uses MauiMaterialPicker (extends TextInputEditText) and MaterialAlertDialogBuilder for proper Material 3 dialog theming. Handler registration in AppHostBuilderExtensions.cs correctly gates on RuntimeFeature.IsMaterial3Enabled.
The implementation approach is sound and follows established patterns (e.g., MauiMaterialButton, MauiMaterialContextThemeWrapper). However, the PR is missing tests and has a code quality issue that needs addressing.
Root Cause
Issue #33665: When UseMaterial3 is enabled, the Picker used the legacy PickerHandler with MauiPicker (AppCompatEditText-based), which doesn't apply Material 3 theming for either the input field or the selection dialog.
Gate No tests in PRFAILED Result:
The PR does not include any UI tests to verify Material 3 Picker functionality. Tests are required before merge.
Code Quality Issues
File: src/Core/src/Handlers/Picker/PickerHandler2.Android.cs:194#### 1.
The original PickerHandler.Android.cs suppresses CA1416 around ForegroundColorSpan usage with a documented reason (dotnet/android#6962). The same suppression is missing in PickerHandler2:
// Missing in PickerHandler2.Android.cs
#pragma warning disable CA1416 // ForegroundColorSpan platform-specific warning
var title = new SpannableString(VirtualView.Title ?? string.Empty);
title.SetSpan(new ForegroundColorSpan(VirtualView.TitleColor.ToPlatform()), 0, title.Length(), SpanTypes.ExclusiveExclusive);
builder.SetTitle(title);
#pragma warning restore CA1416Extension methods for MauiMaterialPicker largely duplicate those for MauiPicker. The PR has partially addressed this by extracting shared UpdatePickerCore, UpdateTitleColorCore, and UpdateFlowDirectionCore helpers on AppCompatEditText / AppCompatAlertDialog. The remaining overloads are thin wrappers that correctly delegate to these this is acceptable for type safety, but could be noted in a code comment.helpers #### 2.
MauiMaterialPicker calls PickerManager.Init(this), which sets InputType = InputTypes.Null and KeyListener = null. Meanwhile, MauiMaterialPickerBase overrides DefaultMovementMethod to return null to disable cursor movement. Both are necessary for the "read-only text field" behavior. However, PickerManager.Init also sets FocusableInTouchMode = ensure this doesn't interfere with the Material 3 ripple/focus states.false #### 3.
Positive Aspects
- Follows existing patterns (
MauiMaterialButton,MauiMaterialContextThemeWrapper) internalvisibility with// TODO: Material3 - make it public in .net 11comments- Proper handler registration using
RuntimeFeature.IsMaterial3Enabled - Clean separation between handler (PickerHandler2) and platform view (MauiMaterialPicker)
- Correct dialog lifecycle management (ShowEvent/DismissEvent cleanup)
SetCanceledOnTouchOutside(true)for proper Material dialog behavior- Uses
MaterialAlertDialogBuilderwithMauiMaterialContextThemeWrapper
Required Changes Before Merge
- Add UI tests for the Material 3 Picker on Android (use
write-tests-agentto create them) - Add CA1416 pragma warning suppression around
ForegroundColorSpaninPickerHandler2.Android.cs(line 194)
PR Title/Description Assessment
- Title
- Description covers the key changes accurately
📋 Expand PR Finalization Review
Title: ✅ Good
Current: [Android] Implemented Material3 support for Picker
Description: ✅ Good
Description needs updates. See details below.
✨ Suggested PR Description
[!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!
Description of Change
This pull request introduces a new Material 3-specific handler for the Picker control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11.
Key changes:
Material 3 Picker Handler (PickerHandler2):
- Added a new
internalclassPickerHandler2for Android, which uses a customMauiMaterialPickercontrol and provides Material 3 dialog styling and behavior for thePickercontrol. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced
MauiMaterialPickerandMauiMaterialPickerBaseclasses, which extendTextInputEditTextand provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming throughMauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. - Uses
MaterialAlertDialogBuilder(from Google Material library) for the selection dialog instead of theAppCompatAlertDialogused by the original handler.
Handler Registration Logic:
- Updated
AppHostBuilderExtensions.csto registerPickerHandler2instead of the defaultPickerHandlerwhen Material 3 is enabled on Android. The registration logic usesRuntimeFeature.IsMaterial3Enabledto select the correct handler at runtime. On non-Android platforms,PickerHandleris registered as before.
PickerExtensions.cs Refactoring:
- Extracted shared logic from
UpdateTitleColor,UpdatePicker, andUpdateFlowDirectionintoAppCompatEditText-based Core extension methods (UpdateTitleColorCore,UpdatePickerCore,UpdateFlowDirectionCore) so bothMauiPickerandMauiMaterialPickercan share implementation without duplication. - Added new
internalextension methods targetingMauiMaterialPickerthat delegate to the shared Core methods.
PickerHandler.Android.cs Cleanup:
- Removed
#pragma warning disable CA1416suppressions aroundForegroundColorSpanusage. This pragma was a workaround for a known issue withxamarin-android; the same pattern inPickerHandler2does not include this suppression.
Issues Fixed
Fixes #33665
Output
| Material2 | Material3 |
|---|---|
![]() |
![]() |
Code Review: ✅ Passed
Code Review — PR #33668
🟡 Suggestions
1. Inconsistent mapper visibility in PickerHandler2
File: src/Core/src/Handlers/Picker/PickerHandler2.Android.cs
Most property mapper methods are public, but MapItems and MapIsOpen are internal. Compare:
public static void MapTitle(PickerHandler2 handler, IPicker picker) { ... }
internal static void MapItems(PickerHandler2 handler, IPicker picker) => Reload(handler); // internal
...
internal static void MapIsOpen(PickerHandler2 handler, IPicker picker) { ... } // internalContext: In PickerHandler (the original), MapItems and MapIsOpen are also internal. So this is consistent with the original handler pattern — but it's worth calling out that this is intentional since the class itself is internal.
Verdict: Acceptable as-is since the entire class is internal. No change required, but a comment explaining the internal visibility on these two methods would aid future readers who may want to expose them when the class is made public in .NET 11.
2. String.Empty vs string.Empty (style nit)
File: src/Core/src/Handlers/Picker/PickerHandler2.Android.cs, line ~222
items[i] = String.Empty; // uses type alias (String), not keyword (string)The rest of the file and the codebase uses the string keyword alias consistently. This should be:
items[i] = string.Empty;3. Missing newline at end of new files
Both new files are missing a trailing newline:
src/Core/src/Handlers/Picker/PickerHandler2.Android.cssrc/Core/src/Platform/Android/Material3Controls/MauiMaterialPicker.cs
The diff shows \ No newline at end of file for both. This is a minor formatting issue but inconsistent with the rest of the codebase.
4. ShowDialog implementation diverges from original PickerHandler
File: src/Core/src/Handlers/Picker/PickerHandler2.Android.cs
void ShowDialog()
{
if (PlatformView.Clickable)
{
PlatformView.CallOnClick();
}
else
{
OnClick(PlatformView, EventArgs.Empty);
}
}This is copied from the original PickerHandler pattern, which is correct. However, CallOnClick() triggers the registered Click event handler (OnClick), which will create a dialog only if _dialog is null. If ShowDialog() is called while a dialog is already open, the Clickable path won't create a second dialog (because OnClick guards it), but the else path will also be skipped because _dialog is not null. This is the same behavior as the original handler — no bug — but it is worth noting.
✅ Looks Good
- Dialog lifecycle management:
_dialogevent handlers (ShowEvent,DismissEvent) are correctly removed in bothDisconnectHandlerandOnDialogDismiss, preventing memory leaks. MauiMaterialContextThemeWrapper: Properly used for bothMauiMaterialPickerBaseconstructor andMaterialAlertDialogBuilder— ensures consistent Material 3 theming across both the input field and the dialog.DefaultMovementMethodoverride: ReturningnullfromDefaultMovementMethodis the correct Android API for disabling cursor navigation in a read-only text field.PickerExtensions.csrefactoring: Extracting shared logic toAppCompatEditTextextension methods (UpdatePickerCore,UpdateTitleColorCore,UpdateFlowDirectionCore) cleanly solves the duplication concern raised in the review comments (marked resolved). The inheritance hierarchy (MauiMaterialPickerBase : TextInputEditText : AppCompatEditText) makes this approach correct.#if ANDROIDhandler registration: The placement and guard logic inAppHostBuilderExtensions.csis correct. ThePickerhandler that was previously registered unconditionally is now properly moved inside the Android-specific block with a runtime feature flag check.SetCanceledOnTouchOutside(true): Good UX default — dismisses the picker when the user taps outside, consistent with Material design guidelines.- Null-safety in
SetupDialogItems: Items array is sanitized for null entries before being passed toSetSingleChoiceItems.
… ShowEvent for cleanup.
…ing a wrapper method
…d up pragma warnings
238a688 to
ec2aa4d
Compare
…d Material 2 snapshots; added new lines in needed files.
|
Added UI tests and addressed all valid concerns. |
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
### Description of Change - This pull request introduces a new Material 3-specific handler for the `Picker` control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11. **Key changes:** **Material 3 Picker Handler Implementation:** - Added a new internal class `PickerHandler2` for Android, which uses a custom `MauiMaterialPicker` control and provides Material 3 dialog styling and behavior for the `Picker` control. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced MauiMaterialPicker and MauiMaterialPickerBase classes, which extend TextInputEditText and provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming through MauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. **Handler Registration Logic:** - Updated `AppHostBuilderExtensions.cs` to register `PickerHandler2` instead of the default `PickerHandler` when Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag. **Platform-Specific Extensions:** - Added new extension methods in `PickerExtensions.cs` for `MauiMaterialPicker`, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11. ### Issues Fixed Fixes #33665 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/98f1b6f2-6d3e-4780-8945-ee1989d33cf2"> | <img src="https://github.com/user-attachments/assets/e2e299cb-4c84-47c1-9208-7a08a4eb2d52"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change - This pull request introduces a new Material 3-specific handler for the `Picker` control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11. **Key changes:** **Material 3 Picker Handler Implementation:** - Added a new internal class `PickerHandler2` for Android, which uses a custom `MauiMaterialPicker` control and provides Material 3 dialog styling and behavior for the `Picker` control. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced MauiMaterialPicker and MauiMaterialPickerBase classes, which extend TextInputEditText and provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming through MauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. **Handler Registration Logic:** - Updated `AppHostBuilderExtensions.cs` to register `PickerHandler2` instead of the default `PickerHandler` when Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag. **Platform-Specific Extensions:** - Added new extension methods in `PickerExtensions.cs` for `MauiMaterialPicker`, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11. ### Issues Fixed Fixes #33665 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/98f1b6f2-6d3e-4780-8945-ee1989d33cf2"> | <img src="https://github.com/user-attachments/assets/e2e299cb-4c84-47c1-9208-7a08a4eb2d52"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change - This pull request introduces a new Material 3-specific handler for the `Picker` control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11. **Key changes:** **Material 3 Picker Handler Implementation:** - Added a new internal class `PickerHandler2` for Android, which uses a custom `MauiMaterialPicker` control and provides Material 3 dialog styling and behavior for the `Picker` control. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced MauiMaterialPicker and MauiMaterialPickerBase classes, which extend TextInputEditText and provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming through MauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. **Handler Registration Logic:** - Updated `AppHostBuilderExtensions.cs` to register `PickerHandler2` instead of the default `PickerHandler` when Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag. **Platform-Specific Extensions:** - Added new extension methods in `PickerExtensions.cs` for `MauiMaterialPicker`, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11. ### Issues Fixed Fixes #33665 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/98f1b6f2-6d3e-4780-8945-ee1989d33cf2"> | <img src="https://github.com/user-attachments/assets/e2e299cb-4c84-47c1-9208-7a08a4eb2d52"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change - This pull request introduces a new Material 3-specific handler for the `Picker` control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11. **Key changes:** **Material 3 Picker Handler Implementation:** - Added a new internal class `PickerHandler2` for Android, which uses a custom `MauiMaterialPicker` control and provides Material 3 dialog styling and behavior for the `Picker` control. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced MauiMaterialPicker and MauiMaterialPickerBase classes, which extend TextInputEditText and provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming through MauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. **Handler Registration Logic:** - Updated `AppHostBuilderExtensions.cs` to register `PickerHandler2` instead of the default `PickerHandler` when Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag. **Platform-Specific Extensions:** - Added new extension methods in `PickerExtensions.cs` for `MauiMaterialPicker`, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11. ### Issues Fixed Fixes dotnet#33665 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/98f1b6f2-6d3e-4780-8945-ee1989d33cf2"> | <img src="https://github.com/user-attachments/assets/e2e299cb-4c84-47c1-9208-7a08a4eb2d52"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change - This pull request introduces a new Material 3-specific handler for the `Picker` control on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11. **Key changes:** **Material 3 Picker Handler Implementation:** - Added a new internal class `PickerHandler2` for Android, which uses a custom `MauiMaterialPicker` control and provides Material 3 dialog styling and behavior for the `Picker` control. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers. - Introduced MauiMaterialPicker and MauiMaterialPickerBase classes, which extend TextInputEditText and provide the Material 3 look and feel for the picker input field. These classes implement proper Material 3 theming through MauiMaterialContextThemeWrapper, disable text cursor movement and selection to maintain picker behavior, and ensure visual consistency with Material 3 design guidelines. **Handler Registration Logic:** - Updated `AppHostBuilderExtensions.cs` to register `PickerHandler2` instead of the default `PickerHandler` when Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag. **Platform-Specific Extensions:** - Added new extension methods in `PickerExtensions.cs` for `MauiMaterialPicker`, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11. ### Issues Fixed Fixes #33665 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/98f1b6f2-6d3e-4780-8945-ee1989d33cf2"> | <img src="https://github.com/user-attachments/assets/e2e299cb-4c84-47c1-9208-7a08a4eb2d52"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 46 commits with various improvements, bug fixes, and enhancements. ## Button - [Android] Implemented material3 support for Button by @Dhivya-SF4094 in #33173 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Button](#33172) </details> ## CollectionView - [Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined by @SuthiYuvaraj in #29618 <details> <summary>🔧 Fixes</summary> - [Android : RemainingItemsThresholdReachedCommand not firing when CollectionVew has Header and Footer both defined](#29588) </details> - [iOS/MacCatalyst] Fix CollectionView ScrollTo for horizontal layouts by @Shalini-Ashokan in #33853 <details> <summary>🔧 Fixes</summary> - [[iOS/MacCatalyst] CollectionView ScrollTo does not work with horizontal Layout](#33852) </details> - [iOS & Mac] Fixed IndicatorView Size doesnt update dynamically by @SubhikshaSf4851 in #31129 <details> <summary>🔧 Fixes</summary> - [[iOS, Catalyst] IndicatorView.IndicatorSize does not update dynamically at runtime](#31064) </details> - [Android] Fix for CollectionView Scrolled event is triggered on the initial app load. by @BagavathiPerumal in #33558 <details> <summary>🔧 Fixes</summary> - [[Android] CollectionView Scrolled event is triggered on the initial app load.](#33333) </details> - [iOS, Android] Fix for CollectionView IsEnabled=false allows touch interactions by @praveenkumarkarunanithi in #31403 <details> <summary>🔧 Fixes</summary> - [More issues with CollectionView IsEnabled, InputTransparent, Opacity via Styles and code behind](#19771) </details> - [iOS] Fix VerticalOffset Update When Modifying CollectionView.ItemsSource While Scrolled by @devanathan-vaithiyanathan in #34153 <details> <summary>🔧 Fixes</summary> - [[iOS]VerticalOffset Not Reset to Zero After Clearing ItemSource in CollectionView](#26798) </details> ## DateTimePicker - [Android] Fix DatePicker MinimumDate/MaximumDate not updating dynamically by @HarishwaranVijayakumar in #33687 <details> <summary>🔧 Fixes</summary> - [[regression/8.0.3] [Android] DatePicker control minimum date issue](#19256) - [[Android] DatePicker does not update MinimumDate / MaximumDate in the Popup when set in the viewmodel after first opening](#33583) </details> ## Drawing - Android drawable perf by @albyrock87 in #31567 ## Editor - [Android] Implemented material3 support for Editor by @SyedAbdulAzeemSF4852 in #33478 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Editor](#33476) </details> ## Entry - [iOS, Mac] Fix for CursorPosition not updating when typing into Entry control by @SyedAbdulAzeemSF4852 in #30505 <details> <summary>🔧 Fixes</summary> - [Entry control CursorPosition does not update on TextChanged event [iOS Maui 8.0.7] ](#20911) - [CursorPosition not calculated correctly on behaviors events for iOS devices](#32483) </details> ## Flyoutpage - [Android, Windows] Fix for FlyoutPage toolbar button not updating on orientation change by @praveenkumarkarunanithi in #31962 <details> <summary>🔧 Fixes</summary> - [Flyout page in Android does not show flyout button (burger) consistently](#24468) </details> - Fix for First Item in CollectionView Overlaps in FlyoutPage.Flyout on iOS by @praveenkumarkarunanithi in #29265 <details> <summary>🔧 Fixes</summary> - [[iOS] CollectionView not rendering first item correctly in FlyoutPage.Flyout](#29170) </details> ## Image - [Android] Fix excessive memory usage for stream and resource-based image loading by @Shalini-Ashokan in #33590 <details> <summary>🔧 Fixes</summary> - [[Android] Unexpected high Bitmap.ByteCount when loading image via ImageSource.FromResource() or ImageSource.FromStream() in .NET MAUI](#33239) </details> - [Android] Fix for Resize method returns an image that has already been disposed by @SyedAbdulAzeemSF4852 in #29964 <details> <summary>🔧 Fixes</summary> - [In GraphicsView, the Resize method returns an image that has already been disposed](#29961) - [IIMage.Resize bugged behaviour](#31103) </details> ## Label - Fixed Label Span font property inheritance when applied via Style by @SubhikshaSf4851 in #34110 <details> <summary>🔧 Fixes</summary> - [`Span` does not inherit text styling from `Label` if that styling is applied using `Style` ](#21326) </details> - [Android] Implemented material3 support for Label by @SyedAbdulAzeemSF4852 in #33599 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Label](#33598) </details> ## Map - [Android] Fix Circle Stroke color is incorrectly updated as Fill color. by @NirmalKumarYuvaraj in #33643 <details> <summary>🔧 Fixes</summary> - [[Android] Circle Stroke color is incorrectly updated as Fill color.](#33642) </details> ## Mediapicker - [iOS] Fix: invoke MediaPicker completion handler after DismissViewController by @yuriikyry4enko in #34250 <details> <summary>🔧 Fixes</summary> - [[iOS] Media Picker UIImagePickerController closing issue](#21996) </details> ## Navigation - Fix ContentPage memory leak on Android when using NavigationPage modally (fixes #33918) by @brunck in #34117 <details> <summary>🔧 Fixes</summary> - [[Android] Modal TabbedPage whose tabs are NavigationPage(ContentPage) is retained after PopModalAsync()](#33918) </details> ## Picker - [Android] Implement material3 support for TimePicker by @HarishwaranVijayakumar in #33646 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for TimePicker](#33645) </details> - [Android] Implemented Material3 support for Picker by @SyedAbdulAzeemSF4852 in #33668 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Picker](#33665) </details> ## RadioButton - [Android] Implemented material3 support for RadioButton by @SyedAbdulAzeemSF4852 in #33468 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for RadioButton](#33467) </details> ## Setup - Clarify MA003 error message by @jeremy-visionaid in #34067 <details> <summary>🔧 Fixes</summary> - [MA003 false positive with 9.0.21](#26599) </details> ## Shell - [Android] Fix TabBar FlowDirection not updating dynamically by @SubhikshaSf4851 in #33091 <details> <summary>🔧 Fixes</summary> - [[Android, iOS] FlowDirection RTL is not updated dynamically on Shell TabBar](#32993) </details> - [Android] Fix page not disposed on Shell replace navigation by @Vignesh-SF3580 in #33426 <details> <summary>🔧 Fixes</summary> - [[Android] [Shell] replace navigation leaks current page](#25134) </details> - [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled by @NanthiniMahalingam in #32734 <details> <summary>🔧 Fixes</summary> - [[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling](#32477) </details> ## Single Project - Fix: Throw a clear error when an SVG lacks dimensions instead of a NullReferenceException by @Shalini-Ashokan in #33194 <details> <summary>🔧 Fixes</summary> - [MAUI Fails To Convert Valid SVG Files Into PNG Files (Object reference not set to an instance of an object)](#32460) </details> ## SwipeView - [iOS] Fix SwipeView stays open on iOS after updating content by @devanathan-vaithiyanathan in #31248 <details> <summary>🔧 Fixes</summary> - [[iOS] - Swipeview with collectionview issue](#19541) </details> ## TabbedPage - [Windows] Fixed IsEnabled Property not works on Tabs by @NirmalKumarYuvaraj in #26728 <details> <summary>🔧 Fixes</summary> - [ShellContent IsEnabledProperty does not work](#5161) - [[Windows] Shell Tab IsEnabled Not Working](#32996) </details> - [Android] Fix NavigationBar overlapping StatusBar when NavigationBar visibility changes by @Vignesh-SF3580 in #33359 <details> <summary>🔧 Fixes</summary> - [[Android] NavigationBar overlaps with StatusBar when mixing HasNavigationBar=true/false in TabbedPage on Android 15 (API 35)](#33340) </details> ## Templates - Fix for unable to open task using keyboard navigation on windows platform by @SuthiYuvaraj in #33647 <details> <summary>🔧 Fixes</summary> - [Unable to open task using keyboard: A11y_.NET maui_User can get all the insights of Dashboard_Keyboard](#30787) </details> ## TitleView - Fix for NavigationPage.TitleView does not expand with host window in iPadOS 26+ by @SuthiYuvaraj in #33088 ## Toolbar - [iOS] Fix toolbar items ignoring BarTextColor on iOS/MacCatalyst 26+ by @Shalini-Ashokan in #34036 <details> <summary>🔧 Fixes</summary> - [[iOS 26] ToolbarItem color with custom BarTextColor not working](#33970) </details> - [Android] Fix for ToolbarItem retaining the icon from the previous page on Android when using NavigationPage. by @BagavathiPerumal in #32311 <details> <summary>🔧 Fixes</summary> - [Toolbaritem keeps the icon of the previous page on Android, using NavigationPage (not shell)](#31727) </details> ## WebView - [Android] Fix WebView in a grid expands beyond it's cell by @devanathan-vaithiyanathan in #32145 <details> <summary>🔧 Fixes</summary> - [Android - WebView in a grid expands beyond it's cell](#32030) </details> ## Xaml - ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @HarishwaranVijayakumar in #30880 <details> <summary>🔧 Fixes</summary> - [Binding context in ContentPresenter](#23797) </details> <details> <summary>🔧 Infrastructure (1)</summary> - [Revert] ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @Ahamed-Ali in #34332 </details> <details> <summary>🧪 Testing (6)</summary> - [Testing] Feature Matrix UITest Cases for Shell Flyout Page by @NafeelaNazhir in #32525 - [Testing] Feature Matrix UITest Cases for Brushes by @LogishaSelvarajSF4525 in #31833 - [Testing] Feature Matrix UITest Cases for BindableLayout by @LogishaSelvarajSF4525 in #33108 - [Android] Add UI tests for Material 3 CheckBox by @HarishwaranVijayakumar in #34126 <details> <summary>🔧 Fixes</summary> - [[Android] Add UI tests for Material 3 CheckBox](#34125) </details> - [Testing] Feature Matrix UITest Cases for Shell Tabbed Page by @NafeelaNazhir in #33159 - [Testing] Fixed Test case failure in PR 34294 - [03/2/2026] Candidate - 1 by @TamilarasanSF4853 in #34334 </details> <details> <summary>📦 Other (2)</summary> - Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.9 by @PaulAndersonS in #34178 - Fix crash when closing Windows based app when using TitleBar by @MFinkBK in #34032 <details> <summary>🔧 Fixes</summary> - [Unhandled exception "Value does not fall within the expected range" when closing Windows app](#32194) </details> </details> **Full Changelog**: main...inflight/candidate


Description of Change
Pickercontrol on Android, enabling improved theming and dialog behavior when Material 3 is enabled. The changes are structured to ensure backward compatibility and to keep the new implementation internal until .NET 11.Key changes:
Material 3 Picker Handler Implementation:
PickerHandler2for Android, which uses a customMauiMaterialPickercontrol and provides Material 3 dialog styling and behavior for thePickercontrol. This handler manages dialog creation, item selection, and property mapping for Material 3 pickers.Handler Registration Logic:
AppHostBuilderExtensions.csto registerPickerHandler2instead of the defaultPickerHandlerwhen Material 3 is enabled on Android. The registration logic ensures the correct handler is used based on the runtime feature flag.Platform-Specific Extensions:
PickerExtensions.csforMauiMaterialPicker, including methods to update the title, title color, selected index, and picker items, as well as to propagate flow direction to dialogs. These are internal and marked for future public release with .NET 11.Issues Fixed
Fixes #33665
Output