Skip to content

Android drawable perf#31567

Merged
jfversluis merged 15 commits intodotnet:inflight/currentfrom
albyrock87:android-drawable-perf
Mar 2, 2026
Merged

Android drawable perf#31567
jfversluis merged 15 commits intodotnet:inflight/currentfrom
albyrock87:android-drawable-perf

Conversation

@albyrock87
Copy link
Copy Markdown
Contributor

@albyrock87 albyrock87 commented Sep 11, 2025

Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing android views, and Java -> C# is not.

This PR tries to do its best to completely move the logic into a java PlatformDrawable class.

Benchmarks (~50% improvements in mapping, ~60% improvement in rendering time)

I used #24414 as main page wrapped into a Shell component given it has a drawChild method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!

24414-net10.json
image
image
image

24414-pr-final2.json
image
image
image

@dotnet-policy-service dotnet-policy-service bot added the community ✨ Community Contribution label Sep 11, 2025
@albyrock87 albyrock87 changed the base branch from main to net10.0 September 11, 2025 09:39
@jfversluis
Copy link
Copy Markdown
Member

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 3 pipeline(s).

@jsuarezruiz jsuarezruiz added area-drawing Shapes, Borders, Shadows, Graphics, BoxView, custom drawing perf/general The issue affects performance (runtime speed, memory usage, startup time, etc.) (sub: perf) labels Sep 11, 2025
Copy link
Copy Markdown
Contributor

@jsuarezruiz jsuarezruiz left a comment

Choose a reason for hiding this comment

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

There are some related failing tests:
image

Differences between snapshots. Based on the failing tests, seems like not apply dynamic changes (like a dynamic binding for example. Could you review it? Let me know if can help with something.

@albyrock87 albyrock87 force-pushed the android-drawable-perf branch 4 times, most recently from a042aaa to 10fd93f Compare September 11, 2025 20:08
@albyrock87
Copy link
Copy Markdown
Contributor Author

@jsuarezruiz you can run AZP again.. though initially I had 80% perf improvement, but now with the last force push it's like 0%.. anyway I'm curious about UI tests failures.

So I must have done something wrong, or I must have missed some caching opportunity.
I'll try to look at this again tomorrow.

@albyrock87 albyrock87 force-pushed the android-drawable-perf branch from 10fd93f to 5f10e1a Compare September 12, 2025 07:33
@albyrock87
Copy link
Copy Markdown
Contributor Author

albyrock87 commented Sep 12, 2025

@jsuarezruiz I've pushed another commit, and this time the timing looks better but not what I wanted/expected.

There's only a 3ms performance gain.. now maybe this becomes much higher with a real world complex app, but I hoped to achieve something more.

Please run /azp

@albyrock87
Copy link
Copy Markdown
Contributor Author

Wait, I found another issue.

@albyrock87 albyrock87 force-pushed the android-drawable-perf branch 2 times, most recently from fee1cbf to 6a5f850 Compare September 12, 2025 10:27
@albyrock87
Copy link
Copy Markdown
Contributor Author

@jsuarezruiz this is now ready, I've updated all the benchmarks in the description

@albyrock87 albyrock87 marked this pull request as ready for review September 12, 2025 10:43
@albyrock87 albyrock87 requested a review from a team as a code owner September 12, 2025 10:43
@PureWeen
Copy link
Copy Markdown
Member

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 3 pipeline(s).

@albyrock87
Copy link
Copy Markdown
Contributor Author

albyrock87 commented Sep 13, 2025

@jsuarezruiz @PureWeen the PR is now ready, I added a few commits with the fixes and updated screenshots, here's a summary:

  • IShape can change even without changing instance (because Shape is a bindable property) so for performance reasons, I've introduced an internal IVersionedShape so that the MauiDrawable can still avoid some calls and retain the expected performance
  • Screenshots are different because I finally fixed the bug where the default stroke color was black on Android (you can verify other platforms and you will see the border is transparent unless the developer specifies a color)
  • Fixed gradients not working

@mattleibow
Copy link
Copy Markdown
Member

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 3 pipeline(s).

@PureWeen
Copy link
Copy Markdown
Member

PureWeen commented Sep 13, 2025

/azp run

@PureWeen
Copy link
Copy Markdown
Member

PureWeen commented Feb 25, 2026

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

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 2 pipeline(s).

@sheiksyedm
Copy link
Copy Markdown
Contributor

@albyrock87 After applying the last commit, a Shadow on a Border without an explicit background causes the shadow brush to visually fill the entire background, which leads to the uitest RadioButtonUpdateValueInsideBorder failure. You can reproduce the issue using the simple code provided below. Can you review this failure?

<Border StrokeShape="RoundRectangle 16"
                    StrokeThickness="1"
                    Padding="20,16"
                    Shadow="{Shadow Brush=Gray, Offset='4,4', Radius=12, Opacity=0.5}">
                <Label Text="Shadow Test"
                       FontSize="20"
                       FontAttributes="Bold"
                       HorizontalOptions="Center"/>

</Border>
image

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 31567

Or

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

@albyrock87
Copy link
Copy Markdown
Contributor Author

albyrock87 commented Feb 27, 2026

So it turns out that on main there was always a big mistake

public static int getWindowBackgroundColor(Context context)
{
TypedValue value = new TypedValue();
if (!context.getTheme().resolveAttribute(android.R.attr.windowBackground, value, true) && isColorType(value)) {
return value.data;
} else {
return -1;
}
}

As you can see there is a ! in front of context.getTheme().resolveAttribute which is obviously wrong.
In my code this was correct, but I had another bug which I fixed in the last commit.

Correcting my bug though created a different behavior because the code on main has never worked 🐛

Given this never worked, I have completely removed the theme-related code which makes everything work fine and the code cleaner.

You can see the changes in my last commit.

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 2 pipeline(s).

@github-project-automation github-project-automation bot moved this from Changes Requested to Approved in MAUI SDK Ongoing Mar 2, 2026
@jfversluis jfversluis changed the base branch from main to inflight/current March 2, 2026 09:27
@jfversluis jfversluis merged commit 48c7d87 into dotnet:inflight/current Mar 2, 2026
2 of 11 checks passed
@github-project-automation github-project-automation bot moved this from Approved to Done in MAUI SDK Ongoing Mar 2, 2026
jfversluis added a commit that referenced this pull request Mar 2, 2026
### Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing
android views, and `Java -> C#` is not.

This PR tries to do its best to completely move the logic into a java
`PlatformDrawable` class.


### Benchmarks (~50% improvements in mapping, ~60% improvement in
rendering time)

I used #24414 as main page wrapped into a `Shell` component given it has
a `drawChild` method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!


[24414-net10.json](https://github.com/user-attachments/files/22296183/24414-net10.json)
<img width="754" height="144" alt="image"
src="https://github.com/user-attachments/assets/834b59e0-77f9-457c-9867-179b91f116d0"
/>
<img width="749" height="46" alt="image"
src="https://github.com/user-attachments/assets/5ecf5252-10c8-42e8-85f0-b94dfd60746b"
/>
<img width="752" height="124" alt="image"
src="https://github.com/user-attachments/assets/04d78a16-f22d-4ff1-ab5f-b34316c7240a"
/>


[24414-pr-final2.json](https://github.com/user-attachments/files/22403331/24414-pr-final2.json)
<img width="1106" height="122" alt="image"
src="https://github.com/user-attachments/assets/bc59bef4-9e2f-4626-b399-7ab0b3b44cd0"
/>
<img width="918" height="104" alt="image"
src="https://github.com/user-attachments/assets/caca6cba-69c4-4949-b7df-cac5ceccb6d9"
/>
<img width="903" height="123" alt="image"
src="https://github.com/user-attachments/assets/2b6e9b52-c347-43d8-abec-061263739724"
/>

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
jfversluis added a commit that referenced this pull request Mar 2, 2026
### Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing
android views, and `Java -> C#` is not.

This PR tries to do its best to completely move the logic into a java
`PlatformDrawable` class.


### Benchmarks (~50% improvements in mapping, ~60% improvement in
rendering time)

I used #24414 as main page wrapped into a `Shell` component given it has
a `drawChild` method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!


[24414-net10.json](https://github.com/user-attachments/files/22296183/24414-net10.json)
<img width="754" height="144" alt="image"
src="https://github.com/user-attachments/assets/834b59e0-77f9-457c-9867-179b91f116d0"
/>
<img width="749" height="46" alt="image"
src="https://github.com/user-attachments/assets/5ecf5252-10c8-42e8-85f0-b94dfd60746b"
/>
<img width="752" height="124" alt="image"
src="https://github.com/user-attachments/assets/04d78a16-f22d-4ff1-ab5f-b34316c7240a"
/>


[24414-pr-final2.json](https://github.com/user-attachments/files/22403331/24414-pr-final2.json)
<img width="1106" height="122" alt="image"
src="https://github.com/user-attachments/assets/bc59bef4-9e2f-4626-b399-7ab0b3b44cd0"
/>
<img width="918" height="104" alt="image"
src="https://github.com/user-attachments/assets/caca6cba-69c4-4949-b7df-cac5ceccb6d9"
/>
<img width="903" height="123" alt="image"
src="https://github.com/user-attachments/assets/2b6e9b52-c347-43d8-abec-061263739724"
/>

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
github-actions bot pushed a commit that referenced this pull request Mar 3, 2026
### Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing
android views, and `Java -> C#` is not.

This PR tries to do its best to completely move the logic into a java
`PlatformDrawable` class.


### Benchmarks (~50% improvements in mapping, ~60% improvement in
rendering time)

I used #24414 as main page wrapped into a `Shell` component given it has
a `drawChild` method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!


[24414-net10.json](https://github.com/user-attachments/files/22296183/24414-net10.json)
<img width="754" height="144" alt="image"
src="https://github.com/user-attachments/assets/834b59e0-77f9-457c-9867-179b91f116d0"
/>
<img width="749" height="46" alt="image"
src="https://github.com/user-attachments/assets/5ecf5252-10c8-42e8-85f0-b94dfd60746b"
/>
<img width="752" height="124" alt="image"
src="https://github.com/user-attachments/assets/04d78a16-f22d-4ff1-ab5f-b34316c7240a"
/>


[24414-pr-final2.json](https://github.com/user-attachments/files/22403331/24414-pr-final2.json)
<img width="1106" height="122" alt="image"
src="https://github.com/user-attachments/assets/bc59bef4-9e2f-4626-b399-7ab0b3b44cd0"
/>
<img width="918" height="104" alt="image"
src="https://github.com/user-attachments/assets/caca6cba-69c4-4949-b7df-cac5ceccb6d9"
/>
<img width="903" height="123" alt="image"
src="https://github.com/user-attachments/assets/2b6e9b52-c347-43d8-abec-061263739724"
/>

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
HarishKumarSF4517 pushed a commit to HarishKumarSF4517/maui that referenced this pull request Mar 5, 2026
### Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing
android views, and `Java -> C#` is not.

This PR tries to do its best to completely move the logic into a java
`PlatformDrawable` class.


### Benchmarks (~50% improvements in mapping, ~60% improvement in
rendering time)

I used dotnet#24414 as main page wrapped into a `Shell` component given it has
a `drawChild` method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!


[24414-net10.json](https://github.com/user-attachments/files/22296183/24414-net10.json)
<img width="754" height="144" alt="image"
src="https://github.com/user-attachments/assets/834b59e0-77f9-457c-9867-179b91f116d0"
/>
<img width="749" height="46" alt="image"
src="https://github.com/user-attachments/assets/5ecf5252-10c8-42e8-85f0-b94dfd60746b"
/>
<img width="752" height="124" alt="image"
src="https://github.com/user-attachments/assets/04d78a16-f22d-4ff1-ab5f-b34316c7240a"
/>


[24414-pr-final2.json](https://github.com/user-attachments/files/22403331/24414-pr-final2.json)
<img width="1106" height="122" alt="image"
src="https://github.com/user-attachments/assets/bc59bef4-9e2f-4626-b399-7ab0b3b44cd0"
/>
<img width="918" height="104" alt="image"
src="https://github.com/user-attachments/assets/caca6cba-69c4-4949-b7df-cac5ceccb6d9"
/>
<img width="903" height="123" alt="image"
src="https://github.com/user-attachments/assets/2b6e9b52-c347-43d8-abec-061263739724"
/>

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
jfversluis pushed a commit that referenced this pull request Mar 6, 2026
… - 1 (#34334)

This PR addresses the UI test image failures that occurred in the
inflight/candidate branch #34294 and
includes updates to improve rendering and test stability across
platforms.

### Controls Handler Registration

* Simplified the logic for registering handlers for controls like
`Label`, `Editor`, `Picker`, `RadioButton`, and `TimePicker` in
`AppHostBuilderExtensions.cs`. The new approach registers all fallback
handlers together, reducing duplicated code and improving
maintainability.

### 
* In the NavigationRootManager class, the line
_rootView.SetTitleBar(null, null); was added in this PR
#34032 by a contributor due to an AI
minor suggestion, but this line causes an issue when swapping pages, so
the TitlebarWorksWhenSwitchingPage test fails. Setting SetTitleBar to
null is already implemented in the WindowHandler class in the
[DisconnectHandler](https://github.com/dotnet/maui/blob/main/src/Core/src/Handlers/Window/WindowHandler.Windows.cs#L55)
method, so I have removed this line _rootView.SetTitleBar(null, null);
from the PR [34032](#34032).

### Image Resave:
* Resaved images: DownSizeImageAppearProperly,
Material3CheckBoxFeatureTests, Material3CheckBox_DefaultAppearance,
DownSizeImageAppearProperly,
VerifyLinearGradientBrushWithStrokeAndOpacity,
VerifyRadialGradientBrushWithOpacity,
VerifyRadialGradientBrushWithShadowAndOpacity,
VerifyLinearGradientBrushWithOpacity,
VerifyLinearGradientBrushWithShadowAndOpacity,
DarkTheme_VerifyVisualState. These PR fixes address the issues:
#33173,
#31567,
#33590,
#34036
* Added the base images for iOS 26, Mac, and Windows.

### Test Stability and Platform-Specific Handling

* Added a platform-specific ignore for a Shell flyout test on iOS 26 due
to a known bug, improving test reliability and clarity about platform
limitations.
* Updated a CollectionView scroll test to wait for specific elements on
Windows, ensuring the test works correctly across platforms.

### DatePicker Handler Tests

* Introduced a helper method `EnsureDialogCreated` in
`DatePickerHandlerTests.Android.cs` to reliably create the native dialog
before reading min/max values, addressing issues caused by lazy dialog
creation after a recent PR. This helper is now used in relevant tests to
improve robustness.
[[1]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R26)
[[2]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R54)
[[3]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R131-R146)
* Clarified the DatePicker test logic in `DatePickerTests.cs` to ensure
the `DateSelected` event fires correctly regardless of dialog state,
improving test reliability on Android.

### Test Case Organization

* Removed the obsolete `VerifyFlyoutPage_IsEnabled` test and renumbered
the remaining FlyoutPage tests in `FlyoutPageFeatureTests.cs` to
maintain sequential order and consistency.
[[1]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L176-R177)
[[2]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L204-R191)
[[3]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L222-R209)
[[4]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L240-R227)
[[5]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L254-R241)
[[6]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L268-R255)
[[7]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L284-R271)
[[8]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L299-R286)
[[9]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L310-R297)
[[10]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L327-R314)
[[11]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L340-R327)
[[12]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L357-R344)
[[13]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L376-R363)
[[14]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L387-R374)
[[15]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L400-R387)
github-actions bot pushed a commit that referenced this pull request Mar 6, 2026
### Description of Change

Backgrounds are everywhere in our apps, so we must be fast when drawing
android views, and `Java -> C#` is not.

This PR tries to do its best to completely move the logic into a java
`PlatformDrawable` class.


### Benchmarks (~50% improvements in mapping, ~60% improvement in
rendering time)

I used #24414 as main page wrapped into a `Shell` component given it has
a `drawChild` method which shows the cumulative draw time.

The results are impressive and will for sure make an impact!


[24414-net10.json](https://github.com/user-attachments/files/22296183/24414-net10.json)
<img width="754" height="144" alt="image"
src="https://github.com/user-attachments/assets/834b59e0-77f9-457c-9867-179b91f116d0"
/>
<img width="749" height="46" alt="image"
src="https://github.com/user-attachments/assets/5ecf5252-10c8-42e8-85f0-b94dfd60746b"
/>
<img width="752" height="124" alt="image"
src="https://github.com/user-attachments/assets/04d78a16-f22d-4ff1-ab5f-b34316c7240a"
/>


[24414-pr-final2.json](https://github.com/user-attachments/files/22403331/24414-pr-final2.json)
<img width="1106" height="122" alt="image"
src="https://github.com/user-attachments/assets/bc59bef4-9e2f-4626-b399-7ab0b3b44cd0"
/>
<img width="918" height="104" alt="image"
src="https://github.com/user-attachments/assets/caca6cba-69c4-4949-b7df-cac5ceccb6d9"
/>
<img width="903" height="123" alt="image"
src="https://github.com/user-attachments/assets/2b6e9b52-c347-43d8-abec-061263739724"
/>

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
github-actions bot pushed a commit that referenced this pull request Mar 6, 2026
… - 1 (#34334)

This PR addresses the UI test image failures that occurred in the
inflight/candidate branch #34294 and
includes updates to improve rendering and test stability across
platforms.

### Controls Handler Registration

* Simplified the logic for registering handlers for controls like
`Label`, `Editor`, `Picker`, `RadioButton`, and `TimePicker` in
`AppHostBuilderExtensions.cs`. The new approach registers all fallback
handlers together, reducing duplicated code and improving
maintainability.

### 
* In the NavigationRootManager class, the line
_rootView.SetTitleBar(null, null); was added in this PR
#34032 by a contributor due to an AI
minor suggestion, but this line causes an issue when swapping pages, so
the TitlebarWorksWhenSwitchingPage test fails. Setting SetTitleBar to
null is already implemented in the WindowHandler class in the
[DisconnectHandler](https://github.com/dotnet/maui/blob/main/src/Core/src/Handlers/Window/WindowHandler.Windows.cs#L55)
method, so I have removed this line _rootView.SetTitleBar(null, null);
from the PR [34032](#34032).

### Image Resave:
* Resaved images: DownSizeImageAppearProperly,
Material3CheckBoxFeatureTests, Material3CheckBox_DefaultAppearance,
DownSizeImageAppearProperly,
VerifyLinearGradientBrushWithStrokeAndOpacity,
VerifyRadialGradientBrushWithOpacity,
VerifyRadialGradientBrushWithShadowAndOpacity,
VerifyLinearGradientBrushWithOpacity,
VerifyLinearGradientBrushWithShadowAndOpacity,
DarkTheme_VerifyVisualState. These PR fixes address the issues:
#33173,
#31567,
#33590,
#34036
* Added the base images for iOS 26, Mac, and Windows.

### Test Stability and Platform-Specific Handling

* Added a platform-specific ignore for a Shell flyout test on iOS 26 due
to a known bug, improving test reliability and clarity about platform
limitations.
* Updated a CollectionView scroll test to wait for specific elements on
Windows, ensuring the test works correctly across platforms.

### DatePicker Handler Tests

* Introduced a helper method `EnsureDialogCreated` in
`DatePickerHandlerTests.Android.cs` to reliably create the native dialog
before reading min/max values, addressing issues caused by lazy dialog
creation after a recent PR. This helper is now used in relevant tests to
improve robustness.
[[1]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R26)
[[2]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R54)
[[3]](diffhunk://#diff-de28fdea458f311cfcc7e767c7e9e2a4c7c36e4d065ae2ebf2a25b420f183c29R131-R146)
* Clarified the DatePicker test logic in `DatePickerTests.cs` to ensure
the `DateSelected` event fires correctly regardless of dialog state,
improving test reliability on Android.

### Test Case Organization

* Removed the obsolete `VerifyFlyoutPage_IsEnabled` test and renumbered
the remaining FlyoutPage tests in `FlyoutPageFeatureTests.cs` to
maintain sequential order and consistency.
[[1]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L176-R177)
[[2]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L204-R191)
[[3]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L222-R209)
[[4]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L240-R227)
[[5]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L254-R241)
[[6]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L268-R255)
[[7]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L284-R271)
[[8]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L299-R286)
[[9]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L310-R297)
[[10]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L327-R314)
[[11]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L340-R327)
[[12]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L357-R344)
[[13]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L376-R363)
[[14]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L387-R374)
[[15]](diffhunk://#diff-a20c8165e92130c8ebbda3af607c3dd309cf1c1b6c85942abd6ed81132510fb3L400-R387)
PureWeen added a commit that referenced this pull request Mar 11, 2026
## 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
@github-actions github-actions bot locked and limited conversation to collaborators Apr 1, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-drawing Shapes, Borders, Shadows, Graphics, BoxView, custom drawing community ✨ Community Contribution perf/general The issue affects performance (runtime speed, memory usage, startup time, etc.) (sub: perf) platform/android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

9 participants