Merge "Revert "Create a FakeSurfaceEffect for testing."" into androidx-main
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
index 616fb90..85572f1 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
@@ -19,7 +19,6 @@
 import android.os.Build
 import androidx.camera.core.SurfaceEffect.PREVIEW
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
-import androidx.camera.testing.fakes.FakeSurfaceEffect
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -42,7 +41,11 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun addMoreThanOnePreviewEffect_throwsException() {
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceEffect = object : SurfaceEffect {
+            override fun onInputSurface(request: SurfaceRequest) {}
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {}
+        }
         EffectBundle.Builder(mainThreadExecutor())
             .addEffect(PREVIEW, surfaceEffect)
             .addEffect(PREVIEW, surfaceEffect)
@@ -51,7 +54,11 @@
     @Test
     fun addPreviewEffect_hasPreviewEffect() {
         // Arrange.
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceEffect = object : SurfaceEffect {
+            override fun onInputSurface(request: SurfaceRequest) {}
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {}
+        }
         // Act.
         val effectBundle = EffectBundle.Builder(mainThreadExecutor())
             .addEffect(PREVIEW, surfaceEffect)
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
index 0cae6de..1be7cf1 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
@@ -42,7 +42,6 @@
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
@@ -72,6 +71,8 @@
 
     private lateinit var appSurface: Surface
     private lateinit var appSurfaceTexture: SurfaceTexture
+    private lateinit var effectSurface: Surface
+    private lateinit var effectSurfaceTexture: SurfaceTexture
     private lateinit var camera: FakeCamera
     private lateinit var cameraXConfig: CameraXConfig
     private lateinit var context: Context
@@ -81,6 +82,8 @@
     fun setUp() {
         appSurfaceTexture = SurfaceTexture(0)
         appSurface = Surface(appSurfaceTexture)
+        effectSurfaceTexture = SurfaceTexture(0)
+        effectSurface = Surface(effectSurfaceTexture)
         camera = FakeCamera()
 
         val cameraFactoryProvider =
@@ -103,6 +106,8 @@
     fun tearDown() {
         appSurfaceTexture.release()
         appSurface.release()
+        effectSurfaceTexture.release()
+        effectSurface.release()
         with(cameraUseCaseAdapter) {
             this?.removeUseCases(useCases)
         }
@@ -217,10 +222,27 @@
     @Test
     fun bindAndUnbindPreview_surfacesPropagated() {
         // Arrange.
-        val effect = FakeSurfaceEffectInternal(mainThreadExecutor())
+        var surfaceOutputReceived: SurfaceOutput? = null
+        var effectSurfaceReadyToRelease = false
+        var isEffectReleased = false
+        val surfaceEffect = object : SurfaceEffectInternal {
+            override fun onInputSurface(request: SurfaceRequest) {
+                request.provideSurface(effectSurface, mainThreadExecutor()) {
+                    effectSurfaceReadyToRelease = true
+                }
+            }
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                surfaceOutputReceived = surfaceOutput
+            }
+
+            override fun release() {
+                isEffectReleased = true
+            }
+        }
 
         // Act: create pipeline in Preview and provide Surface.
-        val preview = createPreviewPipelineAndAttachEffect(effect)
+        val preview = createPreviewPipelineAndAttachEffect(surfaceEffect)
         val surfaceRequest = preview.mCurrentSurfaceRequest!!
         var appSurfaceReadyToRelease = false
         surfaceRequest.provideSurface(appSurface, mainThreadExecutor()) {
@@ -229,26 +251,30 @@
         shadowOf(getMainLooper()).idle()
 
         // Assert: surfaceOutput received.
-        assertThat(effect.surfaceOutput).isNotNull()
-        assertThat(effect.isReleased).isFalse()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isFalse()
-        assertThat(effect.isInputSurfaceReleased).isFalse()
+        assertThat(surfaceOutputReceived).isNotNull()
+        var requestedToReleaseOutputSurface = false
+        surfaceOutputReceived!!.getSurface(mainThreadExecutor()) {
+            requestedToReleaseOutputSurface = true
+        }
+        assertThat(isEffectReleased).isFalse()
+        assertThat(requestedToReleaseOutputSurface).isFalse()
+        assertThat(effectSurfaceReadyToRelease).isFalse()
         assertThat(appSurfaceReadyToRelease).isFalse()
         // effect surface is provided to camera.
-        assertThat(preview.sessionConfig.surfaces[0].surface.get()).isEqualTo(effect.inputSurface)
+        assertThat(preview.sessionConfig.surfaces[0].surface.get()).isEqualTo(effectSurface)
 
         // Act: unbind Preview.
         preview.onDetached()
         shadowOf(getMainLooper()).idle()
 
         // Assert: effect and effect surface is released.
-        assertThat(effect.isReleased).isTrue()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isTrue()
-        assertThat(effect.isInputSurfaceReleased).isTrue()
+        assertThat(isEffectReleased).isTrue()
+        assertThat(requestedToReleaseOutputSurface).isTrue()
+        assertThat(effectSurfaceReadyToRelease).isTrue()
         assertThat(appSurfaceReadyToRelease).isFalse()
 
         // Act: close SurfaceOutput
-        effect.surfaceOutput!!.close()
+        surfaceOutputReceived!!.close()
         shadowOf(getMainLooper()).idle()
         assertThat(appSurfaceReadyToRelease).isTrue()
     }
@@ -256,8 +282,18 @@
     @Test
     fun invokedErrorListener_recreatePipeline() {
         // Arrange: create pipeline and get a reference of the SessionConfig.
-        val effect = FakeSurfaceEffectInternal(mainThreadExecutor())
-        val preview = createPreviewPipelineAndAttachEffect(effect)
+        val surfaceEffect = object : SurfaceEffectInternal {
+            override fun onInputSurface(request: SurfaceRequest) {}
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                surfaceOutput.getSurface(mainThreadExecutor()) {
+                    surfaceOutput.close()
+                }
+            }
+
+            override fun release() {}
+        }
+        val preview = createPreviewPipelineAndAttachEffect(surfaceEffect)
         val originalSessionConfig = preview.sessionConfig
 
         // Act: invoke the error listener.
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
index 951f021..42f71acb 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
@@ -19,10 +19,11 @@
 import android.os.Build
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.Preview
+import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceEffect.PREVIEW
-import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
+import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.processing.SurfaceEffectWithExecutor
-import androidx.camera.testing.fakes.FakeSurfaceEffect
 import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.ExecutorService
 import java.util.concurrent.Executors
@@ -42,20 +43,22 @@
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class CameraUseCaseAdapterTest {
 
-    private lateinit var surfaceEffect: FakeSurfaceEffect
+    private lateinit var surfaceEffect: SurfaceEffect
     private lateinit var mEffectBundle: EffectBundle
     private lateinit var executor: ExecutorService
 
     @Before
     fun setUp() {
-        surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        surfaceEffect = object : SurfaceEffect {
+            override fun onInputSurface(request: SurfaceRequest) {}
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {}
+        }
         executor = Executors.newSingleThreadExecutor()
         mEffectBundle = EffectBundle.Builder(executor).addEffect(PREVIEW, surfaceEffect).build()
     }
 
     @After
     fun tearDown() {
-        surfaceEffect.cleanUp()
         executor.shutdown()
     }
 
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
index 7df85dd..ca79bdea 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
@@ -24,10 +24,11 @@
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.testing.fakes.FakeCamera
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
 import org.junit.Before
@@ -54,9 +55,15 @@
         private val CROP_RECT = Rect(0, 0, 600, 400)
     }
 
-    private lateinit var surfaceEffectInternal: FakeSurfaceEffectInternal
+    private lateinit var surfaceEffect: SurfaceEffectInternal
+    private var isReleased = false
+    private var surfaceOutputCloseRequested = false
+    private var surfaceOutputReceived: SurfaceOutput? = null
+    private var surfaceReceivedByEffect: Surface? = null
     private lateinit var appSurface: Surface
     private lateinit var appSurfaceTexture: SurfaceTexture
+    private lateinit var effectSurface: Surface
+    private lateinit var effectSurfaceTexture: SurfaceTexture
     private lateinit var node: SurfaceEffectNode
     private lateinit var inputEdge: SurfaceEdge
 
@@ -64,8 +71,30 @@
     fun setup() {
         appSurfaceTexture = SurfaceTexture(0)
         appSurface = Surface(appSurfaceTexture)
-        surfaceEffectInternal = FakeSurfaceEffectInternal(mainThreadExecutor())
-        node = SurfaceEffectNode(FakeCamera(), surfaceEffectInternal)
+        effectSurfaceTexture = SurfaceTexture(0)
+        effectSurface = Surface(effectSurfaceTexture)
+
+        surfaceEffect = object : SurfaceEffectInternal {
+            override fun onInputSurface(request: SurfaceRequest) {
+                request.provideSurface(effectSurface, mainThreadExecutor()) {
+                    effectSurfaceTexture.release()
+                    effectSurface.release()
+                }
+            }
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                surfaceOutputReceived = surfaceOutput
+                surfaceReceivedByEffect = surfaceOutput.getSurface(mainThreadExecutor()) {
+                    surfaceOutput.close()
+                    surfaceOutputCloseRequested = true
+                }
+            }
+
+            override fun release() {
+                isReleased = true
+            }
+        }
+        node = SurfaceEffectNode(FakeCamera(), surfaceEffect)
         inputEdge = createInputEdge()
     }
 
@@ -73,7 +102,8 @@
     fun tearDown() {
         appSurfaceTexture.release()
         appSurface.release()
-        surfaceEffectInternal.release()
+        effectSurfaceTexture.release()
+        effectSurface.release()
         node.release()
         inputEdge.surfaces[0].close()
         shadowOf(getMainLooper()).idle()
@@ -110,8 +140,8 @@
         shadowOf(getMainLooper()).idle()
 
         // Assert: effect receives app Surface. CameraX receives effect Surface.
-        assertThat(surfaceEffectInternal.outputSurface).isEqualTo(appSurface)
-        assertThat(inputSurface.surface.get()).isEqualTo(surfaceEffectInternal.inputSurface)
+        assertThat(surfaceReceivedByEffect).isEqualTo(appSurface)
+        assertThat(inputSurface.surface.get()).isEqualTo(effectSurface)
     }
 
     @Test
@@ -126,8 +156,8 @@
         shadowOf(getMainLooper()).idle()
 
         // Assert: effect is released and has requested effect to close the SurfaceOutput
-        assertThat(surfaceEffectInternal.isReleased).isTrue()
-        assertThat(surfaceEffectInternal.isOutputSurfaceRequestedToClose).isTrue()
+        assertThat(isReleased).isTrue()
+        assertThat(surfaceOutputCloseRequested).isTrue()
     }
 
     private fun createInputEdge(): SurfaceEdge {
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt
index 6a33afe..86b492e 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt
@@ -27,7 +27,6 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.testing.fakes.FakeCamera
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
 import com.google.common.truth.Truth.assertThat
 import java.lang.Thread.currentThread
 import java.util.concurrent.Executor
@@ -70,10 +69,13 @@
 
     @Test(expected = IllegalStateException::class)
     fun initWithSurfaceEffectInternal_throwsException() {
-        SurfaceEffectWithExecutor(
-            FakeSurfaceEffectInternal(mainThreadExecutor()),
-            mainThreadExecutor()
-        )
+        SurfaceEffectWithExecutor(object : SurfaceEffectInternal {
+            override fun onInputSurface(request: SurfaceRequest) {}
+
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {}
+
+            override fun release() {}
+        }, mainThreadExecutor())
     }
 
     @Test
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 35e8e77..bf87a7f 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -26,7 +26,10 @@
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.Preview
+import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.UseCaseGroup
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
@@ -37,7 +40,6 @@
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
@@ -79,7 +81,12 @@
     fun bindUseCaseGroupWithEffect_effectIsSetOnUseCase() {
         // Arrange.
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceEffect = object : SurfaceEffect {
+            override fun onInputSurface(request: SurfaceRequest) {}
+            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                surfaceOutput.close()
+            }
+        }
         val effectBundle =
             EffectBundle.Builder(mainThreadExecutor()).addEffect(PREVIEW, surfaceEffect).build()
         val preview = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
deleted file mode 100644
index 1287dee..0000000
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.testing.fakes;
-
-import android.graphics.SurfaceTexture;
-import android.os.Build;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.SurfaceEffect;
-import androidx.camera.core.SurfaceOutput;
-import androidx.camera.core.SurfaceRequest;
-import androidx.camera.core.impl.DeferrableSurface;
-
-import java.util.concurrent.Executor;
-
-/**
- * Fake {@link SurfaceEffect} used in tests.
- */
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class FakeSurfaceEffect implements SurfaceEffect {
-
-    final SurfaceTexture mSurfaceTexture;
-    final Surface mInputSurface;
-    private final Executor mExecutor;
-
-
-    @Nullable
-    private SurfaceRequest mSurfaceRequest;
-    @Nullable
-    private SurfaceOutput mSurfaceOutput;
-    boolean mIsInputSurfaceReleased;
-    boolean mIsOutputSurfaceRequestedToClose;
-
-    Surface mOutputSurface;
-
-    public FakeSurfaceEffect(@NonNull Executor executor) {
-        mSurfaceTexture = new SurfaceTexture(0);
-        mInputSurface = new Surface(mSurfaceTexture);
-        mExecutor = executor;
-        mIsInputSurfaceReleased = false;
-        mIsOutputSurfaceRequestedToClose = false;
-    }
-
-    @Override
-    public void onInputSurface(@NonNull SurfaceRequest request) {
-        mSurfaceRequest = request;
-        request.provideSurface(mInputSurface, mExecutor, result -> {
-            mSurfaceTexture.release();
-            mInputSurface.release();
-            mIsInputSurfaceReleased = true;
-        });
-    }
-
-    @Override
-    public void onOutputSurface(@NonNull SurfaceOutput surfaceOutput) {
-        mSurfaceOutput = surfaceOutput;
-        mOutputSurface = surfaceOutput.getSurface(mExecutor,
-                () -> mIsOutputSurfaceRequestedToClose = true);
-    }
-
-    @Nullable
-    public SurfaceRequest getSurfaceRequest() {
-        return mSurfaceRequest;
-    }
-
-    @Nullable
-    public SurfaceOutput getSurfaceOutput() {
-        return mSurfaceOutput;
-    }
-
-    @NonNull
-    public Surface getInputSurface() {
-        return mInputSurface;
-    }
-
-    @NonNull
-    public Surface getOutputSurface() {
-        return mOutputSurface;
-    }
-
-    public boolean isInputSurfaceReleased() {
-        return mIsInputSurfaceReleased;
-    }
-
-    public boolean isOutputSurfaceRequestedToClose() {
-        return mIsOutputSurfaceRequestedToClose;
-    }
-
-    /**
-     * Clear up the instance to avoid the "{@link DeferrableSurface} garbage collected" error.
-     */
-    public void cleanUp() {
-        if (mSurfaceRequest != null) {
-            mSurfaceRequest.willNotProvideSurface();
-        }
-        if (mSurfaceOutput != null) {
-            mSurfaceOutput.close();
-        }
-        mSurfaceTexture.release();
-        mInputSurface.release();
-    }
-
-    @Override
-    protected void finalize() {
-        cleanUp();
-    }
-}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java
deleted file mode 100644
index 47bd6f7..0000000
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.testing.fakes;
-
-import android.os.Build;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.processing.SurfaceEffectInternal;
-
-import java.util.concurrent.Executor;
-
-/**
- * Fake {@link SurfaceEffectInternal} used in tests.
- */
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class FakeSurfaceEffectInternal extends FakeSurfaceEffect implements SurfaceEffectInternal {
-
-    private boolean mIsReleased;
-
-    public FakeSurfaceEffectInternal(@NonNull Executor executor) {
-        super(executor);
-        mIsReleased = false;
-    }
-
-    public boolean isReleased() {
-        return mIsReleased;
-    }
-
-    @Override
-    public void release() {
-        mIsReleased = true;
-    }
-}
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
index 2e5c7b8..c478811 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
@@ -25,7 +25,10 @@
 import androidx.camera.core.CameraSelector.LENS_FACING_FRONT
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.ImageCapture
+import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -33,7 +36,6 @@
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.fakes.FakeActivity
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
@@ -103,10 +105,15 @@
 
         // Act: set an EffectBundle
         instrumentation.runOnMainSync {
+            val surfaceEffect = object : SurfaceEffect {
+                override fun onInputSurface(request: SurfaceRequest) {}
+
+                override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                    surfaceOutput.close()
+                }
+            }
             controller.setEffectBundle(
-                EffectBundle.Builder(mainThreadExecutor())
-                    .addEffect(PREVIEW, FakeSurfaceEffect(mainThreadExecutor()))
-                    .build()
+                EffectBundle.Builder(mainThreadExecutor()).addEffect(PREVIEW, surfaceEffect).build()
             )
         }