From c449c097ccfe784e894ee150fce7af8b78984b27 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 13 Jun 2025 20:09:59 -0700 Subject: [PATCH] Implement ISurfaceHolderCallback2 and handle SurfaceRedrawNeeded --- .../Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs | 8 +++++++- .../Platform/SkiaPlatform/TopLevelImpl.cs | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index 3bafc4328c..4b716a07e1 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -10,7 +10,7 @@ using Avalonia.Platform; namespace Avalonia.Android { - internal abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, INativePlatformHandleSurface + internal abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback2, INativePlatformHandleSurface { private IntPtr _nativeWindowHandle = IntPtr.Zero; private PixelSize _size = new(1, 1); @@ -63,6 +63,12 @@ namespace Avalonia.Android .Log(this, "InvalidationAwareSurfaceView Destroyed"); } + public virtual void SurfaceRedrawNeeded(ISurfaceHolder holder) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)? + .Log(this, "InvalidationAwareSurfaceView RedrawNeeded"); + } + private void CacheSurfaceProperties(ISurfaceHolder holder) { var surface = holder?.Surface; diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 3f8d92b047..b4ec5ba0bb 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -220,6 +220,14 @@ namespace Avalonia.Android.Platform.SkiaPlatform } } + public override void SurfaceRedrawNeeded(ISurfaceHolder holder) + { + // Compositor Renderer handles Paint event in-sync, which is perfect for sync SurfaceRedrawNeeded + // In the future we might to handle SurfaceRedrawNeededAsync as well. + _tl.Paint?.Invoke(new Rect(new Point(), Size.ToSize(Scaling))); + base.SurfaceRedrawNeeded(holder); + } + public sealed override bool OnCheckIsTextEditor() { return true;