From 7663e233b4368b56d0b7078a8b620e551eace963 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Mon, 12 Jan 2026 19:04:12 +0530 Subject: [PATCH 1/7] Implemented material3 support for ActivityIndicator --- .../Core/Hosting/AppHostBuilderExtensions.cs | 14 +++++- .../ActivityIndicatorHandler.Android.cs | 40 ++++++++++++++++- .../MaterialActivityIndicator.cs | 44 +++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs diff --git a/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs b/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs index ecd58db7cae4..c56b85fbc472 100644 --- a/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs +++ b/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs @@ -71,7 +71,6 @@ internal static IMauiHandlersCollection AddControlsHandlers(this IMauiHandlersCo handlersCollection.AddHandler(); #endif handlersCollection.AddHandler(); - handlersCollection.AddHandler(); handlersCollection.AddHandler(); handlersCollection.AddHandler(); handlersCollection.AddHandler(); @@ -95,6 +94,19 @@ internal static IMauiHandlersCollection AddControlsHandlers(this IMauiHandlersCo // NOTE: not registered under NativeAOT or TrimMode=Full scenarios handlersCollection.AddHandler(); } + +#if ANDROID + if (RuntimeFeature.IsMaterial3Enabled) + { + handlersCollection.AddHandler(); + } + else + { + handlersCollection.AddHandler(); + } +#else + handlersCollection.AddHandler(); +#endif handlersCollection.AddHandler(); handlersCollection.AddHandler(); handlersCollection.AddHandler(); diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs index eb643d760148..69788a95f0e4 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs @@ -1,4 +1,6 @@ -using Android.Widget; +using System; +using Android.Widget; +using Microsoft.Maui.Graphics; namespace Microsoft.Maui.Handlers { @@ -16,4 +18,40 @@ public static partial void MapColor(IActivityIndicatorHandler handler, IActivity handler.PlatformView?.UpdateColor(activityIndicator); } } + + internal partial class MaterialActivityIndicatorHandler : ActivityIndicatorHandler + { + protected override MaterialActivityIndicator CreatePlatformView() + { + return new MaterialActivityIndicator(MauiMaterialContextThemeWrapper.Create(Context)) + { + Indeterminate = true + }; + } + + public override void PlatformArrange(Rect frame) + { + if (Context == null || PlatformView == null) + { + return; + } + + // Get the child's desired size (what it measured at) + var desiredWidth = VirtualView?.DesiredSize.Width ?? frame.Width; + var desiredHeight = VirtualView?.DesiredSize.Height ?? frame.Height; + + // Constrain to desired size (don't let parent stretch us) + var constrainedWidth = Math.Min(frame.Width, desiredWidth); + var constrainedHeight = Math.Min(frame.Height, desiredHeight); + + // Create new frame with constrained size, centered if necessary + var arrangeFrame = new Rect( + frame.X + (frame.Width - constrainedWidth) / 2, + frame.Y + (frame.Height - constrainedHeight) / 2, + constrainedWidth, + constrainedHeight); + + base.PlatformArrange(arrangeFrame); + } + } } \ No newline at end of file diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs new file mode 100644 index 000000000000..d98749b1591f --- /dev/null +++ b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs @@ -0,0 +1,44 @@ +using System; +using Android.Content; +using Android.Runtime; +using Android.Util; +using Google.Android.Material.ProgressIndicator; + +namespace Microsoft.Maui.Platform; + +internal partial class MaterialActivityIndicator : CircularProgressIndicator +{ + public MaterialActivityIndicator(Context context) + : base(context) + { + } + + protected MaterialActivityIndicator(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + public MaterialActivityIndicator(Context context, IAttributeSet? attrs) : base(MauiMaterialContextThemeWrapper.Create(context), attrs) + { + } + + public MaterialActivityIndicator(Context context, IAttributeSet? attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) + { + + } + + protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + // Intrinsic desired size (Material2-aligned) + var desiredSize = + IndicatorSize + + PaddingLeft + PaddingRight; + + var width = ResolveSize(desiredSize, widthMeasureSpec); + var height = ResolveSize(desiredSize, heightMeasureSpec); + + // ActivityIndicator must always be square + var finalSize = Math.Min(width, height); + + SetMeasuredDimension(finalSize, finalSize); + } +} \ No newline at end of file From 9b2c909e6233ff8dfbf23f0f2d32ffdf2c3c78c2 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Tue, 13 Jan 2026 09:59:27 +0530 Subject: [PATCH 2/7] Updated MaterialActivityIndicator --- .../Android/Material3Controls/MaterialActivityIndicator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs index d98749b1591f..8aa1c179c5b8 100644 --- a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs @@ -17,7 +17,7 @@ protected MaterialActivityIndicator(nint javaReference, JniHandleOwnership trans { } - public MaterialActivityIndicator(Context context, IAttributeSet? attrs) : base(MauiMaterialContextThemeWrapper.Create(context), attrs) + public MaterialActivityIndicator(Context context, IAttributeSet? attrs) : base(context, attrs) { } From 9c15bac28f555b9d53e1a6933caebd357f7c6030 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:37:42 +0530 Subject: [PATCH 3/7] Added todo comment and update file name --- src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs | 2 +- .../ActivityIndicator/ActivityIndicatorHandler.Android.cs | 5 +++-- .../Android/Material3Controls/MaterialActivityIndicator.cs | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs b/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs index c56b85fbc472..727663874bf4 100644 --- a/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs +++ b/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs @@ -98,7 +98,7 @@ internal static IMauiHandlersCollection AddControlsHandlers(this IMauiHandlersCo #if ANDROID if (RuntimeFeature.IsMaterial3Enabled) { - handlersCollection.AddHandler(); + handlersCollection.AddHandler(); } else { diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs index 69788a95f0e4..ea78c027f351 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs @@ -19,11 +19,12 @@ public static partial void MapColor(IActivityIndicatorHandler handler, IActivity } } - internal partial class MaterialActivityIndicatorHandler : ActivityIndicatorHandler + // TODO: material3 - make it public in .net 11 + internal partial class ActivityIndicatorHandler2 : ActivityIndicatorHandler { protected override MaterialActivityIndicator CreatePlatformView() { - return new MaterialActivityIndicator(MauiMaterialContextThemeWrapper.Create(Context)) + return new MaterialActivityIndicator(Context) { Indeterminate = true }; diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs index 8aa1c179c5b8..d4e67bc36ad9 100644 --- a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs @@ -6,10 +6,11 @@ namespace Microsoft.Maui.Platform; +// TODO: material3 - make it public in .net 11 internal partial class MaterialActivityIndicator : CircularProgressIndicator { public MaterialActivityIndicator(Context context) - : base(context) + : base(MauiMaterialContextThemeWrapper.Create(context)) { } From 9aa0ce898c26b5c1b330d8d5b282b51eeb104016 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Mon, 19 Jan 2026 13:00:21 +0530 Subject: [PATCH 4/7] Addressed review concern --- .../Android/Material3Controls/MaterialActivityIndicator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs index d4e67bc36ad9..7f98723eec04 100644 --- a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs @@ -29,10 +29,10 @@ public MaterialActivityIndicator(Context context, IAttributeSet? attrs, int defS protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Intrinsic desired size (Material2-aligned) + // Calculate desired size including indicator size and padding var desiredSize = IndicatorSize + - PaddingLeft + PaddingRight; + Math.Max(PaddingLeft + PaddingRight, PaddingTop + PaddingBottom); var width = ResolveSize(desiredSize, widthMeasureSpec); var height = ResolveSize(desiredSize, heightMeasureSpec); From 076180e105180ad56eb3d58a67ce71fb710f4ba5 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Thu, 22 Jan 2026 18:13:59 +0530 Subject: [PATCH 5/7] Updated ActivityIndicatorhandler --- .../ActivityIndicator/ActivityIndicatorHandler.Android.cs | 2 +- .../Android/Material3Controls/MaterialActivityIndicator.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs index ea78c027f351..cba2e05cf4fa 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs @@ -20,7 +20,7 @@ public static partial void MapColor(IActivityIndicatorHandler handler, IActivity } // TODO: material3 - make it public in .net 11 - internal partial class ActivityIndicatorHandler2 : ActivityIndicatorHandler + internal class ActivityIndicatorHandler2 : ActivityIndicatorHandler { protected override MaterialActivityIndicator CreatePlatformView() { diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs index 7f98723eec04..1477bcf4d103 100644 --- a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs @@ -18,7 +18,7 @@ protected MaterialActivityIndicator(nint javaReference, JniHandleOwnership trans { } - public MaterialActivityIndicator(Context context, IAttributeSet? attrs) : base(context, attrs) + public MaterialActivityIndicator(Context context, IAttributeSet? attrs) : base(MauiMaterialContextThemeWrapper.Create(context), attrs) { } From 5f08becb6797dbde1364b973b7cf9e403568d47f Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:26:49 +0530 Subject: [PATCH 6/7] Refactored MaterialAcitivityIndicator.cs. and addressed AI summary --- .../ActivityIndicator/ActivityIndicatorHandler.Android.cs | 2 +- .../{Material3Controls => }/MaterialActivityIndicator.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/Core/src/Platform/Android/{Material3Controls => }/MaterialActivityIndicator.cs (99%) diff --git a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs index cba2e05cf4fa..ae9ace1cd561 100644 --- a/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs +++ b/src/Core/src/Handlers/ActivityIndicator/ActivityIndicatorHandler.Android.cs @@ -55,4 +55,4 @@ public override void PlatformArrange(Rect frame) base.PlatformArrange(arrangeFrame); } } -} \ No newline at end of file +} diff --git a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs similarity index 99% rename from src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs rename to src/Core/src/Platform/Android/MaterialActivityIndicator.cs index 1477bcf4d103..2c380df5ff2e 100644 --- a/src/Core/src/Platform/Android/Material3Controls/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs @@ -42,4 +42,4 @@ protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) SetMeasuredDimension(finalSize, finalSize); } -} \ No newline at end of file +} From 01ed85771601c081507029f7875f47fb62e70503 Mon Sep 17 00:00:00 2001 From: Dhivya-SF4094 <127717131+Dhivya-SF4094@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:57:40 +0530 Subject: [PATCH 7/7] Removed partial --- src/Core/src/Platform/Android/MaterialActivityIndicator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Android/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs index 2c380df5ff2e..d60bb781bcd0 100644 --- a/src/Core/src/Platform/Android/MaterialActivityIndicator.cs +++ b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs @@ -7,7 +7,7 @@ namespace Microsoft.Maui.Platform; // TODO: material3 - make it public in .net 11 -internal partial class MaterialActivityIndicator : CircularProgressIndicator +internal class MaterialActivityIndicator : CircularProgressIndicator { public MaterialActivityIndicator(Context context) : base(MauiMaterialContextThemeWrapper.Create(context))