From 3550482e816da95c92aae6117243bc4e8bd0f2dd Mon Sep 17 00:00:00 2001 From: "mahmut.taskiran" <taskiranmahmutt@gmail.com> Date: Wed, 18 Sep 2024 16:32:18 +0400 Subject: [PATCH] Add a check for the surface if it is valid --- .../plugin/platform/PlatformViewWrapper.java | 6 +++ .../platform/PlatformViewWrapperTest.java | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewWrapper.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewWrapper.java index 1b202c14cb535..1bce76fd09bbe 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewWrapper.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewWrapper.java @@ -165,7 +165,13 @@ public void draw(Canvas canvas) { Log.e(TAG, "Platform view cannot be composed without a RenderTarget."); return; } + final Surface targetSurface = renderTarget.getSurface(); + if (!targetSurface.isValid()) { + Log.e(TAG, "Platform view cannot be composed without a valid RenderTarget surface."); + return; + } + final Canvas targetCanvas = targetSurface.lockHardwareCanvas(); if (targetCanvas == null) { // Cannot render right now. diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformViewWrapperTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformViewWrapperTest.java index 64fd84f93743b..eb5431e4aceda 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformViewWrapperTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformViewWrapperTest.java @@ -15,6 +15,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; +import android.view.Surface; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.ViewGroup; @@ -23,6 +24,7 @@ import android.widget.FrameLayout; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import io.flutter.embedding.engine.renderer.FlutterRenderer; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -63,6 +65,41 @@ public void onDraw(Canvas canvas) { verify(canvas, times(1)).drawColor(Color.RED); } + @Test + public void draw_withoutValidSurface() { + FlutterRenderer.debugDisableSurfaceClear = true; + final Surface surface = mock(Surface.class); + when(surface.isValid()).thenReturn(false); + final PlatformViewRenderTarget renderTarget = mock(PlatformViewRenderTarget.class); + when(renderTarget.getSurface()).thenReturn(surface); + + final PlatformViewWrapper wrapper = new PlatformViewWrapper(ctx, renderTarget); + // Test. + final Canvas canvas = mock(Canvas.class); + wrapper.draw(canvas); + + // Verify. + verify(canvas, times(0)).drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR); + } + + @Test + public void draw_withValidSurface() { + FlutterRenderer.debugDisableSurfaceClear = true; + final Canvas canvas = mock(Canvas.class); + final Surface surface = mock(Surface.class); + when(surface.isValid()).thenReturn(true); + final PlatformViewRenderTarget renderTarget = mock(PlatformViewRenderTarget.class); + when(renderTarget.getSurface()).thenReturn(surface); + when(surface.lockHardwareCanvas()).thenReturn(canvas); + final PlatformViewWrapper wrapper = new PlatformViewWrapper(ctx, renderTarget); + + // Test. + wrapper.draw(canvas); + + // Verify. + verify(canvas, times(1)).drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR); + } + @Test public void focusChangeListener_hasFocus() { final ViewTreeObserver viewTreeObserver = mock(ViewTreeObserver.class);