18
18
import static org .mockito .Mockito .when ;
19
19
20
20
import android .app .Activity ;
21
+ import android .graphics .SurfaceTexture ;
21
22
import android .hardware .camera2 .CameraAccessException ;
22
23
import android .hardware .camera2 .CameraCaptureSession ;
24
+ import android .hardware .camera2 .CameraDevice ;
23
25
import android .hardware .camera2 .CameraMetadata ;
24
26
import android .hardware .camera2 .CaptureRequest ;
25
27
import android .hardware .camera2 .params .SessionConfiguration ;
28
30
import android .os .Build ;
29
31
import android .os .Handler ;
30
32
import android .os .HandlerThread ;
33
+ import android .util .Size ;
31
34
import android .view .Surface ;
32
35
import androidx .annotation .NonNull ;
33
36
import androidx .annotation .Nullable ;
34
37
import androidx .lifecycle .LifecycleObserver ;
35
38
import io .flutter .embedding .engine .systemchannels .PlatformChannel ;
36
39
import io .flutter .plugin .common .MethodChannel ;
37
40
import io .flutter .plugins .camera .features .CameraFeatureFactory ;
41
+ import io .flutter .plugins .camera .features .CameraFeatures ;
38
42
import io .flutter .plugins .camera .features .Point ;
39
43
import io .flutter .plugins .camera .features .autofocus .AutoFocusFeature ;
40
44
import io .flutter .plugins .camera .features .autofocus .FocusMode ;
@@ -833,6 +837,28 @@ public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() {
833
837
verify (mockHandlerThread , times (1 )).start ();
834
838
}
835
839
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
+
836
862
@ Test
837
863
public void onConverge_shouldTakePictureWithoutAbortingSession () throws CameraAccessException {
838
864
ArrayList <CaptureRequest .Builder > mockRequestBuilders = new ArrayList <>();
@@ -856,6 +882,52 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc
856
882
verify (mockCaptureSession , never ()).abortCaptures ();
857
883
}
858
884
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
+
859
931
private static class TestCameraFeatureFactory implements CameraFeatureFactory {
860
932
private final AutoFocusFeature mockAutoFocusFeature ;
861
933
private final ExposureLockFeature mockExposureLockFeature ;
0 commit comments