Browse Source

refactor android activity to allow appbuilder and singleviewlifetime.

Dan Walmsley 3 years ago
parent
commit
77f339d225

+ 6 - 1
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<App>
     {
+        protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+        {
+            return base.CustomizeAppBuilder(builder);
+        }
     }
 }

+ 0 - 9
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<App>()
-                    .UseAndroid();
-            }
-
             StartActivity(new Intent(Application.Context, typeof(MainActivity)));
         }
     }

+ 0 - 6
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<T>(this T builder) where T : AppBuilderBase<T>, new()
         {
             var options = AvaloniaLocator.Current.GetService<AndroidPlatformOptions>() ?? new AndroidPlatformOptions();
-
-            AvaloniaLocator.CurrentMutable.Bind<ISingleViewApplicationLifetime>().ToConstant(new SingleViewLifetime());
             
             var lifetime = AvaloniaLocator.Current.GetService<ISingleViewApplicationLifetime>();
 

+ 24 - 11
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<TApp> : 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<TApp>();
+            
+            CustomizeAppBuilder(builder);
 
-            _viewModel = new ViewModelProvider(this).Get(Java.Lang.Class.FromType(typeof(AvaloniaViewModel))) as AvaloniaViewModel;
+            var lifetime = new SingleViewLifetime();
 
-            var lifetime = AvaloniaLocator.Current.GetService<ISingleViewApplicationLifetime>() 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