Browse Source

Merge pull request #9197 from emmauss/android_external

Some changes to allow for external toolkit support on android
pull/9198/head
Max Katz 4 years ago
committed by GitHub
parent
commit
38be8adc66
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      src/Android/Avalonia.Android/AvaloniaMainActivity.cs
  2. 3
      src/Android/Avalonia.Android/AvaloniaView.cs
  3. 11
      src/Android/Avalonia.Android/IActivityResultHandler.cs
  4. 4
      src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
  5. 15
      src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs

6
src/Android/Avalonia.Android/AvaloniaMainActivity.cs

@ -9,11 +9,11 @@ using AndroidX.Lifecycle;
namespace Avalonia.Android namespace Avalonia.Android
{ {
public abstract class AvaloniaMainActivity : AppCompatActivity public abstract class AvaloniaMainActivity : AppCompatActivity, IActivityResultHandler
{ {
internal static object ViewContent; internal static object ViewContent;
internal Action<int, Result, Intent> ActivityResult; public Action<int, Result, Intent> ActivityResult { get; set; }
internal AvaloniaView View; internal AvaloniaView View;
protected override void OnCreate(Bundle savedInstanceState) protected override void OnCreate(Bundle savedInstanceState)
@ -24,8 +24,6 @@ namespace Avalonia.Android
View.Content = ViewContent; View.Content = ViewContent;
} }
View.Prepare();
if (Avalonia.Application.Current.ApplicationLifetime is SingleViewLifetime lifetime) if (Avalonia.Application.Current.ApplicationLifetime is SingleViewLifetime lifetime)
{ {
lifetime.View = View; lifetime.View = View;

3
src/Android/Avalonia.Android/AvaloniaView.cs

@ -21,10 +21,7 @@ namespace Avalonia.Android
{ {
_view = new ViewImpl(this); _view = new ViewImpl(this);
AddView(_view.View); AddView(_view.View);
}
internal void Prepare ()
{
_root = new EmbeddableControlRoot(_view); _root = new EmbeddableControlRoot(_view);
_root.Prepare(); _root.Prepare();
} }

11
src/Android/Avalonia.Android/IActivityResultHandler.cs

@ -0,0 +1,11 @@
using System;
using Android.App;
using Android.Content;
namespace Avalonia.Android
{
public interface IActivityResultHandler
{
public Action<int, Result, Intent> ActivityResult { get; set; }
}
}

4
src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Android.App;
using Android.Content; using Android.Content;
using Android.Graphics; using Android.Graphics;
using Android.Runtime; using Android.Runtime;
@ -52,7 +52,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform
_view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling); _view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling);
NativeControlHost = new AndroidNativeControlHostImpl(avaloniaView); NativeControlHost = new AndroidNativeControlHostImpl(avaloniaView);
StorageProvider = new AndroidStorageProvider((AvaloniaMainActivity)avaloniaView.Context); StorageProvider = new AndroidStorageProvider((Activity)avaloniaView.Context);
} }
public virtual Point GetAvaloniaPointFromEvent(MotionEvent e, int pointerIndex) => public virtual Point GetAvaloniaPointFromEvent(MotionEvent e, int pointerIndex) =>

15
src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs

@ -14,10 +14,10 @@ namespace Avalonia.Android.Platform.Storage;
internal class AndroidStorageProvider : IStorageProvider internal class AndroidStorageProvider : IStorageProvider
{ {
private readonly AvaloniaMainActivity _activity; private readonly Activity _activity;
private int _lastRequestCode = 20000; private int _lastRequestCode = 20000;
public AndroidStorageProvider(AvaloniaMainActivity activity) public AndroidStorageProvider(Activity activity)
{ {
_activity = activity; _activity = activity;
} }
@ -119,7 +119,10 @@ internal class AndroidStorageProvider : IStorageProvider
var tcs = new TaskCompletionSource<Intent?>(); var tcs = new TaskCompletionSource<Intent?>();
var currentRequestCode = _lastRequestCode++; var currentRequestCode = _lastRequestCode++;
_activity.ActivityResult += OnActivityResult; if (_activity is IActivityResultHandler mainActivity)
{
mainActivity.ActivityResult += OnActivityResult;
}
_activity.StartActivityForResult(pickerIntent, currentRequestCode); _activity.StartActivityForResult(pickerIntent, currentRequestCode);
var result = await tcs.Task; var result = await tcs.Task;
@ -158,7 +161,11 @@ internal class AndroidStorageProvider : IStorageProvider
return; return;
} }
_activity.ActivityResult -= OnActivityResult;
if (_activity is IActivityResultHandler mainActivity)
{
mainActivity.ActivityResult -= OnActivityResult;
}
_ = tcs.TrySetResult(resultCode == Result.Ok ? data : null); _ = tcs.TrySetResult(resultCode == Result.Ok ? data : null);
} }

Loading…
Cancel
Save