1818import static org .mockito .Mockito .when ;
1919
2020import android .app .Activity ;
21+ import android .graphics .SurfaceTexture ;
2122import android .hardware .camera2 .CameraAccessException ;
2223import android .hardware .camera2 .CameraCaptureSession ;
24+ import android .hardware .camera2 .CameraDevice ;
2325import android .hardware .camera2 .CameraMetadata ;
2426import android .hardware .camera2 .CaptureRequest ;
2527import android .hardware .camera2 .params .SessionConfiguration ;
2830import android .os .Build ;
2931import android .os .Handler ;
3032import android .os .HandlerThread ;
33+ import android .util .Size ;
3134import android .view .Surface ;
3235import androidx .annotation .NonNull ;
3336import androidx .annotation .Nullable ;
3437import androidx .lifecycle .LifecycleObserver ;
3538import io .flutter .embedding .engine .systemchannels .PlatformChannel ;
3639import io .flutter .plugin .common .MethodChannel ;
3740import io .flutter .plugins .camera .features .CameraFeatureFactory ;
41+ import io .flutter .plugins .camera .features .CameraFeatures ;
3842import io .flutter .plugins .camera .features .Point ;
3943import io .flutter .plugins .camera .features .autofocus .AutoFocusFeature ;
4044import io .flutter .plugins .camera .features .autofocus .FocusMode ;
@@ -833,6 +837,28 @@ public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() {
833837 verify (mockHandlerThread , times (1 )).start ();
834838 }
835839
840+ @ Test
841+ public void stopBackgroundThread_cancelsDuplicateCalls () throws InterruptedException {
842+ TestUtils .setPrivateField (camera , "stoppingBackgroundHandlerThread" , true );
843+
844+ camera .startBackgroundThread ();
845+ camera .stopBackgroundThread ();
846+
847+ verify (mockHandlerThread , never ()).quitSafely ();
848+ verify (mockHandlerThread , never ()).join ();
849+ }
850+
851+ @ Test
852+ public void stopBackgroundThread_proceedsWithoutDuplicateCall () throws InterruptedException {
853+ TestUtils .setPrivateField (camera , "stoppingBackgroundHandlerThread" , false );
854+
855+ camera .startBackgroundThread ();
856+ camera .stopBackgroundThread ();
857+
858+ verify (mockHandlerThread ).quitSafely ();
859+ verify (mockHandlerThread ).join ();
860+ }
861+
836862 @ Test
837863 public void onConverge_shouldTakePictureWithoutAbortingSession () throws CameraAccessException {
838864 ArrayList <CaptureRequest .Builder > mockRequestBuilders = new ArrayList <>();
@@ -856,6 +882,52 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc
856882 verify (mockCaptureSession , never ()).abortCaptures ();
857883 }
858884
885+ @ Test
886+ public void createCaptureSession_doesNotCloseCaptureSession () throws CameraAccessException {
887+ Surface mockSurface = mock (Surface .class );
888+ SurfaceTexture mockSurfaceTexture = mock (SurfaceTexture .class );
889+ ResolutionFeature mockResolutionFeature = mock (ResolutionFeature .class );
890+ Size mockSize = mock (Size .class );
891+ ArrayList <CaptureRequest .Builder > mockRequestBuilders = new ArrayList <>();
892+ mockRequestBuilders .add (mock (CaptureRequest .Builder .class ));
893+ CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper (mockRequestBuilders );
894+ TestUtils .setPrivateField (camera , "cameraDevice" , fakeCamera );
895+
896+ TextureRegistry .SurfaceTextureEntry cameraFlutterTexture =
897+ (TextureRegistry .SurfaceTextureEntry ) TestUtils .getPrivateField (camera , "flutterTexture" );
898+ CameraFeatures cameraFeatures =
899+ (CameraFeatures ) TestUtils .getPrivateField (camera , "cameraFeatures" );
900+ ResolutionFeature resolutionFeature =
901+ (ResolutionFeature )
902+ TestUtils .getPrivateField (mockCameraFeatureFactory , "mockResolutionFeature" );
903+
904+ when (cameraFlutterTexture .surfaceTexture ()).thenReturn (mockSurfaceTexture );
905+ when (resolutionFeature .getPreviewSize ()).thenReturn (mockSize );
906+
907+ camera .createCaptureSession (CameraDevice .TEMPLATE_PREVIEW , mockSurface );
908+
909+ verify (mockCaptureSession , never ()).close ();
910+ }
911+
912+ @ Test
913+ public void close_doesCloseCaptureSessionWhenCameraDeviceNull () {
914+ camera .close ();
915+
916+ verify (mockCaptureSession ).close ();
917+ }
918+
919+ @ Test
920+ public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull () {
921+ ArrayList <CaptureRequest .Builder > mockRequestBuilders = new ArrayList <>();
922+ mockRequestBuilders .add (mock (CaptureRequest .Builder .class ));
923+ CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper (mockRequestBuilders );
924+ TestUtils .setPrivateField (camera , "cameraDevice" , fakeCamera );
925+
926+ camera .close ();
927+
928+ verify (mockCaptureSession , never ()).close ();
929+ }
930+
859931 private static class TestCameraFeatureFactory implements CameraFeatureFactory {
860932 private final AutoFocusFeature mockAutoFocusFeature ;
861933 private final ExposureLockFeature mockExposureLockFeature ;
0 commit comments