diff --git a/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs b/src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs index ecd58db7cae4..727663874bf4 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..ae9ace1cd561 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,41 @@ public static partial void MapColor(IActivityIndicatorHandler handler, IActivity handler.PlatformView?.UpdateColor(activityIndicator); } } -} \ No newline at end of file + + // TODO: material3 - make it public in .net 11 + internal class ActivityIndicatorHandler2 : ActivityIndicatorHandler + { + protected override MaterialActivityIndicator CreatePlatformView() + { + return new MaterialActivityIndicator(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); + } + } +} diff --git a/src/Core/src/Platform/Android/MaterialActivityIndicator.cs b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs new file mode 100644 index 000000000000..d60bb781bcd0 --- /dev/null +++ b/src/Core/src/Platform/Android/MaterialActivityIndicator.cs @@ -0,0 +1,45 @@ +using System; +using Android.Content; +using Android.Runtime; +using Android.Util; +using Google.Android.Material.ProgressIndicator; + +namespace Microsoft.Maui.Platform; + +// TODO: material3 - make it public in .net 11 +internal class MaterialActivityIndicator : CircularProgressIndicator +{ + public MaterialActivityIndicator(Context context) + : base(MauiMaterialContextThemeWrapper.Create(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) + { + // Calculate desired size including indicator size and padding + var desiredSize = + IndicatorSize + + Math.Max(PaddingLeft + PaddingRight, PaddingTop + PaddingBottom); + + var width = ResolveSize(desiredSize, widthMeasureSpec); + var height = ResolveSize(desiredSize, heightMeasureSpec); + + // ActivityIndicator must always be square + var finalSize = Math.Min(width, height); + + SetMeasuredDimension(finalSize, finalSize); + } +}