Browse Source

refactor android activity to allow appbuilder and singleviewlifetime.

pull/7756/head
Dan Walmsley 5 years ago
parent
commit
77f339d225
  1. 7
      samples/ControlCatalog.Android/MainActivity.cs
  2. 9
      samples/ControlCatalog.Android/SplashActivity.cs
  3. 6
      src/Android/Avalonia.Android/AndroidPlatform.cs
  4. 35
      src/Android/Avalonia.Android/AvaloniaActivity.cs

7
samples/ControlCatalog.Android/MainActivity.cs

@ -1,11 +1,16 @@
using Android.App; using Android.App;
using Android.Content.PM; using Android.Content.PM;
using Avalonia;
using Avalonia.Android; using Avalonia.Android;
namespace ControlCatalog.Android namespace ControlCatalog.Android
{ {
[Activity(Label = "ControlCatalog.Android", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize)] [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);
}
} }
} }

9
samples/ControlCatalog.Android/SplashActivity.cs

@ -1,9 +1,6 @@
using Android.App; using Android.App;
using Android.Content; using Android.Content;
using Android.OS; using Android.OS;
using Application = Android.App.Application;
using Avalonia;
namespace ControlCatalog.Android namespace ControlCatalog.Android
{ {
@ -19,12 +16,6 @@ namespace ControlCatalog.Android
{ {
base.OnResume(); base.OnResume();
if (Avalonia.Application.Current == null)
{
AppBuilder.Configure<App>()
.UseAndroid();
}
StartActivity(new Intent(Application.Context, typeof(MainActivity))); StartActivity(new Intent(Application.Context, typeof(MainActivity)));
} }
} }

6
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -4,8 +4,6 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Android; using Avalonia.Android;
using Avalonia.Android.Platform; using Avalonia.Android.Platform;
using Avalonia.Android.Platform.Input; using Avalonia.Android.Platform.Input;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
@ -13,18 +11,14 @@ using Avalonia.OpenGL.Egl;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Skia; using Avalonia.Skia;
using static Avalonia.Android.AvaloniaActivity;
namespace Avalonia namespace Avalonia
{ {
public static class AndroidApplicationExtensions public static class AndroidApplicationExtensions
{ {
public static T UseAndroid<T>(this T builder) where T : AppBuilderBase<T>, new() public static T UseAndroid<T>(this T builder) where T : AppBuilderBase<T>, new()
{ {
var options = AvaloniaLocator.Current.GetService<AndroidPlatformOptions>() ?? new AndroidPlatformOptions(); var options = AvaloniaLocator.Current.GetService<AndroidPlatformOptions>() ?? new AndroidPlatformOptions();
AvaloniaLocator.CurrentMutable.Bind<ISingleViewApplicationLifetime>().ToConstant(new SingleViewLifetime());
var lifetime = AvaloniaLocator.Current.GetService<ISingleViewApplicationLifetime>(); var lifetime = AvaloniaLocator.Current.GetService<ISingleViewApplicationLifetime>();

35
src/Android/Avalonia.Android/AvaloniaActivity.cs

@ -7,11 +7,11 @@ using Avalonia.Controls;
namespace Avalonia.Android namespace Avalonia.Android
{ {
public abstract class AvaloniaActivity : AppCompatActivity public abstract class AvaloniaActivity<TApp> : AppCompatActivity where TApp : Application, new()
{ {
internal class SingleViewLifetime : ISingleViewApplicationLifetime internal class SingleViewLifetime : ISingleViewApplicationLifetime
{ {
public AvaloniaView View; public AvaloniaView View { get; internal set; }
public Control MainView public Control MainView
{ {
@ -22,20 +22,33 @@ namespace Avalonia.Android
internal AvaloniaView View; internal AvaloniaView View;
internal AvaloniaViewModel _viewModel; internal AvaloniaViewModel _viewModel;
protected virtual AppBuilder CustomizeAppBuilder(AppBuilder builder) => builder.UseAndroid();
protected override void OnCreate(Bundle savedInstanceState) protected override void OnCreate(Bundle savedInstanceState)
{ {
View = new AvaloniaView(this); var builder = AppBuilder.Configure<TApp>();
SetContentView(View);
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; builder.AfterSetup(x =>
lifetime.View = View;
if (_viewModel.Content != null)
{ {
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); base.OnCreate(savedInstanceState);
} }
public object Content public object Content

Loading…
Cancel
Save