From a730258240d9e2ad8d0509e9e87fa96ff2c37c5d Mon Sep 17 00:00:00 2001 From: Jaden Date: Sat, 8 Mar 2025 06:08:08 +1300 Subject: [PATCH] Fix NullReferenceException in PaintExtensions.IsSolid on Android (#28116) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix NullReferenceException in PaintExtensions.IsSolid on Android Added null check to prevent crash when SolidPaint is null, addressing issue seen in Border rendering on Android. * - simplify * Updated IsSolid methods using linear and radial gradients * A few new tests * Changes based on feedback. Use the IsNullOrEmpty method * More changes * Fix test * More changes --------- Co-authored-by: Shane Neuville Co-authored-by: Javier Suárez --- .../src/Graphics/PaintExtensions.Android.cs | 13 +++------ .../Graphics/GraphicsTests.Android.cs | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Core/src/Graphics/PaintExtensions.Android.cs b/src/Core/src/Graphics/PaintExtensions.Android.cs index 6cf92e450144..7ae548ace8f5 100644 --- a/src/Core/src/Graphics/PaintExtensions.Android.cs +++ b/src/Core/src/Graphics/PaintExtensions.Android.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Android.Content; using Android.Content.Res; @@ -84,17 +84,12 @@ internal static bool IsSolid(this AColor color) internal static bool IsSolid(this SolidPaint paint) { - return paint.Color.Alpha == 1; + return !paint.IsNullOrEmpty() && paint.Color.Alpha == 1; } - internal static bool IsSolid(this LinearGradientPaint paint) + internal static bool IsSolid(this GradientPaint paint) { - return paint.GradientStops.All(s => s.Color.Alpha == 1); - } - - internal static bool IsSolid(this RadialGradientPaint paint) - { - return paint.GradientStops.All(s => s.Color.Alpha == 1); + return !paint.IsNullOrEmpty() && paint.GradientStops.All(s => s.Color?.Alpha == 1); } internal static bool IsValid(this GradientPaint? gradientPaint) => diff --git a/src/Core/tests/DeviceTests/Graphics/GraphicsTests.Android.cs b/src/Core/tests/DeviceTests/Graphics/GraphicsTests.Android.cs index 3236a2d1fc49..b5d5607c648c 100644 --- a/src/Core/tests/DeviceTests/Graphics/GraphicsTests.Android.cs +++ b/src/Core/tests/DeviceTests/Graphics/GraphicsTests.Android.cs @@ -154,6 +154,19 @@ public void SolidPaintTest(string hexColor) Assert.True(solidPaint.IsSolid()); } + [Fact] + public void NullSolidPaintTest() + { + Color nullColor = null; + var solidPaintNullColor = new SolidPaint(nullColor); + + Assert.False(solidPaintNullColor.IsSolid()); + + SolidPaint nullSolidPaint = null; + + Assert.False(nullSolidPaint.IsSolid()); + } + [Theory] [InlineData("#FF0000", "#00FF00")] [InlineData("#00FF00", "#0000FF")] @@ -167,6 +180,14 @@ public void LinearGradientPaintTest(string startHexColor, string endHexColor) Assert.True(linearGradientPaint.IsSolid()); } + [Fact] + public void NullLinearGradientPaintTest() + { + LinearGradientPaintStub nullLinearGradientPaint = null; + + Assert.False(nullLinearGradientPaint.IsSolid()); + } + [Theory] [InlineData("#FF0000", "#00FF00")] [InlineData("#00FF00", "#0000FF")] @@ -179,4 +200,12 @@ public void RadialGradientPaintTest(string startHexColor, string endHexColor) Assert.True(radialGradientPaint.IsSolid()); } + + [Fact] + public void NullRadialGradientPaintTest() + { + RadialGradientPaintStub nullRadialGradientPaint = null; + + Assert.False(nullRadialGradientPaint.IsSolid()); + } } \ No newline at end of file