[Android] Implemented Material3 support for ProgressBar#33926
[Android] Implemented Material3 support for ProgressBar#33926jfversluis merged 8 commits intodotnet:inflight/currentfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This pull request implements Material3 support for the ProgressBar control on Android when the UseMaterial3 MSBuild property is enabled. The implementation introduces a new internal handler that uses Google's Material3 LinearProgressIndicator component and extends the color customization support to work with both the standard Android ProgressBar and the Material3 variant.
Changes:
- Adds
ProgressBarHandler2which creates a Material3LinearProgressIndicatorwhen Material3 is enabled - Updates handler registration to conditionally use
ProgressBarHandler2on Android when Material3 is enabled - Enhances color update logic to support both standard ProgressBar and Material3 LinearProgressIndicator
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs | New handler that creates LinearProgressIndicator with Material3 theming support |
| src/Core/src/Platform/Android/ProgressBarExtensions.cs | Adds type-based delegation in UpdateProgressColor and implements Material3-specific color updates |
| src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs | Conditionally registers ProgressBarHandler2 for Android when Material3 is enabled |
src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs
Outdated
Show resolved
Hide resolved
🤖 AI Summary📊 Expand Full Review🔍 Pre-Flight — Context & Validation📝 Review Session — Fixed formatting ·
|
| File:Line | Reviewer Says | Status |
|---|---|---|
ProgressBarExtensions.cs:17 |
Missing space in if( → should be if ( |
|
ProgressBarHandler2.Android.cs:16 |
Tests in ProgressBarHandlerTests.Android.cs cast platform view to Android.Widget.ProgressBar, but Material3 handler returns LinearProgressIndicator — tests will fail with Material3 enabled |
No other human reviewer comments.
Edge Cases / Concerns
- Tests: No tests added; existing
ProgressBarHandlerTests.Android.csusesAProgressBar GetNativeProgressBar()which assumesAndroid.Widget.ProgressBar— fails with Material3 handler - The
ProgressBarHandler2is markedinternalwith a TODO to make it public in .NET 11 - Style: minor
if(vsif (formatting issue (unresolved automated review thread) -
SetIndicatorColor([])passing empty array to reset to theme default is undocumented behavior
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33926 | New ProgressBarHandler2 using LinearProgressIndicator, registered via #if ANDROID + RuntimeFeature.IsMaterial3Enabled check in AppHostBuilderExtensions, with updated ProgressBarExtensions.UpdateProgressColor dispatching on type |
⏳ PENDING (Gate) | 3 files (+62/-1) | Original PR |
🚦 Gate — Test Verification
📝 Review Session — Fixed formatting · 43e59e1
Result: ❌ FAILED — No Tests Exist
Platform: android (selected — issue is Android-only)
Mode: Full Verification (attempted)
Gate Status
Tests for issue #33925 do NOT exist.
- No files matching
*33925*found in:src/Controls/tests/TestCases.HostApp/Issues/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/
- No device tests in
src/Core/tests/DeviceTests/Handlers/ProgressBar/cover the Material3 path - The existing
ProgressBarHandlerTests.Android.csis NOT a test for this issue (no Material3 code path coverage)
Automated Reviewer Note
A Copilot automated reviewer flagged that:
"The existing
ProgressBarHandlerTests.Android.cstests expect the platform view to be of typeAndroid.Widget.ProgressBar. However, when Material3 is enabled,ProgressBarHandler2will return aLinearProgressIndicatorinstead. Tests will fail or won't adequately test the Material3 code path."
Recommendation
Tests are missing for this PR. The PR author should add tests before this can be merged. The write-tests-agent can help create appropriate tests.
🔧 Fix — Analysis & Comparison
📝 Review Session — Fixed formatting · 43e59e1
Skipped — Gate failed (no tests exist). Try-fix requires Gate to pass first.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33926 | New ProgressBarHandler2 using LinearProgressIndicator, registered conditionally via RuntimeFeature.IsMaterial3Enabled |
❌ NOT TESTED (Gate failed) | 3 files (+62/-1) | Original PR |
Exhausted: N/A (Gate did not pass)
Selected Fix: N/A
📋 Report — Final Recommendation
📝 Review Session — Fixed formatting · 43e59e1
⚠️ Final Recommendation: REQUEST CHANGES
Summary
PR #33926 implements Material3 support for the Android ProgressBar by introducing a new ProgressBarHandler2 that uses LinearProgressIndicator. The implementation follows established patterns correctly, but no tests were added for the new Material3 code path. Gate failed because no tests exist for issue #33925.
Root Cause (Issue #33925)
When UseMaterial3 is enabled, the ProgressBar handler was still creating an Android.Widget.ProgressBar instead of Google.Android.Material.ProgressIndicator.LinearProgressIndicator. This resulted in incorrect Material3 visual appearance (colors, shape, states) since the legacy widget doesn't use Material3 theme resources.
Gate Result
❌ GATE FAILED — No Tests Exist
- No UI test files (
IssueXXXXX.cs) added toTestCases.HostApporTestCases.Shared.Tests - No device tests added to
Core.DeviceTests/Handlers/ProgressBar/ - Existing
ProgressBarHandlerTests.Android.csdoes NOT cover the Material3 code path
Fix Quality Assessment
Approach (PR's fix):
- New internal
ProgressBarHandler2extendingProgressBarHandler, overridingCreatePlatformView()to returnLinearProgressIndicator(MauiMaterialContextThemeWrapper.Create(Context)) - Registered via
AppHostBuilderExtensions.AddControlsHandlers()under#if ANDROID+RuntimeFeature.IsMaterial3Enabledruntime check ProgressBarExtensions.UpdateProgressColordispatches viais LinearProgressIndicatortype check, callingUpdateLinearProgressIndicatorColoror falling back to the original path
Pattern consistency: ✅ Follows the established RuntimeFeature.IsMaterial3Enabled + MauiMaterialContextThemeWrapper.Create() pattern (matches CheckBox implementation)
Code Review Findings
🔴 Critical Issues
1. No Tests Added
- No tests for Material3 ProgressBar behavior (correct
LinearProgressIndicatorcreation, color updates, reset to theme default) - The automated reviewer correctly flagged that existing
ProgressBarHandlerTests.Android.csusesAProgressBar GetNativeProgressBar()which casts toAndroid.Widget.ProgressBar— this will fail or silently skip whenProgressBarHandler2is active - Use
write-tests-agentto add appropriate device tests
🟡 Suggestions
2. SetIndicatorColor([]) behavior relies on undocumented API behavior
- Comment says "passing empty array resets to
colorPrimarywhen length == 0" — this is implementation-specific Material3 behavior that may change. Consider using a null/default check against Material3 API documentation rather than relying on this side-effect.
3. Title should use present imperative tense
- Current:
[Android] Implemented Material3 support for ProgressBar - Suggested:
[Android] ProgressBar: Add Material3 support using LinearProgressIndicator
4. PR Description missing NOTE block
- The required NOTE block for artifact testing is absent
✅ Looks Good
- Handler inheritance from
ProgressBarHandleris correct — inheritsMapProgressandMapProgressColormapper correctly MauiMaterialContextThemeWrapper.Create(Context)correctly applies Material3 theminginternalvisibility with TODO for .NET 11 is appropriate for incremental Material3 rollout#if ANDROIDguard inAppHostBuilderExtensions.csis correct- Runtime check using
RuntimeFeature.IsMaterial3Enabledis the established pattern - Color null check correctly resets to theme default
Title & Description Review
Current Title: [Android] Implemented Material3 support for ProgressBar
Suggested Title: [Android] ProgressBar: Add Material3 support using LinearProgressIndicator
Description Assessment: Good structure with "Description of Change" and "Issues Fixed" sections, includes before/after screenshots. Missing the required NOTE block.
Required addition to top of description:
<!-- 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!
Required Changes Before Merge
- Add tests (critical) — Add device tests or UI tests for:
ProgressBarHandler2createsLinearProgressIndicatorwhen Material3 is enabled- Color update correctly calls
SetIndicatorColor - Null color resets to theme default
- Add NOTE block to PR description
- Optional: Update title to use present imperative tense
📋 Expand PR Finalization Review
Title: ✅ Good
Current: [Android] Implemented Material3 support for ProgressBar
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 updates the handling of
ProgressBarcontrols on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars.
Android ProgressBar Material3 Support:
- Added a new internal handler
ProgressBarHandler2that usesLinearProgressIndicatorfrom Material3 for progress bars when Material3 is enabled. (src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs)ProgressBarHandler2is currentlyinternaland is planned to be made public in .NET 11 (// TODO: Material3 - make it public in .net 11).
- Updated
AddControlsHandlersinAppHostBuilderExtensions.csto registerProgressBarHandler2instead of the default handler when Material3 is enabled on Android, preserving the originalProgressBarHandlerotherwise.
ProgressBar Color Customization:
- Enhanced
ProgressBarExtensions.UpdateProgressColorto delegate color updates to a new method for Material3 progress bars (UpdateLinearProgressIndicatorColor) or fall back to the native color update for standard progress bars. - Implemented
UpdateLinearProgressIndicatorColorforLinearProgressIndicator, supporting theme default fallback (viaSetIndicatorColor([])) and custom color arrays. - Added necessary Material3 imports to
ProgressBarExtensions.cs.
Material Design Spec - ProgressBar
Issues Fixed
Fixes #33925
Output
| Material2 | Material3 |
|---|---|
![]() |
![]() |
Code Review: ✅ Passed
Code Review Findings — PR #33926
🟡 Suggestions
1. No Tests for the Material3 Code Path
File: src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs (line 16)
Problem: The existing ProgressBarHandlerTests.Android.cs does not cover the Material3 code path. There are no tests that verify:
ProgressBarHandler2creates aLinearProgressIndicator- Color updates via
UpdateLinearProgressIndicatorColorwork correctly (both null/default and custom colors) - Progress value is correctly applied when using
LinearProgressIndicator
Note: LinearProgressIndicator does extend Android.Widget.ProgressBar (via BaseProgressIndicator), so existing test helpers that cast to AProgressBar will not throw. However, they won't exercise the Material3 color path.
Recommendation: Add device tests that enable Material3, instantiate ProgressBar, and verify the platform view is a LinearProgressIndicator and color updates behave correctly.
This issue was flagged in an open (unresolved) review thread by copilot-pull-request-reviewer.
2. Missing Newline at End of File
File: src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs
Problem: The diff shows \ No newline at end of file — the file is missing the standard trailing newline.
Recommendation: Add a newline after the closing } on the last line of the file.
3. Open Review Thread Not Explicitly Resolved
Thread: Code style — missing space in if( vs if (
Status: The thread is marked as outdated (code was changed), and the current diff shows if (platformProgressBar is LinearProgressIndicator materialProgressBar) with a proper space. However, the thread is not explicitly marked as resolved on GitHub.
Recommendation: Author should resolve the thread to confirm the fix was applied intentionally.
✅ Looks Good
- Handler pattern:
ProgressBarHandler2correctly follows the established Material3 handler pattern in the codebase — subclasses the standard handler, overridesCreatePlatformView(), and usesMauiMaterialContextThemeWrapper.Create(Context)for proper Material3 theming. - Registration logic: The conditional handler registration in
AppHostBuilderExtensions.csis correctly scoped inside#if ANDROID, ensuring no impact on other platforms. - Color null-handling:
UpdateLinearProgressIndicatorColorcorrectly handlesnullcolor by callingSetIndicatorColor([])(empty array), which tells Material3 to resolve to the theme'scolorPrimary. This is the correct pattern per the Material3 API. - No API surface changes:
ProgressBarHandler2isinternal, so there are no public API changes requiringPublicAPI.Unshipped.txtupdates. - Non-breaking: On non-Android platforms and when Material3 is disabled, the original
ProgressBarHandleris used, preserving existing behavior. - Covariant return type:
ProgressBarHandler2.CreatePlatformView()returnsLinearProgressIndicator, which is a subtype ofAndroid.Widget.ProgressBar(viaBaseProgressIndicator<T> : ProgressBar), so the override is type-safe.
43e59e1 to
4155947
Compare
|
Added UI tests and addressed all valid concerns. |
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
jfversluis
left a comment
There was a problem hiding this comment.
Multi-Model Code Review (Sonnet 4.5 / GPT 5.1)
🔴 Type Incompatibility — LinearProgressIndicator vs Android.Widget.ProgressBar
Severity: Critical | Found by: GPT 5.1
ProgressBarHandler is ViewHandler<IProgress, AndroidProgressBar> where AndroidProgressBar = Android.Widget.ProgressBar. ProgressBarHandler2 subclasses it and overrides CreatePlatformView() to return LinearProgressIndicator.
Problem: LinearProgressIndicator derives from BaseProgressIndicator → android.view.View. It does NOT derive from Android.Widget.ProgressBar. This means:
- The override return type is not covariant with the base
ViewHandler<IProgress, AndroidProgressBar>expects anAndroid.Widget.ProgressBarasPlatformView- The
is LinearProgressIndicatorcheck inUpdateProgressColorextension is unreachable since the platform view type isAndroidProgressBar
Fix: Either:
- Change
ProgressBarHandler2to be a standaloneViewHandler<IProgress, LinearProgressIndicator>(not subclassingProgressBarHandler), OR - Use a shared base type (
Android.Views.View) and update all extension methods accordingly
🟠 Missing Track/Background Color Support
Severity: High | Found by: Sonnet 4.5
UpdateLinearProgressIndicatorColor only calls SetIndicatorColor(), but does NOT call SetTrackColor(). The test Material3ProgressBar_SetProgressColorAndBackgroundColor_VerifyVisualState sets both colors, but BackgroundColor changes will be applied to the container view rather than the progress track.
Fix: Add SetTrackColor() call to handle the BackgroundColor property correctly for LinearProgressIndicator.
🟡 Indeterminate Mode Hardcoded to False
Severity: Medium | Found by: Sonnet 4.5
CreatePlatformView() sets Indeterminate = false with no mechanism to change it at runtime. While MAUI's IProgress doesn't expose indeterminate mode, this should be documented as an intentional limitation.
@jfversluis , Concern 2 — Missing Track/Background Color Support: This concern is invalid — UpdateLinearProgressIndicatorColor is only responsible for ProgressColor (from IProgress), while BackgroundColor is a separate IView property handled generically by ViewHandler.ViewMapper, identical to how Material2 behaves, and since IProgress has no TrackColor property, adding SetTrackColor() would require a new API — making this a future enhancement request, not a bug in this PR. Concern 3 — Indeterminate Mode: This concern is invalid — Indeterminate = false is set in both the existing ProgressBarHandler (Material2) and the new ProgressBarHandler2 (Material3), making this identical pre-existing behavior, not a new limitation introduced by this PR. |
f0a0f8c to
5f66900
Compare
|
Something went wrong here somehow. I will fix it :) |
fbeb12c to
274a5e5
Compare
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes #33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes #33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes #33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes #33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes #33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 66 commits with various improvements, bug fixes, and enhancements. ## Activityindicator - [Android] Implemented material3 support for ActivityIndicator by @Dhivya-SF4094 in #33481 <details> <summary>🔧 Fixes</summary> - [Implement material3 support for ActivityIndicator](#33479) </details> - [iOS] Fix: ActivityIndicator IsRunning ignores IsVisible when set to true by @bhavanesh2001 in #28983 <details> <summary>🔧 Fixes</summary> - [[iOS] [ActivityIndicator] `IsRunning` ignores `IsVisible` when set to `true`](#28968) </details> ## Button - [iOS] Button RTL text and image overlap - fix by @kubaflo in #29041 ## Checkbox - [iOS/MacCatalyst] Fix CheckBox foreground color not resetting when set to null by @Ahamed-Ali in #34284 <details> <summary>🔧 Fixes</summary> - [[iOS] Color of the checkBox control is not properly worked on dynamic scenarios](#34278) </details> ## CollectionView - [iOS] Fix: CollectionView does not clear selection when SelectedItem is set to null by @Tamilarasan-Paranthaman in #30420 <details> <summary>🔧 Fixes</summary> - [CollectionView not being able to remove selected item highlight on iOS](#30363) - [[MAUI] Select items traces are preserved](#26187) </details> - [iOS] CV2 ItemsLayout update by @kubaflo in #28675 <details> <summary>🔧 Fixes</summary> - [CollectionView CollectionViewHandler2 doesnt change ItemsLayout on DataTrigger](#28656) - [iOS CollectionView doesn't respect a change to ItemsLayout when using Items2.CollectionViewHandler2](#31259) </details> - [iOS][CV2] Fix CollectionView renders large empty space at bottom of view by @devanathan-vaithiyanathan in #31215 <details> <summary>🔧 Fixes</summary> - [[iOS] [MacCatalyst] CollectionView renders large empty space at bottom of view](#17799) - [[iOS/Mac] CollectionView2 EmptyView takes up large horizontal space even when the content is small](#33201) </details> - [iOS] Fixed issue where group Header/Footer template was set to all items when IsGrouped was true for an ObservableCollection by @Tamilarasan-Paranthaman in #29144 <details> <summary>🔧 Fixes</summary> - [[iOS] Group Header/Footer Repeated for All Items When IsGrouped is True for ObservableCollection in CollectionView](#29141) </details> - [Android] Fix CollectionView selection crash with HeaderTemplate by @NirmalKumarYuvaraj in #34275 <details> <summary>🔧 Fixes</summary> - [[Bug] [Android] System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index](#34247) </details> ## DateTimePicker - [iOS] Fix TimePicker AM/PM frequently changes when the app is closed and reopened by @devanathan-vaithiyanathan in #31066 <details> <summary>🔧 Fixes</summary> - [[iOS] TimePicker AM/PM frequently changes when the app is closed and reopened](#30837) - [Maui 10 iOS TimePicker Strange Characters in place of AM/PM](#33722) </details> - Android TimePicker ignores 24 hour system setting when using Format Property - fix by @kubaflo in #28797 <details> <summary>🔧 Fixes</summary> - [Android TimePicker ignores 24 hour system setting when using Format Property](#28784) </details> ## Drawing - [iOS, Mac, Windows] GraphicsView: Fix Background/BackgroundColor not updating by @NirmalKumarYuvaraj in #31254 <details> <summary>🔧 Fixes</summary> - [[iOS, Mac, Windows] GraphicsView does not change the Background/BackgroundColor](#31239) </details> - [iOS] GraphicsView DrawString - fix by @kubaflo in #26304 <details> <summary>🔧 Fixes</summary> - [DrawString not rendering in iOS.](#24450) - [GraphicsView DrawString not rendering in iOS](#8486) - [DrawString doesn't work on maccatalyst](#4993) </details> - [Android] - Fix Shadow Rendering For Transparent Fill, Stroke (Lines), and Text on Shapes by @prakashKannanSf3972 in #29528 <details> <summary>🔧 Fixes</summary> - [Ellipse Transparency Not Rendered When Drawing Arc Inside the Ellipse Using GraphicsView on Android](#29394) </details> - Revert "[iOS, Mac, Windows] GraphicsView: Fix Background/BackgroundColor not updating (#31254)" by @Ahamed-Ali via @Copilot in #34508 ## Entry - [iOS 26] Fix Entry MaxLength not enforced due to new multi-range delegate by @kubaflo in #32045 <details> <summary>🔧 Fixes</summary> - [iOS 26 - The MaxLength property value is not respected on an Entry control.](#32016) - [.NET MAUI Entry Maximum Length not working on iOS and macOS](#33316) </details> - [iOS] Fixed Entry with IsPassword toggling loses previously entered text by @SubhikshaSf4851 in #30572 <details> <summary>🔧 Fixes</summary> - [Entry with IsPassword toggling loses previously entered text on iOS when IsPassword is re-enabled](#30085) </details> ## Essentials - Fix for FilePicker PickMultipleAsync nullable reference type by @SuthiYuvaraj in #33163 <details> <summary>🔧 Fixes</summary> - [FilePicker PickMultipleAsync nullable reference type](#33114) </details> - Replace deprecated NetworkReachability with NWPathMonitor on iOS/macOS by @jfversluis via @Copilot in #32354 <details> <summary>🔧 Fixes</summary> - [NetworkReachability is obsolete on iOS/maccatalyst 17.4+](#32312) - [Use NWPathMonitor on iOS for Essentials Connectivity](#2574) </details> ## Essentials Connectivity - Update Android Connectivity implementation to use modern APIs by @jfversluis via @Copilot in #30348 <details> <summary>🔧 Fixes</summary> - [Update the Android Connectivity implementation to user modern APIs](#30347) </details> ## Flyout - [iOS] Fixed Flyout icon not updating when root page changes using InsertPageBefore by @Vignesh-SF3580 in #29924 <details> <summary>🔧 Fixes</summary> - [[iOS] Flyout icon not replaced by back button when root page is changed using InsertPageBefore](#29921) </details> ## Flyoutpage - [iOS] Flyout Items Not Displayed in RightToLeft FlowDirection in Landscape - fix by @kubaflo in #26762 <details> <summary>🔧 Fixes</summary> - [Flyout Items Not Displayed in RightToLeft FlowDirection on iOS in Landscape Orientation and Hamburger Icon Positioned Incorrectly](#26726) </details> ## Image - [Android] Implemented Material3 support for Image by @Dhivya-SF4094 in #33661 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Image](#33660) </details> ## Keyboard - [iOS] Fix gap at top of view after rotating device while Entry keyboard is visible by @praveenkumarkarunanithi in #34328 <details> <summary>🔧 Fixes</summary> - [Focusing and entering texts on entry control causes a gap at the top after rotating simulator.](#33407) </details> ## Label - [Android] Support for images inside HTML label by @kubaflo in #21679 <details> <summary>🔧 Fixes</summary> - [Label with HTML TextType does not display images on Android](#21044) </details> - [fix] ContentLabel Moved to a nested class to prevent CS0122 in external source generators by @SubhikshaSf4851 in #34514 <details> <summary>🔧 Fixes</summary> - [[MAUI] Building Maui App with sample content results CS0122 errors.](#34512) </details> ## Layout - Optimize ordering of children in Flex layout by @symbiogenesis in #21961 - [Android] Fix control size properties not available during Loaded event by @Vignesh-SF3580 in #31590 <details> <summary>🔧 Fixes</summary> - [CollectionView on Android does not provide height, width, logical children once loaded, works fine on Windows](#14364) - [Control's Loaded event invokes before calling its measure override method.](#14160) </details> ## Mediapicker - [iOS/Android] MediaPicker: Fix image orientation when RotateImage=true by @michalpobuta in #33892 <details> <summary>🔧 Fixes</summary> - [MediaPicker.PickPhotosAsync does not preserve image orientation](#32650) </details> ## Modal - [Windows] Fix modal page keyboard focus not shifting to newly opened modal by @jfversluis in #34212 <details> <summary>🔧 Fixes</summary> - [Keyboard focus does not shift to a newly opened modal page: Pressing enter clicks the button on the page beneath the modal page](#22938) </details> ## Navigation - [iOS26] Apply view margins in title view by @kubaflo in #32205 <details> <summary>🔧 Fixes</summary> - [NavigationPage TitleView iOS 26](#32200) </details> - [iOS] System.NullReferenceException at NavigationRenderer.SetStatusBarStyle() by @kubaflo in #29564 <details> <summary>🔧 Fixes</summary> - [System.NullReferenceException at NavigationRenderer.SetStatusBarStyle()](#29535) </details> - [iOS 26] Fix back button color not applied for NavigationPage by @Shalini-Ashokan in #34326 <details> <summary>🔧 Fixes</summary> - [[iOS] Color not applied to the Back button text or image on iOS 26](#33966) </details> ## Picker - Fix Picker layout on Mac Catalyst 26+ by @kubaflo in #33146 <details> <summary>🔧 Fixes</summary> - [[MacOS 26] Text on picker options are not centered on macOS 26.1](#33229) </details> ## Progressbar - [Android] Implemented Material3 support for ProgressBar by @SyedAbdulAzeemSF4852 in #33926 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Progressbar](#33925) </details> ## RadioButton - [iOS, Mac] Fix for RadioButton TextColor for plain Content not working by @HarishwaranVijayakumar in #31940 <details> <summary>🔧 Fixes</summary> - [RadioButton: TextColor for plain Content not working on iOS](#18011) </details> - [All Platforms] Fix RadioButton warning when ControlTemplate is set with View content by @kubaflo in #33839 <details> <summary>🔧 Fixes</summary> - [Seeking clarification on RadioButton + ControlTemplate + Content documentation](#33829) </details> - Visual state change for disabled RadioButton by @kubaflo in #23471 <details> <summary>🔧 Fixes</summary> - [RadioButton disabled UI issue - iOS](#18668) </details> ## SafeArea - [Android] Fix for TabbedPage BottomNavigation BarBackgroundColor not extending to system navigation bar by @praveenkumarkarunanithi in #33428 <details> <summary>🔧 Fixes</summary> - [[Android] TabbedPage BottomNavigation BarBackgroundColor does not extend to system navigation bar area in Edge-to-Edge mode](#33344) </details> ## ScrollView - [Android] ScrollView: Fix HorizontalScrollBarVisibility not updating immediately at runtime by @SubhikshaSf4851 in #33528 <details> <summary>🔧 Fixes</summary> - [Runtime Scrollbar visibility not updating correctly on Android and macOS platforms.](#33400) </details> - Fixed crash when calling ItemsView.ScrollTo on unloaded CollectionView by @kubaflo in #25444 <details> <summary>🔧 Fixes</summary> - [App crashes when calling ItemsView.ScrollTo on unloaded CollectionView](#23014) </details> ## Shell - [Shell] Update logic for iOS large title display in ShellItemRenderer by @kubaflo in #33246 - [iOS][Shell] Fix navigation lifecycle and back button for More tab (>5 tabs) by @kubaflo in #27932 <details> <summary>🔧 Fixes</summary> - [OnAppearing and OnNavigatedTo does not work when using extended Tabbar (tabbar with more than 5 tabs) on IOS.](#27799) - [Shell.BackButtonBehavior does not work when using extended Tabbar (tabbar with more than 5 tabs)on IOS.](#27800) - [Shell TabBar More button causes ViewModel command binding disconnection on back navigation](#30862) - [Content page onappearing not firing if tabs are on the more tab on IOS](#31166) </details> - [iOS 26] Fix tab bar ghosting when navigating from modal to tabbed Shell content by @SubhikshaSf4851 in #34254 <details> <summary>🔧 Fixes</summary> - [[iOS] Tab bar ghosting issue on iOS 26 (liquid glass)](#34143) </details> - Fix for Shell tab visibility not updating when navigating back multiple pages by @BagavathiPerumal in #34403 <details> <summary>🔧 Fixes</summary> - [Changing Shell Tab Visibility when navigating back multiple pages ignores Shell Tab Visibility](#33351) </details> - [iOS/Mac] Fixed OnBackButtonPressed not firing for Shell Navigation Bar Button by @Dhivya-SF4094 in #34401 <details> <summary>🔧 Fixes</summary> - [[iOS] OnBackButtonPressed not firing for Shell Navigation Bar button](#34190) </details> ## Slider - [iOS] Fix for Slider ThumbImageSource is not centered properly on iOS 26 by @HarishwaranVijayakumar in #34019 <details> <summary>🔧 Fixes</summary> - [[iOS 26] Slider ThumbImageSource is not centered properly](#33967) </details> - [Android] Fix improper rendering of ThumbimageSource in Slider by @NirmalKumarYuvaraj in #34064 <details> <summary>🔧 Fixes</summary> - [[Slider] MAUI Slider thumb image is big on android](#13258) </details> ## Stepper - [iOS] Fix Stepper layout overlap in landscape on iOS 26 by @Vignesh-SF3580 in #34325 <details> <summary>🔧 Fixes</summary> - [[.NET10] D10 - Customize cursor position - Rotating simulator makes the button and label overlap](#34273) </details> ## SwipeView - [iOS] SwipeView: Honor FontImageSource.Color in SwipeItem icon by @kubaflo in #27389 <details> <summary>🔧 Fixes</summary> - [[iOS] SwipeView: SwipeItem.IconImageSource.FontImageSource color value not honored](#27377) </details> ## Switch - [Android] Fix Switch thumb shadow missing when ThumbColor is set by @Shalini-Ashokan in #33960 <details> <summary>🔧 Fixes</summary> - [Android Switch Control Thumb Shadow](#19676) </details> ## Toolbar - [iOS/Mac Catalyst 26] Fix Shell.ForegroundColor not applied to ToolbarItems by @SyedAbdulAzeemSF4852 in #34085 <details> <summary>🔧 Fixes</summary> - [[iOS26] Shell.ForegroundColor is not applied to ToolbarItems](#34083) </details> - [Android] VoiceOver on Toolbar Item by @kubaflo in #29596 <details> <summary>🔧 Fixes</summary> - [VoiceOver on Toolbar Item](#29573) - [SemanticProperties do not work on ToolbarItems](#23623) </details> <details> <summary>🧪 Testing (11)</summary> - [Testing] Additional Feature Matrix Test Cases for CollectionView by @TamilarasanSF4853 in #32432 - [Testing] Feature Matrix UITest Cases for VisualStateManager by @LogishaSelvarajSF4525 in #34146 - [Testing] Feature Matrix UITest Cases for Clip by @TamilarasanSF4853 in #34121 - [Testing] Feature matrix UITest Cases for Map Control by @HarishKumarSF4517 in #31656 - [Testing] Feature matrix UITest Cases for Visual Transform Control by @HarishKumarSF4517 in #32799 - [Testing] Feature Matrix UITest Cases for Shell Pages by @NafeelaNazhir in #33945 - [Testing] Feature Matrix UITest Cases for Triggers by @HarishKumarSF4517 in #34152 - [Testing] Refactoring Feature Matrix UITest Cases for CheckBox Control by @LogishaSelvarajSF4525 in #34283 - Resolve UI test Build Sample failures - Candidate March 16 by @Ahamed-Ali in #34442 - Fix the failures in the Candidate branch- March 16 by @Ahamed-Ali in #34453 <details> <summary>🔧 Fixes</summary> - [March 16th, Candidate](#34437) </details> - Fixed the iOS 18.5 Candidate failures (March 16,2026) by @Ahamed-Ali in #34593 <details> <summary>🔧 Fixes</summary> - [March 16th, Candidate](#34437) </details> </details> <details> <summary>📦 Other (2)</summary> - Fixed candidate test failures caused by PR #33428. by @Ahamed-Ali in #34515 <details> <summary>🔧 Fixes</summary> - [[.NET10] On Android, there's a big space at the top for I, M and N2 & N3](#34509) </details> - Revert "[iOS] Button RTL text and image overlap - fix (#29041)" in b0497af </details> <details> <summary>📝 Issue References</summary> Fixes #2574, Fixes #4993, Fixes #8486, Fixes #13258, Fixes #14160, Fixes #14364, Fixes #17799, Fixes #18011, Fixes #18668, Fixes #19676, Fixes #21044, Fixes #22938, Fixes #23014, Fixes #23623, Fixes #24450, Fixes #26187, Fixes #26726, Fixes #27377, Fixes #27799, Fixes #27800, Fixes #28656, Fixes #28784, Fixes #28968, Fixes #29141, Fixes #29394, Fixes #29535, Fixes #29573, Fixes #29921, Fixes #30085, Fixes #30347, Fixes #30363, Fixes #30837, Fixes #30862, Fixes #31166, Fixes #31239, Fixes #31259, Fixes #32016, Fixes #32200, Fixes #32312, Fixes #32650, Fixes #33114, Fixes #33201, Fixes #33229, Fixes #33316, Fixes #33344, Fixes #33351, Fixes #33400, Fixes #33407, Fixes #33479, Fixes #33660, Fixes #33722, Fixes #33829, Fixes #33925, Fixes #33966, Fixes #33967, Fixes #34083, Fixes #34143, Fixes #34190, Fixes #34247, Fixes #34273, Fixes #34278, Fixes #34437, Fixes #34509, Fixes #34512 </details> **Full Changelog**: main...inflight/candidate
### Description of Change - This pull request updates the handling of `ProgressBar` controls on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars. **Android ProgressBar Material3 Support:** * Added a new internal handler `ProgressBarHandler2` that uses `LinearProgressIndicator` from Material3 for progress bars when Material3 is enabled. (`src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs`) * Updated `AddControlsHandlers` in `AppHostBuilderExtensions.cs` to register `ProgressBarHandler2` instead of the default handler when Material3 is enabled, preserving the original handler otherwise. **ProgressBar Color Customization:** * Enhanced `ProgressBarExtensions.UpdateProgressColor` to delegate color updates to a new method for Material3 progress bars (`UpdateLinearProgressIndicatorColor`) or fall back to the native color update for standard progress bars. * Implemented `UpdateLinearProgressIndicatorColor` for `LinearProgressIndicator`, supporting theme default fallback and custom color arrays. * Added necessary Material3 imports to `ProgressBarExtensions.cs`. Material Design Spec - [ProgressBar](https://m3.material.io/components/progress-indicators/overview) ### Issues Fixed Fixes dotnet#33925 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/8f3fdd37-f595-4960-86ef-32ea3ab58d43"> | <img src="https://github.com/user-attachments/assets/9472e959-953f-49a2-ad2a-0fad823f4cb9"> |


Description of Change
ProgressBarcontrols on Android to support Material3 styling when the feature is enabled. It introduces a new handler, updates the registration logic, and extends color update support for Material3 progress bars.Android ProgressBar Material3 Support:
ProgressBarHandler2that usesLinearProgressIndicatorfrom Material3 for progress bars when Material3 is enabled. (src/Core/src/Handlers/ProgressBar/ProgressBarHandler2.Android.cs)AddControlsHandlersinAppHostBuilderExtensions.csto registerProgressBarHandler2instead of the default handler when Material3 is enabled, preserving the original handler otherwise.ProgressBar Color Customization:
ProgressBarExtensions.UpdateProgressColorto delegate color updates to a new method for Material3 progress bars (UpdateLinearProgressIndicatorColor) or fall back to the native color update for standard progress bars.UpdateLinearProgressIndicatorColorforLinearProgressIndicator, supporting theme default fallback and custom color arrays.ProgressBarExtensions.cs.Material Design Spec - ProgressBar
Issues Fixed
Fixes #33925
Output