From 1809a6c815d326083785340982ee5ded89073e23 Mon Sep 17 00:00:00 2001 From: Camille Simon <43054281+camsim99@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:28:59 -0700 Subject: [PATCH] [camerax] Fixes `unawaited_futures` violations (#4337) Fixes `unawaited_futures` violations in `camera_android_camerax` plugin. The only `await`s that I did not add are those related to closing/disposing native objects that shouldn't require us to wait for completion. Part of https://github.com/flutter/flutter/issues/127323. --- .../camera_android_camerax/CHANGELOG.md | 4 +++ .../analysis_options.yaml | 8 ------ .../example/lib/camera_controller.dart | 2 +- .../lib/src/android_camera_camerax.dart | 26 +++++++++---------- .../lib/src/image_capture.dart | 2 +- .../lib/src/recording.dart | 8 +++--- .../camera_android_camerax/pubspec.yaml | 2 +- .../test/android_camera_camerax_test.dart | 8 +++--- .../test/recording_test.dart | 8 +++--- script/configs/custom_analysis.yaml | 1 - 10 files changed, 32 insertions(+), 37 deletions(-) delete mode 100644 packages/camera/camera_android_camerax/analysis_options.yaml diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 2980f18c19..e346f786ce 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.0+8 + +* Fixes unawaited_futures violations. + ## 0.5.0+7 * Updates Guava version to 32.0.1. diff --git a/packages/camera/camera_android_camerax/analysis_options.yaml b/packages/camera/camera_android_camerax/analysis_options.yaml deleted file mode 100644 index 7c19fabd68..0000000000 --- a/packages/camera/camera_android_camerax/analysis_options.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# TODO(stuartmorgan): Remove this file and fix all the unawaited_futures -# violations. See https://github.com/flutter/flutter/issues/127323 - -include: ../../../analysis_options.yaml - -linter: - rules: - unawaited_futures: false diff --git a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart index b1b5e9d4ce..d43eb13aaa 100644 --- a/packages/camera/camera_android_camerax/example/lib/camera_controller.dart +++ b/packages/camera/camera_android_camerax/example/lib/camera_controller.dart @@ -526,7 +526,7 @@ class CameraController extends ValueNotifier { } if (value.isStreamingImages) { - stopImageStream(); + unawaited(stopImageStream()); } try { diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 959f35b098..aa5d1e0ab2 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -317,9 +317,9 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future dispose(int cameraId) async { preview?.releaseFlutterSurfaceTexture(); - liveCameraState?.removeObservers(); + unawaited(liveCameraState?.removeObservers()); processCameraProvider?.unbindAll(); - imageAnalysis?.clearAnalyzer(); + unawaited(imageAnalysis?.clearAnalyzer()); } /// The camera has been initialized. @@ -423,8 +423,8 @@ class AndroidCameraCameraX extends CameraPlatform { /// [cameraId] not used. @override Future pausePreview(int cameraId) async { - _unbindUseCaseFromLifecycle(preview!); _previewIsPaused = true; + await _unbindUseCaseFromLifecycle(preview!); } /// Resume the paused preview for the selected camera. @@ -432,8 +432,8 @@ class AndroidCameraCameraX extends CameraPlatform { /// [cameraId] not used. @override Future resumePreview(int cameraId) async { - await _bindPreviewToLifecycle(cameraId); _previewIsPaused = false; + await _bindPreviewToLifecycle(cameraId); } /// Returns a widget showing a live camera preview. @@ -507,7 +507,7 @@ class AndroidCameraCameraX extends CameraPlatform { if (videoOutputPath == null) { // Stop the current active recording as we will be unable to complete it // in this error case. - recording!.close(); + unawaited(recording!.close()); recording = null; pendingRecording = null; throw CameraException( @@ -516,7 +516,7 @@ class AndroidCameraCameraX extends CameraPlatform { 'while reporting success. The platform should always ' 'return a valid path or report an error.'); } - recording!.close(); + unawaited(recording!.close()); recording = null; pendingRecording = null; return XFile(videoOutputPath!); @@ -526,7 +526,7 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future pauseVideoRecording(int cameraId) async { if (recording != null) { - recording!.pause(); + await recording!.pause(); } } @@ -534,7 +534,7 @@ class AndroidCameraCameraX extends CameraPlatform { @override Future resumeVideoRecording(int cameraId) async { if (recording != null) { - recording!.resume(); + await recording!.resume(); } } @@ -614,7 +614,7 @@ class AndroidCameraCameraX extends CameraPlatform { width: imageProxy.width); weakThis.target!.cameraImageDataStreamController!.add(cameraImageData); - imageProxy.close(); + unawaited(imageProxy.close()); } // shouldCreateDetachedObjectForTesting is used to create an Analyzer @@ -627,7 +627,7 @@ class AndroidCameraCameraX extends CameraPlatform { // TODO(camsim99): Support resolution configuration. // Defaults to YUV_420_888 image format. imageAnalysis = createImageAnalysis(null); - imageAnalysis!.setAnalyzer(analyzer); + unawaited(imageAnalysis!.setAnalyzer(analyzer)); // TODO(camsim99): Reset live camera state observers here when // https://github.com/flutter/packages/pull/3419 lands. @@ -652,7 +652,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// The [onListen] callback for the stream controller used for image /// streaming. Future _onFrameStreamListen() async { - _configureAndBindImageAnalysisToLifecycle(); + await _configureAndBindImageAnalysisToLifecycle(); } /// The [onCancel] callback for the stream controller used for image @@ -661,7 +661,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// Removes the previously set analyzer on the [imageAnalysis] instance, since /// image information should no longer be streamed. FutureOr _onFrameStreamCancel() async { - imageAnalysis!.clearAnalyzer(); + unawaited(imageAnalysis!.clearAnalyzer()); } /// Converts between Android ImageFormat constants and [ImageFormatGroup]s. @@ -687,7 +687,7 @@ class AndroidCameraCameraX extends CameraPlatform { /// removed, as well. Future _updateLiveCameraState(int cameraId) async { final CameraInfo cameraInfo = await camera!.getCameraInfo(); - liveCameraState?.removeObservers(); + await liveCameraState?.removeObservers(); liveCameraState = await cameraInfo.getCameraState(); await liveCameraState!.observe(_createCameraClosingObserver(cameraId)); } diff --git a/packages/camera/camera_android_camerax/lib/src/image_capture.dart b/packages/camera/camera_android_camerax/lib/src/image_capture.dart index 6a9b2dedd0..4df8f29bcc 100644 --- a/packages/camera/camera_android_camerax/lib/src/image_capture.dart +++ b/packages/camera/camera_android_camerax/lib/src/image_capture.dart @@ -139,7 +139,7 @@ class ImageCaptureHostApiImpl extends ImageCaptureHostApi { assert(identifier != null, 'No ImageCapture has the identifer of that requested to get the resolution information for.'); - setFlashMode(identifier!, flashMode); + await setFlashMode(identifier!, flashMode); } /// Takes a picture with the specified [ImageCapture] instance. diff --git a/packages/camera/camera_android_camerax/lib/src/recording.dart b/packages/camera/camera_android_camerax/lib/src/recording.dart index 2f21e255b6..5d7c54c37e 100644 --- a/packages/camera/camera_android_camerax/lib/src/recording.dart +++ b/packages/camera/camera_android_camerax/lib/src/recording.dart @@ -67,22 +67,22 @@ class RecordingHostApiImpl extends RecordingHostApi { /// Closes the specified recording instance. Future closeFromInstance(Recording recording) async { - close(instanceManager.getIdentifier(recording)!); + await close(instanceManager.getIdentifier(recording)!); } /// Pauses the specified recording instance if active. Future pauseFromInstance(Recording recording) async { - pause(instanceManager.getIdentifier(recording)!); + await pause(instanceManager.getIdentifier(recording)!); } /// Resumes the specified recording instance if paused. Future resumeFromInstance(Recording recording) async { - resume(instanceManager.getIdentifier(recording)!); + await resume(instanceManager.getIdentifier(recording)!); } /// Stops the specified recording instance, as if calling closeFromInstance(). Future stopFromInstance(Recording recording) async { - stop(instanceManager.getIdentifier(recording)!); + await stop(instanceManager.getIdentifier(recording)!); } } diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index d0364186b2..bc629f7c81 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.5.0+7 +version: 0.5.0+8 environment: sdk: ">=2.19.0 <4.0.0" diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 63b7f644e2..258a8344ae 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -347,7 +347,7 @@ void main() { camera.liveCameraState = MockLiveCameraState(); camera.imageAnalysis = MockImageAnalysis(); - camera.dispose(3); + await camera.dispose(3); verify(camera.preview!.releaseFlutterSurfaceTexture()); verify(camera.liveCameraState!.removeObservers()); @@ -689,7 +689,7 @@ void main() { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final MockRecording recording = MockRecording(); camera.recording = recording; - camera.pauseVideoRecording(0); + await camera.pauseVideoRecording(0); verify(recording.pause()); verifyNoMoreInteractions(recording); }); @@ -698,7 +698,7 @@ void main() { final AndroidCameraCameraX camera = AndroidCameraCameraX(); final MockRecording recording = MockRecording(); camera.recording = recording; - camera.resumeVideoRecording(0); + await camera.resumeVideoRecording(0); verify(recording.resume()); verifyNoMoreInteractions(recording); }); @@ -974,7 +974,7 @@ void main() { // Verify camera and cameraInfo were properly updated. expect(camera.camera, equals(mockCamera)); expect(camera.cameraInfo, equals(mockCameraInfo)); - onStreamedFrameAvailableSubscription.cancel(); + await onStreamedFrameAvailableSubscription.cancel(); }); test( diff --git a/packages/camera/camera_android_camerax/test/recording_test.dart b/packages/camera/camera_android_camerax/test/recording_test.dart index 06de01f42b..b0877e9db1 100644 --- a/packages/camera/camera_android_camerax/test/recording_test.dart +++ b/packages/camera/camera_android_camerax/test/recording_test.dart @@ -37,7 +37,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.close(); + await recording.close(); verify(mockApi.close(recordingId)); }); @@ -57,7 +57,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.pause(); + await recording.pause(); verify(mockApi.pause(recordingId)); }); @@ -77,7 +77,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.resume(); + await recording.resume(); verify(mockApi.resume(recordingId)); }); @@ -97,7 +97,7 @@ void main() { instanceManager.addHostCreatedInstance(recording, recordingId, onCopy: (_) => Recording.detached(instanceManager: instanceManager)); - recording.stop(); + await recording.stop(); verify(mockApi.stop(recordingId)); }); diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml index 1e6d9bd9f0..79d76d1587 100644 --- a/script/configs/custom_analysis.yaml +++ b/script/configs/custom_analysis.yaml @@ -13,7 +13,6 @@ # Temporary opt-outs of unawaited_futures; see # https://github.com/flutter/flutter/issues/127323 -- camera/camera_android_camerax - webview_flutter/webview_flutter - webview_flutter/webview_flutter_android - webview_flutter/webview_flutter_wkwebview