using System; using Avalonia.Controls; using Avalonia.Android; using Avalonia.Android.Platform; using Avalonia.Android.Platform.Input; using Avalonia.Input; using Avalonia.Input.Platform; using Avalonia.OpenGL.Egl; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Rendering.Composition; using Avalonia.OpenGL; namespace Avalonia { public static class AndroidApplicationExtensions { public static AppBuilder UseAndroid(this AppBuilder builder) { return builder .UseWindowingSubsystem(() => AndroidPlatform.Initialize(), "Android") .UseSkia(); } } } namespace Avalonia.Android { class AndroidPlatform { public static readonly AndroidPlatform Instance = new AndroidPlatform(); public static AndroidPlatformOptions Options { get; private set; } internal static Compositor Compositor { get; private set; } internal static PlatformRenderInterfaceContextManager RenderInterface { get; private set; } public static void Initialize() { Options = AvaloniaLocator.Current.GetService() ?? new AndroidPlatformOptions(); AvaloniaLocator.CurrentMutable .Bind().ToTransient() .Bind().ToTransient() .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToSingleton() .Bind().ToSingleton() .Bind().ToConstant(new AndroidThreadingInterface()) .Bind().ToSingleton() .Bind().ToConstant(new ChoreographerTimer()) .Bind().ToConstant(new RenderLoop()) .Bind().ToSingleton(); if (Options.UseGpu) { EglPlatformGraphics.TryInitialize(); } if (Options.UseCompositor) { Compositor = new Compositor( AvaloniaLocator.Current.GetRequiredService(), AvaloniaLocator.Current.GetService()); } else RenderInterface = new PlatformRenderInterfaceContextManager(AvaloniaLocator.Current .GetService()); } } public sealed class AndroidPlatformOptions { public bool UseDeferredRendering { get; set; } = false; public bool UseGpu { get; set; } = true; public bool UseCompositor { get; set; } = true; } }