Browse Source

android - defer rendering till surface is created (#16616)

pull/16677/head
Emmanuel Hansen 2 years ago
committed by GitHub
parent
commit
98e60e89c7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/Android/Avalonia.Android/AvaloniaActivity.cs
  2. 2
      src/Android/Avalonia.Android/AvaloniaMainActivity.cs
  3. 20
      src/Android/Avalonia.Android/AvaloniaView.cs
  4. 11
      src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs

2
src/Android/Avalonia.Android/AvaloniaActivity.cs

@ -155,7 +155,7 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity
base.OnDestroy();
}
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent? data)
{
base.OnActivityResult(requestCode, resultCode, data);

2
src/Android/Avalonia.Android/AvaloniaMainActivity.cs

@ -21,8 +21,8 @@ public class AvaloniaMainActivity : AvaloniaActivity
{
initialContent ??= Lifetime.MainView;
Lifetime.Activity = this;
_view = new AvaloniaView(this) { Content = initialContent };
Lifetime.Activity = this;
}
else
{

20
src/Android/Avalonia.Android/AvaloniaView.cs

@ -21,6 +21,7 @@ namespace Avalonia.Android
private readonly ViewImpl _view;
private IDisposable? _timerSubscription;
private bool _surfaceCreated;
public AvaloniaView(Context context) : base(context)
{
@ -32,6 +33,18 @@ namespace Avalonia.Android
this.SetBackgroundColor(global::Android.Graphics.Color.Transparent);
OnConfigurationChanged();
_view.InternalView.SurfaceWindowCreated += InternalView_SurfaceWindowCreated;
}
private void InternalView_SurfaceWindowCreated(object? sender, EventArgs e)
{
_surfaceCreated = true;
if (Visibility == ViewStates.Visible)
{
OnVisibilityChanged(true);
}
}
internal TopLevelImpl TopLevelImpl => _view;
@ -43,9 +56,10 @@ namespace Avalonia.Android
set { _root.Content = value; }
}
protected override void Dispose(bool disposing)
internal new void Dispose()
{
base.Dispose(disposing);
OnVisibilityChanged(false);
_surfaceCreated = false;
_root?.Dispose();
_root = null!;
}
@ -70,6 +84,8 @@ namespace Avalonia.Android
internal void OnVisibilityChanged(bool isVisible)
{
if (_root == null || !_surfaceCreated)
return;
if (isVisible && _timerSubscription == null)
{
if (AvaloniaLocator.Current.GetService<IRenderTimer>() is ChoreographerTimer timer)

11
src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs

@ -13,9 +13,12 @@ namespace Avalonia.Android
internal abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, INativePlatformHandleSurface
{
bool _invalidateQueued;
private bool _isDisposed;
readonly object _lock = new object();
private readonly Handler _handler;
internal event EventHandler? SurfaceWindowCreated;
IntPtr IPlatformHandle.Handle => Holder?.Surface?.Handle is { } handle ?
AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, handle) :
default;
@ -39,7 +42,7 @@ namespace Avalonia.Android
return;
_handler.Post(() =>
{
if (Holder?.Surface?.IsValid != true)
if (_isDisposed || Holder?.Surface?.IsValid != true)
return;
try
{
@ -53,6 +56,11 @@ namespace Avalonia.Android
}
}
internal new void Dispose()
{
_isDisposed = true;
}
public void SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height)
{
Log.Info("AVALONIA", "Surface Changed");
@ -62,6 +70,7 @@ namespace Avalonia.Android
public void SurfaceCreated(ISurfaceHolder holder)
{
Log.Info("AVALONIA", "Surface Created");
SurfaceWindowCreated?.Invoke(this, EventArgs.Empty);
DoDraw();
}

Loading…
Cancel
Save