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