From 231c5e0581241aa8627fe5d9c8285fc7fc4a7246 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Fri, 13 May 2022 15:05:05 -0700 Subject: [PATCH 01/10] Handle crash --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 0521c422d794..0a05c60ca91b 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -131,6 +131,8 @@ class Camera /** An additional thread for running tasks that shouldn't block the UI. */ private HandlerThread backgroundHandlerThread; + /** True when backgroundHandlerThread is in the process of being stopped. */ + private boolean stoppingBackgroundHandlerThread = false; private CameraDeviceWrapper cameraDevice; private CameraCaptureSession captureSession; @@ -669,7 +671,11 @@ public void startBackgroundThread() { /** Stops the background thread and its {@link Handler}. */ public void stopBackgroundThread() { + if (stoppingBackgroundHandlerThread) { + return; + } if (backgroundHandlerThread != null) { + stoppingBackgroundHandlerThread = true; backgroundHandlerThread.quitSafely(); try { backgroundHandlerThread.join(); @@ -677,8 +683,10 @@ public void stopBackgroundThread() { dartMessenger.error(flutterResult, "cameraAccess", e.getMessage(), null); } } + backgroundHandlerThread = null; backgroundHandler = null; + stoppingBackgroundHandlerThread = false; } /** Start capturing a picture, doing autofocus first. */ From 86efe0cec6a56784b12e8f472b566e1474598c84 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 18 May 2022 17:00:27 -0700 Subject: [PATCH 02/10] Attempt capture session close removal --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 0a05c60ca91b..40293479bedb 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -683,7 +683,6 @@ public void stopBackgroundThread() { dartMessenger.error(flutterResult, "cameraAccess", e.getMessage(), null); } } - backgroundHandlerThread = null; backgroundHandler = null; stoppingBackgroundHandlerThread = false; @@ -1174,7 +1173,7 @@ private void closeCaptureSession() { if (captureSession != null) { Log.i(TAG, "closeCaptureSession"); - captureSession.close(); + // captureSession.close(); captureSession = null; } } From 8f90972c14a5cb1f1e9e0e0d0eec403d31febc50 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 19 May 2022 14:34:44 -0700 Subject: [PATCH 03/10] Remove captureSession.close() --- .../java/io/flutter/plugins/camera/Camera.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 40293479bedb..b6907fe0953f 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -341,7 +341,7 @@ public void onClosed(@NonNull CameraDevice camera) { // Prevents calls to methods that would otherwise result in IllegalStateException exceptions. cameraDevice = null; - closeCaptureSession(); + captureSession = null; dartMessenger.sendCameraClosingEvent(); } @@ -393,7 +393,7 @@ private void createCaptureSession( int templateType, Runnable onSuccessCallback, Surface... surfaces) throws CameraAccessException { // Close any existing capture session. - closeCaptureSession(); + captureSession = null; // Create a new capture builder. previewRequestBuilder = cameraDevice.createCaptureRequest(templateType); @@ -1169,18 +1169,9 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i backgroundHandler); } - private void closeCaptureSession() { - if (captureSession != null) { - Log.i(TAG, "closeCaptureSession"); - - // captureSession.close(); - captureSession = null; - } - } - public void close() { Log.i(TAG, "close"); - closeCaptureSession(); + captureSession = null; if (cameraDevice != null) { cameraDevice.close(); From bb17f4825c94a41cff385d5b2545ff4789851a33 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 24 May 2022 14:54:37 -0700 Subject: [PATCH 04/10] Testing --- .../java/io/flutter/plugins/camera/Camera.java | 16 +++++++++++++--- .../io/flutter/plugins/camera/DartMessenger.java | 2 ++ packages/camera/camera/pubspec.yaml | 6 ++++-- .../method_channel/method_channel_camera.dart | 1 + packages/camera/camera_web/pubspec.yaml | 3 ++- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index b6907fe0953f..4afc851f6175 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -341,7 +341,7 @@ public void onClosed(@NonNull CameraDevice camera) { // Prevents calls to methods that would otherwise result in IllegalStateException exceptions. cameraDevice = null; - captureSession = null; + closeCaptureSession(); dartMessenger.sendCameraClosingEvent(); } @@ -356,8 +356,9 @@ public void onDisconnected(@NonNull CameraDevice cameraDevice) { @Override public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { Log.i(TAG, "open | onError"); - + close(); + String errorDescription; switch (errorCode) { case ERROR_CAMERA_IN_USE: @@ -393,7 +394,7 @@ private void createCaptureSession( int templateType, Runnable onSuccessCallback, Surface... surfaces) throws CameraAccessException { // Close any existing capture session. - captureSession = null; + closeCaptureSession(); // Create a new capture builder. previewRequestBuilder = cameraDevice.createCaptureRequest(templateType); @@ -1169,6 +1170,15 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i backgroundHandler); } + private void closeCaptureSession() { + if (captureSession != null) { + Log.i(TAG, "closeCaptureSession"); + + captureSession.close(); + captureSession = null; + } + } + public void close() { Log.i(TAG, "close"); captureSession = null; diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java index dc62fce524d3..ba3682543930 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java @@ -134,6 +134,7 @@ void sendCameraClosingEvent() { * @param description contains details regarding the error that occurred. */ void sendCameraErrorEvent(@Nullable String description) { + System.out.println("!!!!!!!!!!!!!!!!!!!!Sending error camera event: " + description); this.send( CameraEventType.ERROR, new HashMap() { @@ -157,6 +158,7 @@ private void send(CameraEventType eventType, Map args) { @Override public void run() { cameraChannel.invokeMethod(eventType.method, args); + System.out.println("!!!!!!!!!!!!!!Sending message across channel"); } }); } diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index f62777044617..584352ebdb84 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -22,8 +22,10 @@ flutter: default_package: camera_web dependencies: - camera_platform_interface: ^2.1.0 - camera_web: ^0.2.1 + camera_platform_interface: + path: ../camera_platform_interface/ + camera_web: + path: ../camera_web/ flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index c856f3467821..a2c16240009d 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -521,6 +521,7 @@ class MethodChannelCamera extends CameraPlatform { )); break; case 'error': + print("!!!!!!!!!!!!!!!error found"); cameraEventStreamController.add(CameraErrorEvent( cameraId, call.arguments['description']! as String, diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 2d1a4508eb73..ee08de7f0a4e 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -17,7 +17,8 @@ flutter: fileName: camera_web.dart dependencies: - camera_platform_interface: ^2.1.0 + camera_platform_interface: + path: ../camera_platform_interface/ flutter: sdk: flutter flutter_web_plugins: From ad487334e5ef9ea37470144386d343e24af64df9 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 25 May 2022 13:39:38 -0700 Subject: [PATCH 05/10] Makde corrections --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 4afc851f6175..b4a2ac5df597 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -356,7 +356,7 @@ public void onDisconnected(@NonNull CameraDevice cameraDevice) { @Override public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { Log.i(TAG, "open | onError"); - + close(); String errorDescription; @@ -394,7 +394,7 @@ private void createCaptureSession( int templateType, Runnable onSuccessCallback, Surface... surfaces) throws CameraAccessException { // Close any existing capture session. - closeCaptureSession(); + captureSession = null; // Create a new capture builder. previewRequestBuilder = cameraDevice.createCaptureRequest(templateType); @@ -1181,12 +1181,15 @@ private void closeCaptureSession() { public void close() { Log.i(TAG, "close"); - captureSession = null; if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; + captureSession = null; + } else { + closeCaptureSession(); } + if (pictureImageReader != null) { pictureImageReader.close(); pictureImageReader = null; From 9fbef6c3c2410f1faf4cf33bb9c99b55a75365e3 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 25 May 2022 15:03:35 -0700 Subject: [PATCH 06/10] Undo unecessary changes, update changelog --- packages/camera/camera/CHANGELOG.md | 3 ++- .../main/java/io/flutter/plugins/camera/Camera.java | 1 - .../java/io/flutter/plugins/camera/DartMessenger.java | 2 -- packages/camera/camera/pubspec.yaml | 10 ++++------ .../lib/src/method_channel/method_channel_camera.dart | 1 - packages/camera/camera_web/pubspec.yaml | 3 +-- 6 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 4d7e9bbeb218..9ed6905fa71d 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 0.9.4+22 * Removes unnecessary imports. +* Avoids duplicate calls to stop background camera thread and unnecessary closings of camera capture sessions. ## 0.9.4+21 diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index b4a2ac5df597..a4506b63400b 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -358,7 +358,6 @@ public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { Log.i(TAG, "open | onError"); close(); - String errorDescription; switch (errorCode) { case ERROR_CAMERA_IN_USE: diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java index ba3682543930..dc62fce524d3 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java @@ -134,7 +134,6 @@ void sendCameraClosingEvent() { * @param description contains details regarding the error that occurred. */ void sendCameraErrorEvent(@Nullable String description) { - System.out.println("!!!!!!!!!!!!!!!!!!!!Sending error camera event: " + description); this.send( CameraEventType.ERROR, new HashMap() { @@ -158,7 +157,6 @@ private void send(CameraEventType eventType, Map args) { @Override public void run() { cameraChannel.invokeMethod(eventType.method, args); - System.out.println("!!!!!!!!!!!!!!Sending message across channel"); } }); } diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 584352ebdb84..ea9f2e036161 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,11 +4,11 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.4+21 +version: 0.9.7 environment: sdk: ">=2.14.0 <3.0.0" - flutter: ">=2.5.0" + flutter: ">=2.8.0" flutter: plugin: @@ -22,10 +22,8 @@ flutter: default_package: camera_web dependencies: - camera_platform_interface: - path: ../camera_platform_interface/ - camera_web: - path: ../camera_web/ + camera_platform_interface: ^2.1.0 + camera_web: ^0.2.1 flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.2 diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index a2c16240009d..c856f3467821 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -521,7 +521,6 @@ class MethodChannelCamera extends CameraPlatform { )); break; case 'error': - print("!!!!!!!!!!!!!!!error found"); cameraEventStreamController.add(CameraErrorEvent( cameraId, call.arguments['description']! as String, diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index ee08de7f0a4e..2d1a4508eb73 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -17,8 +17,7 @@ flutter: fileName: camera_web.dart dependencies: - camera_platform_interface: - path: ../camera_platform_interface/ + camera_platform_interface: ^2.1.0 flutter: sdk: flutter flutter_web_plugins: From d31f647e993abf79788a0a11e6d6b2028e8dd23a Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 25 May 2022 15:26:26 -0700 Subject: [PATCH 07/10] Update pubspec --- packages/camera/camera/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index ea9f2e036161..47cd06a0c790 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.7 +version: 0.9.7+1 environment: sdk: ">=2.14.0 <3.0.0" From 33d2bd1ed07d07d6d1368bf7f5cbe80af6f4b56a Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 26 May 2022 10:40:47 -0700 Subject: [PATCH 08/10] Add tests, edit changelog --- packages/camera/camera/CHANGELOG.md | 2 +- .../io/flutter/plugins/camera/Camera.java | 4 +- .../io/flutter/plugins/camera/CameraTest.java | 72 +++++++++++++++++++ 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index b041324ae9c6..b7b08a2a8413 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.9.7+1 -* Avoids duplicate calls to stop background camera thread and unnecessary closings of camera capture sessions. +* Skips duplicate calls to stop background thread and removes unnecessary closings of camera capture sessions on Android. ## 0.9.7 diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index a4506b63400b..a037616d980a 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -384,8 +384,8 @@ public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { backgroundHandler); } - private void createCaptureSession(int templateType, Surface... surfaces) - throws CameraAccessException { + @VisibleForTesting + void createCaptureSession(int templateType, Surface... surfaces) throws CameraAccessException { createCaptureSession(templateType, null, surfaces); } diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 167733b9dcca..b85b685ca90b 100644 --- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -18,8 +18,10 @@ import static org.mockito.Mockito.when; import android.app.Activity; +import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.params.SessionConfiguration; @@ -28,6 +30,7 @@ import android.os.Build; import android.os.Handler; import android.os.HandlerThread; +import android.util.Size; import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -35,6 +38,7 @@ import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; +import io.flutter.plugins.camera.features.CameraFeatures; import io.flutter.plugins.camera.features.Point; import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; import io.flutter.plugins.camera.features.autofocus.FocusMode; @@ -833,6 +837,28 @@ public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { verify(mockHandlerThread, times(1)).start(); } + @Test + public void stopBackgroundThread_cancelsDuplicateCalls() throws InterruptedException { + TestUtils.setPrivateField(camera, "stoppingBackgroundHandlerThread", true); + + camera.startBackgroundThread(); + camera.stopBackgroundThread(); + + verify(mockHandlerThread, never()).quitSafely(); + verify(mockHandlerThread, never()).join(); + } + + @Test + public void stopBackgroundThread_proceedsWithoutDuplicateCall() throws InterruptedException { + TestUtils.setPrivateField(camera, "stoppingBackgroundHandlerThread", false); + + camera.startBackgroundThread(); + camera.stopBackgroundThread(); + + verify(mockHandlerThread).quitSafely(); + verify(mockHandlerThread).join(); + } + @Test public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAccessException { ArrayList mockRequestBuilders = new ArrayList<>(); @@ -856,6 +882,52 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc verify(mockCaptureSession, never()).abortCaptures(); } + @Test + public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { + Surface mockSurface = mock(Surface.class); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); + Size mockSize = mock(Size.class); + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = + (TextureRegistry.SurfaceTextureEntry) TestUtils.getPrivateField(camera, "flutterTexture"); + CameraFeatures cameraFeatures = + (CameraFeatures) TestUtils.getPrivateField(camera, "cameraFeatures"); + ResolutionFeature resolutionFeature = + (ResolutionFeature) + TestUtils.getPrivateField(mockCameraFeatureFactory, "mockResolutionFeature"); + + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); + + camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); + + verify(mockCaptureSession, never()).close(); + } + + @Test + public void close_doesCloseCaptureSessionWhenCameraDeviceNull() { + camera.close(); + + verify(mockCaptureSession).close(); + } + + @Test + public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { + ArrayList mockRequestBuilders = new ArrayList<>(); + mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); + TestUtils.setPrivateField(camera, "cameraDevice", fakeCamera); + + camera.close(); + + verify(mockCaptureSession, never()).close(); + } + private static class TestCameraFeatureFactory implements CameraFeatureFactory { private final AutoFocusFeature mockAutoFocusFeature; private final ExposureLockFeature mockExposureLockFeature; From 0ead150fbea876216039cad2a58b5a48996623b5 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Fri, 3 Jun 2022 10:28:09 -0700 Subject: [PATCH 09/10] Add comment --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index a037616d980a..401963c91374 100644 --- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -1184,6 +1184,10 @@ public void close() { if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; + + // Closing the CameraDevice without closing the CameraCaptureSession is recommended + // for quickly closing the camera: + // https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession#close() captureSession = null; } else { closeCaptureSession(); From afde5d91717a6ed26c53a4d123c5224bb6a9f66c Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 22 Jun 2022 12:55:33 -0700 Subject: [PATCH 10/10] Fix versioning --- packages/camera/camera/CHANGELOG.md | 3 +-- packages/camera/camera/pubspec.yaml | 2 +- packages/camera/camera_android/CHANGELOG.md | 4 ++++ packages/camera/camera_android/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 88e3d6de180d..b9af4eb81e17 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,6 +1,5 @@ -## 0.9.8+2 +## NEXT -* Skips duplicate calls to stop background thread and removes unnecessary closings of camera capture sessions on Android. * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/106316). ## 0.9.8+1 diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index d69fdb0a2a4e..a23405d083e3 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.8+2 +version: 0.9.8+1 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index e9972aede28a..1bc9be5af9c3 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.8+3 + +* Skips duplicate calls to stop background thread and removes unnecessary closings of camera capture sessions on Android. + ## 0.9.8+2 * Fixes exception in registerWith caused by the switch to an in-package method channel. diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 7d93ecb22e47..a1b7a930e228 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android description: Android implementation of the camera plugin. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.8+2 +version: 0.9.8+3 environment: sdk: ">=2.14.0 <3.0.0"