From 77f339d225efe42ae8e3ad48743d6ee62c9238e2 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 7 Mar 2022 10:00:27 +0000 Subject: [PATCH] refactor android activity to allow appbuilder and singleviewlifetime. --- .../ControlCatalog.Android/MainActivity.cs | 7 +++- .../ControlCatalog.Android/SplashActivity.cs | 9 ----- .../Avalonia.Android/AndroidPlatform.cs | 6 ---- .../Avalonia.Android/AvaloniaActivity.cs | 35 +++++++++++++------ 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/samples/ControlCatalog.Android/MainActivity.cs b/samples/ControlCatalog.Android/MainActivity.cs index cb3565bcac..44290d9816 100644 --- a/samples/ControlCatalog.Android/MainActivity.cs +++ b/samples/ControlCatalog.Android/MainActivity.cs @@ -1,11 +1,16 @@ using Android.App; using Android.Content.PM; +using Avalonia; using Avalonia.Android; namespace ControlCatalog.Android { [Activity(Label = "ControlCatalog.Android", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize)] - public class MainActivity : AvaloniaActivity + public class MainActivity : AvaloniaActivity { + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder); + } } } diff --git a/samples/ControlCatalog.Android/SplashActivity.cs b/samples/ControlCatalog.Android/SplashActivity.cs index 6d5fd0714c..dc292fd37b 100644 --- a/samples/ControlCatalog.Android/SplashActivity.cs +++ b/samples/ControlCatalog.Android/SplashActivity.cs @@ -1,9 +1,6 @@ using Android.App; using Android.Content; using Android.OS; -using Application = Android.App.Application; - -using Avalonia; namespace ControlCatalog.Android { @@ -19,12 +16,6 @@ namespace ControlCatalog.Android { base.OnResume(); - if (Avalonia.Application.Current == null) - { - AppBuilder.Configure() - .UseAndroid(); - } - StartActivity(new Intent(Application.Context, typeof(MainActivity))); } } diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index 8cb9f193c2..c19fb021e9 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -4,8 +4,6 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Android; using Avalonia.Android.Platform; using Avalonia.Android.Platform.Input; -using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Platform; using Avalonia.Input; using Avalonia.Input.Platform; @@ -13,18 +11,14 @@ using Avalonia.OpenGL.Egl; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Skia; -using static Avalonia.Android.AvaloniaActivity; namespace Avalonia { public static class AndroidApplicationExtensions { - public static T UseAndroid(this T builder) where T : AppBuilderBase, new() { var options = AvaloniaLocator.Current.GetService() ?? new AndroidPlatformOptions(); - - AvaloniaLocator.CurrentMutable.Bind().ToConstant(new SingleViewLifetime()); var lifetime = AvaloniaLocator.Current.GetService(); diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs index a8c501e8b1..7927a13c44 100644 --- a/src/Android/Avalonia.Android/AvaloniaActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs @@ -7,11 +7,11 @@ using Avalonia.Controls; namespace Avalonia.Android { - public abstract class AvaloniaActivity : AppCompatActivity + public abstract class AvaloniaActivity : AppCompatActivity where TApp : Application, new() { internal class SingleViewLifetime : ISingleViewApplicationLifetime { - public AvaloniaView View; + public AvaloniaView View { get; internal set; } public Control MainView { @@ -22,20 +22,33 @@ namespace Avalonia.Android internal AvaloniaView View; internal AvaloniaViewModel _viewModel; + + protected virtual AppBuilder CustomizeAppBuilder(AppBuilder builder) => builder.UseAndroid(); + protected override void OnCreate(Bundle savedInstanceState) { - View = new AvaloniaView(this); - SetContentView(View); + var builder = AppBuilder.Configure(); + + CustomizeAppBuilder(builder); - _viewModel = new ViewModelProvider(this).Get(Java.Lang.Class.FromType(typeof(AvaloniaViewModel))) as AvaloniaViewModel; + var lifetime = new SingleViewLifetime(); - var lifetime = AvaloniaLocator.Current.GetService() as SingleViewLifetime; - lifetime.View = View; - - if (_viewModel.Content != null) + builder.AfterSetup(x => { - View.Content = _viewModel.Content; - } + View = new AvaloniaView(this); + SetContentView(View); + + _viewModel = new ViewModelProvider(this).Get(Java.Lang.Class.FromType(typeof(AvaloniaViewModel))) as AvaloniaViewModel; + lifetime.View = View; + + if (_viewModel.Content != null) + { + View.Content = _viewModel.Content; + } + }); + + builder.SetupWithLifetime(lifetime); + base.OnCreate(savedInstanceState); } public object Content