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);