diff --git a/src/Android/Avalonia.Android/AvaloniaMainActivity.cs b/src/Android/Avalonia.Android/AvaloniaMainActivity.cs index 705fa3c59d..de8d02f188 100644 --- a/src/Android/Avalonia.Android/AvaloniaMainActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaMainActivity.cs @@ -9,11 +9,11 @@ using AndroidX.Lifecycle; namespace Avalonia.Android { - public abstract class AvaloniaMainActivity : AppCompatActivity + public abstract class AvaloniaMainActivity : AppCompatActivity, IActivityResultHandler { internal static object ViewContent; - internal Action ActivityResult; + public Action ActivityResult { get; set; } internal AvaloniaView View; protected override void OnCreate(Bundle savedInstanceState) @@ -24,8 +24,6 @@ namespace Avalonia.Android View.Content = ViewContent; } - View.Prepare(); - if (Avalonia.Application.Current.ApplicationLifetime is SingleViewLifetime lifetime) { lifetime.View = View; diff --git a/src/Android/Avalonia.Android/AvaloniaView.cs b/src/Android/Avalonia.Android/AvaloniaView.cs index 94e863210b..5267843bfc 100644 --- a/src/Android/Avalonia.Android/AvaloniaView.cs +++ b/src/Android/Avalonia.Android/AvaloniaView.cs @@ -21,10 +21,7 @@ namespace Avalonia.Android { _view = new ViewImpl(this); AddView(_view.View); - } - internal void Prepare () - { _root = new EmbeddableControlRoot(_view); _root.Prepare(); } diff --git a/src/Android/Avalonia.Android/IActivityResultHandler.cs b/src/Android/Avalonia.Android/IActivityResultHandler.cs new file mode 100644 index 0000000000..14094ee185 --- /dev/null +++ b/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 ActivityResult { get; set; } + } +} diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 7ce72aaca5..984eb775b5 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; - +using Android.App; using Android.Content; using Android.Graphics; using Android.Runtime; @@ -52,7 +52,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform _view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling); NativeControlHost = new AndroidNativeControlHostImpl(avaloniaView); - StorageProvider = new AndroidStorageProvider((AvaloniaMainActivity)avaloniaView.Context); + StorageProvider = new AndroidStorageProvider((Activity)avaloniaView.Context); } public virtual Point GetAvaloniaPointFromEvent(MotionEvent e, int pointerIndex) => diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs index 3a1a9e76ea..62e43ff2ef 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs @@ -14,10 +14,10 @@ namespace Avalonia.Android.Platform.Storage; internal class AndroidStorageProvider : IStorageProvider { - private readonly AvaloniaMainActivity _activity; + private readonly Activity _activity; private int _lastRequestCode = 20000; - public AndroidStorageProvider(AvaloniaMainActivity activity) + public AndroidStorageProvider(Activity activity) { _activity = activity; } @@ -119,7 +119,10 @@ internal class AndroidStorageProvider : IStorageProvider var tcs = new TaskCompletionSource(); var currentRequestCode = _lastRequestCode++; - _activity.ActivityResult += OnActivityResult; + if (_activity is IActivityResultHandler mainActivity) + { + mainActivity.ActivityResult += OnActivityResult; + } _activity.StartActivityForResult(pickerIntent, currentRequestCode); var result = await tcs.Task; @@ -158,7 +161,11 @@ internal class AndroidStorageProvider : IStorageProvider return; } - _activity.ActivityResult -= OnActivityResult; + + if (_activity is IActivityResultHandler mainActivity) + { + mainActivity.ActivityResult -= OnActivityResult; + } _ = tcs.TrySetResult(resultCode == Result.Ok ? data : null); }