From 9e34dc39c4c6f6218df7aad84922bc7ca450ab79 Mon Sep 17 00:00:00 2001 From: Camille Simon <43054281+camsim99@users.noreply.github.com> Date: Sat, 3 Sep 2022 21:22:19 -0700 Subject: [PATCH] [camera] Avoid joining thread causing ANR (#6224) --- packages/camera/camera_android/CHANGELOG.md | 3 ++- .../java/io/flutter/plugins/camera/Camera.java | 12 ------------ .../io/flutter/plugins/camera/CameraTest.java | 17 ++--------------- 3 files changed, 4 insertions(+), 28 deletions(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 5804462c8902..9b2be94c9fc3 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.10.0+2 +* Removes call to `join` on the camera's background `HandlerThread`. * Updates minimum Flutter version to 2.10. ## 0.11.0 diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 35eed5eb4797..7c592b9c7e99 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -131,8 +131,6 @@ 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; @@ -686,21 +684,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(); - } catch (InterruptedException e) { - dartMessenger.error(flutterResult, "cameraAccess", e.getMessage(), null); - } } backgroundHandlerThread = null; backgroundHandler = null; - stoppingBackgroundHandlerThread = false; } /** Start capturing a picture, doing autofocus first. */ diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index b85b685ca90b..9a679017ded2 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -838,25 +838,12 @@ public void startBackgroundThread_shouldNotStartNewThreadWhenAlreadyCreated() { } @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); - + public void stopBackgroundThread_quitsSafely() throws InterruptedException { camera.startBackgroundThread(); camera.stopBackgroundThread(); verify(mockHandlerThread).quitSafely(); - verify(mockHandlerThread).join(); + verify(mockHandlerThread, never()).join(); } @Test