using System; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Android; using Avalonia.Android.Platform; using Avalonia.Android.Platform.Input; using Avalonia.Controls.Platform; using Avalonia.Input; using Avalonia.Input.Platform; using Avalonia.OpenGL.Egl; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Skia; namespace Avalonia { public static class AndroidApplicationExtensions { public static T UseAndroid(this T builder) where T : AppBuilderBase, new() { var options = AvaloniaLocator.Current.GetService() ?? new AndroidPlatformOptions(); return builder .UseWindowingSubsystem(() => AndroidPlatform.Initialize(options), "Android") .UseSkia(); } } } namespace Avalonia.Android { class AndroidPlatform : IPlatformSettings { public static readonly AndroidPlatform Instance = new AndroidPlatform(); public static AndroidPlatformOptions Options { get; private set; } /// public Size TouchDoubleClickSize => new Size(4, 4); /// public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(200); public Size DoubleClickSize => TouchDoubleClickSize; public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(500); public static void Initialize(AndroidPlatformOptions options) { Options = options; AvaloniaLocator.CurrentMutable .Bind().ToTransient() .Bind().ToTransient() .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToSingleton() .Bind().ToConstant(Instance) .Bind().ToConstant(new AndroidThreadingInterface()) .Bind().ToTransient() .Bind().ToSingleton() .Bind().ToConstant(new ChoreographerTimer()) .Bind().ToConstant(new RenderLoop()) .Bind().ToSingleton(); SkiaPlatform.Initialize(); if (options.UseGpu) { EglPlatformOpenGlInterface.TryInitialize(); } } } public sealed class AndroidPlatformOptions { public bool UseDeferredRendering { get; set; } = true; public bool UseGpu { get; set; } = true; } }