Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ internal static IMauiHandlersCollection AddControlsHandlers(this IMauiHandlersCo
handlersCollection.AddHandler<CarouselView, CarouselViewHandler>();
#endif
handlersCollection.AddHandler<Application, ApplicationHandler>();
handlersCollection.AddHandler<ActivityIndicator, ActivityIndicatorHandler>();
handlersCollection.AddHandler<BoxView, BoxViewHandler>();
handlersCollection.AddHandler<Button, ButtonHandler>();
handlersCollection.AddHandler<DatePicker, DatePickerHandler>();
Expand All @@ -95,6 +94,19 @@ internal static IMauiHandlersCollection AddControlsHandlers(this IMauiHandlersCo
// NOTE: not registered under NativeAOT or TrimMode=Full scenarios
handlersCollection.AddHandler<HybridWebView, HybridWebViewHandler>();
}

#if ANDROID
if (RuntimeFeature.IsMaterial3Enabled)
{
handlersCollection.AddHandler<ActivityIndicator, ActivityIndicatorHandler2>();
}
else
{
handlersCollection.AddHandler<ActivityIndicator, ActivityIndicatorHandler>();
}
#else
handlersCollection.AddHandler<ActivityIndicator, ActivityIndicatorHandler>();
#endif
handlersCollection.AddHandler<Border, BorderHandler>();
handlersCollection.AddHandler<IContentView, ContentViewHandler>();
handlersCollection.AddHandler<ContentView, ContentViewHandler>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using Android.Widget;
using System;
using Android.Widget;
using Microsoft.Maui.Graphics;

namespace Microsoft.Maui.Handlers
{
Expand All @@ -16,4 +18,41 @@ public static partial void MapColor(IActivityIndicatorHandler handler, IActivity
handler.PlatformView?.UpdateColor(activityIndicator);
}
}
}

// 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);
}
}
}
45 changes: 45 additions & 0 deletions src/Core/src/Platform/Android/MaterialActivityIndicator.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading