|
#if IOS || MACCATALYST
using PlatformView = UIKit.UIView;
#elif ANDROID
using PlatformView = Android.Views.View;
#elif WINDOWS
using PlatformView = Microsoft.UI.Xaml.FrameworkElement;
#elif TIZEN
using PlatformView = Tizen.NUI.BaseComponents.View;
#elif (NETSTANDARD || !PLATFORM)
using PlatformView = System.Object;
#endif
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Handlers;
using System.Threading.Tasks;
namespace Microsoft.Maui
{
public static class ElementHandlerExtensions
{
internal static PlatformView ToPlatform(this IElementHandler elementHandler) =>
(elementHandler.VirtualView?.ToPlatform() as PlatformView) ??
throw new InvalidOperationException($"Unable to convert {elementHandler} to {typeof(PlatformView)}");
public static IServiceProvider GetServiceProvider(this IElementHandler handler)
{
var context = handler.MauiContext ??
throw new InvalidOperationException($"Unable to find the context. The {nameof(ElementHandler.MauiContext)} property should have been set by the host.");
var services = context?.Services ??
throw new InvalidOperationException($"Unable to find the service provider. The {nameof(ElementHandler.MauiContext)} property should have been set by the host.");
return services;
}
public static T? GetService<T>(this IElementHandler handler, Type type)
{
var services = handler.GetServiceProvider();
var service = services.GetService(type);
return (T?)service;
}
public static T? GetService<T>(this IElementHandler handler)
{
var services = handler.GetServiceProvider();
var service = services.GetService<T>();
return service;
}
public static T GetRequiredService<T>(this IElementHandler handler, Type type)
where T : notnull
{
var services = handler.GetServiceProvider();
var service = services.GetRequiredService(type);
return (T)service;
}
public static T GetRequiredService<T>(this IElementHandler handler)
where T : notnull
{
var services = handler.GetServiceProvider();
var service = services.GetRequiredService<T>();
return service;
}
internal static Task<T> InvokeAsync<T>(this IElementHandler handler, string commandName,
TaskCompletionSource<T> args)
{
handler?.Invoke(commandName, args);
return args.Task;
}
internal static T InvokeWithResult<T>(this IElementHandler handler, string commandName,
RetrievePlatformValueRequest<T> args)
{
handler?.Invoke(commandName, args);
return args.Result;
}
internal static bool CanInvokeMappers(this IElementHandler viewHandler)
{
#if ANDROID
var platformView = viewHandler?.PlatformView;
if (platformView is PlatformView androidView && androidView.IsDisposed())
return false;
#endif
return true;
}
public static bool IsConnected(this IElementHandler handler) =>
handler.PlatformView is not null;
}
} |