diff --git a/src/Controls/src/Core/Handlers/Items/Android/SizedItemContentView.cs b/src/Controls/src/Core/Handlers/Items/Android/SizedItemContentView.cs index 196d1725900f..edee39e99360 100644 --- a/src/Controls/src/Core/Handlers/Items/Android/SizedItemContentView.cs +++ b/src/Controls/src/Core/Handlers/Items/Android/SizedItemContentView.cs @@ -36,11 +36,11 @@ protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) if (Content.VirtualView.Handler is IPlatformViewHandler pvh) { - var widthSpec = Context.CreateMeasureSpec(targetWidth, + var (widthSpec, _, _) = Context.CreateMeasureSpec(targetWidth, double.IsInfinity(targetWidth) ? double.NaN : targetWidth , minimumSize: double.NaN, maximumSize: targetWidth); - var heightSpec = Context.CreateMeasureSpec(targetHeight, double.IsInfinity(targetHeight) ? double.NaN : targetHeight + var (heightSpec, _, _) = Context.CreateMeasureSpec(targetHeight, double.IsInfinity(targetHeight) ? double.NaN : targetHeight , minimumSize: double.NaN, maximumSize: targetHeight); var size = pvh.MeasureVirtualView(widthSpec, heightSpec); diff --git a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformContentViewGroup.java b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformContentViewGroup.java index b5844b64c5a4..4b5ba9afaf5c 100644 --- a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformContentViewGroup.java +++ b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformContentViewGroup.java @@ -6,7 +6,7 @@ import android.util.AttributeSet; import android.view.ViewGroup; -public abstract class PlatformContentViewGroup extends ViewGroup { +public abstract class PlatformContentViewGroup extends PlatformViewGroup { public PlatformContentViewGroup(Context context) { super(context); diff --git a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformViewGroup.java b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformViewGroup.java new file mode 100644 index 000000000000..52fb752080c8 --- /dev/null +++ b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformViewGroup.java @@ -0,0 +1,68 @@ +package com.microsoft.maui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Path; +import android.util.AttributeSet; +import android.view.ViewGroup; + +public abstract class PlatformViewGroup extends ViewGroup { + + private int lastWidthMeasureSpec; + private int lastHeightMeasureSpec; + private int measuredWidth; + private int measuredHeight; + private boolean hasValidMeasure; + + public PlatformViewGroup(Context context) { + super(context); + } + + public PlatformViewGroup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PlatformViewGroup(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public PlatformViewGroup(Context context, AttributeSet attrs, int defStyle, int defStyleRes) { + super(context, attrs, defStyle, defStyleRes); + } + + @Override + public void requestLayout() { + super.requestLayout(); + hasValidMeasure = false; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (hasValidMeasure && lastWidthMeasureSpec == widthMeasureSpec && lastHeightMeasureSpec == heightMeasureSpec) { + setMeasuredDimension(measuredWidth, measuredHeight); + return; + } + + doMeasure(widthMeasureSpec, heightMeasureSpec); + lastWidthMeasureSpec = widthMeasureSpec; + lastHeightMeasureSpec = heightMeasureSpec; + measuredWidth = getMeasuredWidth(); + measuredHeight = getMeasuredHeight(); + hasValidMeasure = true; + } + + protected abstract void doMeasure(int widthMeasureSpec, int heightMeasureSpec); + + public void quickMeasure(int widthMeasureSpec, int heightMeasureSpec, int measuredWidth, int measuredHeight) { + this.measuredWidth = measuredWidth; + this.measuredHeight = measuredHeight; + lastWidthMeasureSpec = widthMeasureSpec; + lastHeightMeasureSpec = heightMeasureSpec; + hasValidMeasure = true; + measure(widthMeasureSpec, heightMeasureSpec); + } + + public boolean needsMeasure(int widthMeasureSpec, int heightMeasureSpec) { + return !hasValidMeasure || lastWidthMeasureSpec != widthMeasureSpec || lastHeightMeasureSpec != heightMeasureSpec; + } +} diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cs index d96af44a080a..4eeb266fd7ec 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Android.cs @@ -45,8 +45,8 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra } // Create a spec to handle the native measure - var widthSpec = Context.CreateMeasureSpec(widthConstraint, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth); - var heightSpec = Context.CreateMeasureSpec(heightConstraint, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight); + var (widthSpec, _, _) = Context.CreateMeasureSpec(widthConstraint, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth); + var (heightSpec, _, _) = Context.CreateMeasureSpec(heightConstraint, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight); if (platformView.FillViewport) { diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.Android.cs b/src/Core/src/Handlers/ViewHandlerExtensions.Android.cs index 9002de76b149..df11d1e20c5e 100644 --- a/src/Core/src/Handlers/ViewHandlerExtensions.Android.cs +++ b/src/Core/src/Handlers/ViewHandlerExtensions.Android.cs @@ -88,12 +88,34 @@ internal static Size GetDesiredSizeFromHandler(this IViewHandler viewHandler, do } // Create a spec to handle the native measure - var widthSpec = context.CreateMeasureSpec(widthConstraint, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth); - var heightSpec = context.CreateMeasureSpec(heightConstraint, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight); + var (widthSpec, widthDp, widthExact) = context.CreateMeasureSpec(widthConstraint, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth); + var (heightSpec, heightDp, heightExact) = context.CreateMeasureSpec(heightConstraint, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight); + int measuredWidth, measuredHeight; - var packed = PlatformInterop.MeasureAndGetWidthAndHeight(platformView, widthSpec, heightSpec); - var measuredWidth = (int)(packed >> 32); - var measuredHeight = (int)(packed & 0xffffffffL); + if (platformView is ICrossPlatformLayoutBacking { CrossPlatformLayout: { } crossPlatformLayout } and IPlatformQuickLayout quickLayout && + quickLayout.NeedsMeasure(widthSpec, heightSpec)) + { + var measure = crossPlatformLayout.CrossPlatformMeasure(widthDp, heightDp); + + // If the measure spec was exact, we should return the explicit size value, even if the content + // measure came out to a different size + var measuredWidthDp = widthExact ? widthDp : measure.Width; + var measuredHeightDp = heightExact ? heightDp : measure.Height; + + measuredWidth = (int)context.ToPixels(measuredWidthDp); + measuredHeight = (int)context.ToPixels(measuredHeightDp); + + // Minimum values win over everything + measuredWidth = Math.Max(platformView.MinimumWidth, measuredWidth); + measuredHeight = Math.Max(platformView.MinimumHeight, measuredHeight); + quickLayout.QuickMeasure(widthSpec, heightSpec, measuredWidth, measuredHeight); + } + else + { + var packed = PlatformInterop.MeasureAndGetWidthAndHeight(platformView, widthSpec, heightSpec); + measuredWidth = (int)(packed >> 32); + measuredHeight = (int)(packed & 0xffffffffL); + } // Convert back to xplat sizes for the return value return context.FromPixels(measuredWidth, measuredHeight); diff --git a/src/Core/src/Platform/Android/ContentViewGroup.cs b/src/Core/src/Platform/Android/ContentViewGroup.cs index fc290a3a4d93..89491f128c8c 100644 --- a/src/Core/src/Platform/Android/ContentViewGroup.cs +++ b/src/Core/src/Platform/Android/ContentViewGroup.cs @@ -9,7 +9,7 @@ namespace Microsoft.Maui.Platform { - public class ContentViewGroup : PlatformContentViewGroup, ICrossPlatformLayoutBacking, IVisualTreeElementProvidable + public class ContentViewGroup : PlatformContentViewGroup, ICrossPlatformLayoutBacking, IVisualTreeElementProvidable, IPlatformQuickLayout { IBorderStroke? _clip; readonly Context _context; @@ -56,36 +56,36 @@ Graphics.Size CrossPlatformArrange(Graphics.Rect bounds) return CrossPlatformLayout?.CrossPlatformArrange(bounds) ?? Graphics.Size.Zero; } - protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - if (CrossPlatformLayout is null) - { - base.OnMeasure(widthMeasureSpec, heightMeasureSpec); - return; - } - - var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); - var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); - - var widthMode = MeasureSpec.GetMode(widthMeasureSpec); - var heightMode = MeasureSpec.GetMode(heightMeasureSpec); - - var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); - - // If the measure spec was exact, we should return the explicit size value, even if the content - // measure came out to a different size - var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; - var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; - - var platformWidth = _context.ToPixels(width); - var platformHeight = _context.ToPixels(height); - - // Minimum values win over everything - platformWidth = Math.Max(MinimumWidth, platformWidth); - platformHeight = Math.Max(MinimumHeight, platformHeight); - - SetMeasuredDimension((int)platformWidth, (int)platformHeight); - } + // protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) + // { + // if (CrossPlatformLayout is null) + // { + // base.OnMeasure(widthMeasureSpec, heightMeasureSpec); + // return; + // } + // + // var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); + // var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); + // + // var widthMode = MeasureSpec.GetMode(widthMeasureSpec); + // var heightMode = MeasureSpec.GetMode(heightMeasureSpec); + // + // var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); + // + // // If the measure spec was exact, we should return the explicit size value, even if the content + // // measure came out to a different size + // var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; + // var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; + // + // var platformWidth = _context.ToPixels(width); + // var platformHeight = _context.ToPixels(height); + // + // // Minimum values win over everything + // platformWidth = Math.Max(MinimumWidth, platformWidth); + // platformHeight = Math.Max(MinimumHeight, platformHeight); + // + // SetMeasuredDimension((int)platformWidth, (int)platformHeight); + // } protected override void OnLayout(bool changed, int left, int top, int right, int bottom) { @@ -143,5 +143,40 @@ internal IBorderStroke? Clip return null; } + + internal override void DoMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); + var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); + + var widthMode = MeasureSpec.GetMode(widthMeasureSpec); + var heightMode = MeasureSpec.GetMode(heightMeasureSpec); + + var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); + + // If the measure spec was exact, we should return the explicit size value, even if the content + // measure came out to a different size + var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; + var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; + + var platformWidth = _context.ToPixels(width); + var platformHeight = _context.ToPixels(height); + + // Minimum values win over everything + platformWidth = Math.Max(MinimumWidth, platformWidth); + platformHeight = Math.Max(MinimumHeight, platformHeight); + + SetMeasuredDimension((int)platformWidth, (int)platformHeight); + } + + bool IPlatformQuickLayout.NeedsMeasure(int p0, int p1) + { + return base.NeedsMeasure(p0, p1); + } + + void IPlatformQuickLayout.QuickMeasure(int p0, int p1, int p2, int p3) + { + base.QuickMeasure(p0, p1, p2, p3); + } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Android/ContextExtensions.cs b/src/Core/src/Platform/Android/ContextExtensions.cs index 5aeeb43b8d49..5bc1c78429bc 100644 --- a/src/Core/src/Platform/Android/ContextExtensions.cs +++ b/src/Core/src/Platform/Android/ContextExtensions.cs @@ -404,14 +404,17 @@ internal static int GetNavigationBarHeight(this Context context) return _navigationBarHeight ?? 0; } - internal static int CreateMeasureSpec(this Context context, double constraint, double explicitSize, double minimumSize, double maximumSize) + internal static (int MeasureSpec, double CrossPlatformConstraint, bool Exact) CreateMeasureSpec(this Context context, double constraint, double explicitSize, double minimumSize, double maximumSize) { var mode = MeasureSpecMode.AtMost; + var exact = false; + var crossPlatformConstraint = constraint; if (IsExplicitSet(explicitSize)) { // We have a set value (i.e., a Width or Height) mode = MeasureSpecMode.Exactly; + exact = true; // Since the mode is "Exactly", we have to return the exact final value clamped to the minimum/maximum. constraint = Math.Max(explicitSize, ResolveMinimum(minimumSize)); @@ -420,11 +423,14 @@ internal static int CreateMeasureSpec(this Context context, double constraint, d { constraint = Math.Min(constraint, maximumSize); } + + crossPlatformConstraint = constraint; } else if (IsMaximumSet(maximumSize) && maximumSize < constraint) { mode = MeasureSpecMode.AtMost; constraint = maximumSize; + crossPlatformConstraint = constraint; } else if (double.IsInfinity(constraint)) { @@ -436,7 +442,7 @@ internal static int CreateMeasureSpec(this Context context, double constraint, d // Convert to a platform size to create the spec for measuring var deviceConstraint = (int)context.ToPixels(constraint); - return mode.MakeMeasureSpec(deviceConstraint); + return (mode.MakeMeasureSpec(deviceConstraint), crossPlatformConstraint, exact); } public static float GetDisplayDensity(this Context? context) diff --git a/src/Core/src/Platform/Android/LayoutViewGroup.cs b/src/Core/src/Platform/Android/LayoutViewGroup.cs index 6b4f40dad1d2..97b93f4c5c0d 100644 --- a/src/Core/src/Platform/Android/LayoutViewGroup.cs +++ b/src/Core/src/Platform/Android/LayoutViewGroup.cs @@ -11,7 +11,7 @@ namespace Microsoft.Maui.Platform { - public class LayoutViewGroup : ViewGroup, ICrossPlatformLayoutBacking, IVisualTreeElementProvidable + public class LayoutViewGroup : PlatformViewGroup, ICrossPlatformLayoutBacking, IVisualTreeElementProvidable, IPlatformQuickLayout { readonly ARect _clipRect = new(); readonly Context _context; @@ -65,36 +65,36 @@ Graphics.Size CrossPlatformArrange(Graphics.Rect bounds) // TODO: Possibly reconcile this code with ViewHandlerExtensions.MeasureVirtualView // If you make changes here please review if those changes should also // apply to ViewHandlerExtensions.MeasureVirtualView - protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - if (CrossPlatformMeasure == null) - { - base.OnMeasure(widthMeasureSpec, heightMeasureSpec); - return; - } - - var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); - var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); - - var widthMode = MeasureSpec.GetMode(widthMeasureSpec); - var heightMode = MeasureSpec.GetMode(heightMeasureSpec); - - var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); - - // If the measure spec was exact, we should return the explicit size value, even if the content - // measure came out to a different size - var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; - var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; - - var platformWidth = _context.ToPixels(width); - var platformHeight = _context.ToPixels(height); - - // Minimum values win over everything - platformWidth = Math.Max(MinimumWidth, platformWidth); - platformHeight = Math.Max(MinimumHeight, platformHeight); - - SetMeasuredDimension((int)platformWidth, (int)platformHeight); - } + // protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) + // { + // if (CrossPlatformMeasure == null) + // { + // base.OnMeasure(widthMeasureSpec, heightMeasureSpec); + // return; + // } + // + // var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); + // var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); + // + // var widthMode = MeasureSpec.GetMode(widthMeasureSpec); + // var heightMode = MeasureSpec.GetMode(heightMeasureSpec); + // + // var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); + // + // // If the measure spec was exact, we should return the explicit size value, even if the content + // // measure came out to a different size + // var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; + // var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; + // + // var platformWidth = _context.ToPixels(width); + // var platformHeight = _context.ToPixels(height); + // + // // Minimum values win over everything + // platformWidth = Math.Max(MinimumWidth, platformWidth); + // platformHeight = Math.Max(MinimumHeight, platformHeight); + // + // SetMeasuredDimension((int)platformWidth, (int)platformHeight); + // } // TODO: Possibly reconcile this code with ViewHandlerExtensions.MeasureVirtualView // If you make changes here please review if those changes should also @@ -142,5 +142,45 @@ public override bool OnTouchEvent(MotionEvent? e) return null; } + + internal override void DoMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + var deviceIndependentWidth = widthMeasureSpec.ToDouble(_context); + var deviceIndependentHeight = heightMeasureSpec.ToDouble(_context); + + var widthMode = MeasureSpec.GetMode(widthMeasureSpec); + var heightMode = MeasureSpec.GetMode(heightMeasureSpec); + + var measure = CrossPlatformMeasure(deviceIndependentWidth, deviceIndependentHeight); + + // If the measure spec was exact, we should return the explicit size value, even if the content + // measure came out to a different size + var width = widthMode == MeasureSpecMode.Exactly ? deviceIndependentWidth : measure.Width; + var height = heightMode == MeasureSpecMode.Exactly ? deviceIndependentHeight : measure.Height; + + var platformWidth = _context.ToPixels(width); + var platformHeight = _context.ToPixels(height); + + // Minimum values win over everything + platformWidth = Math.Max(MinimumWidth, platformWidth); + platformHeight = Math.Max(MinimumHeight, platformHeight); + + SetMeasuredDimension((int)platformWidth, (int)platformHeight); + } + + bool IPlatformQuickLayout.NeedsMeasure(int p0, int p1) + { + return base.NeedsMeasure(p0, p1); + } + + void IPlatformQuickLayout.QuickMeasure(int p0, int p1, int p2, int p3) + { + base.QuickMeasure(p0, p1, p2, p3); + } } } + +internal interface IPlatformQuickLayout { + void QuickMeasure(int widthMeasureSpec, int heightMeasureSpec, int width, int height); + bool NeedsMeasure(int widthMeasureSpec, int heightMeasureSpec); +} diff --git a/src/Core/src/Platform/Android/WrapperView.cs b/src/Core/src/Platform/Android/WrapperView.cs index d426a3a28eee..06b176ea2b5b 100644 --- a/src/Core/src/Platform/Android/WrapperView.cs +++ b/src/Core/src/Platform/Android/WrapperView.cs @@ -214,5 +214,10 @@ void CleanupContainerView(AView containerView, Action clearWrapperView) clearWrapperView.Invoke(); } } + + internal override void DoMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + throw new NotImplementedException(); + } } } diff --git a/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt index b4dd7e0f9f32..c738ed5ae653 100644 --- a/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt @@ -21,6 +21,17 @@ Microsoft.Maui.Handlers.OpenWindowRequest.Deconstruct(out Microsoft.Maui.IPersis Microsoft.Maui.Handlers.OpenWindowRequest.OpenWindowRequest(Microsoft.Maui.Handlers.OpenWindowRequest! original) -> void Microsoft.Maui.Hosting.MauiAppBuilder.Environment.get -> Microsoft.Maui.Hosting.MauiHostEnvironment! Microsoft.Maui.Hosting.MauiAppBuilder.Properties.get -> System.Collections.Generic.IDictionary! +Microsoft.Maui.PlatformViewGroup +override Microsoft.Maui.PlatformViewGroup.JniPeerMembers.get -> Java.Interop.JniPeerMembers! +override Microsoft.Maui.PlatformViewGroup.ThresholdClass.get -> nint +override Microsoft.Maui.PlatformViewGroup.ThresholdType.get -> System.Type! +Microsoft.Maui.PlatformViewGroup.PlatformViewGroup(nint javaReference, Android.Runtime.JniHandleOwnership transfer) -> void +Microsoft.Maui.PlatformViewGroup.PlatformViewGroup(Android.Content.Context? context) -> void +Microsoft.Maui.PlatformViewGroup.PlatformViewGroup(Android.Content.Context? context, Android.Util.IAttributeSet? attrs) -> void +Microsoft.Maui.PlatformViewGroup.PlatformViewGroup(Android.Content.Context? context, Android.Util.IAttributeSet? attrs, int defStyle) -> void +Microsoft.Maui.PlatformViewGroup.PlatformViewGroup(Android.Content.Context? context, Android.Util.IAttributeSet? attrs, int defStyle, int defStyleRes) -> void +*REMOVED*override Microsoft.Maui.Platform.ContentViewGroup.OnMeasure(int widthMeasureSpec, int heightMeasureSpec) -> void +*REMOVED*override Microsoft.Maui.Platform.LayoutViewGroup.OnMeasure(int widthMeasureSpec, int heightMeasureSpec) -> void Microsoft.Maui.Hosting.MauiHostEnvironment Microsoft.Maui.Hosting.MauiHostEnvironment.ApplicationName.get -> string! Microsoft.Maui.Hosting.MauiHostEnvironment.ApplicationName.set -> void diff --git a/src/Core/src/Transforms/Metadata.xml b/src/Core/src/Transforms/Metadata.xml index e8c11e532ec7..ae793ffe08b1 100644 --- a/src/Core/src/Transforms/Metadata.xml +++ b/src/Core/src/Transforms/Metadata.xml @@ -8,6 +8,7 @@ public public + public public public public @@ -15,6 +16,9 @@ internal internal internal + internal + internal + internal