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.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);
}
}
}

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)));
}
}

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>();

35
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

Loading…
Cancel
Save