diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 99bad7103eab..20fd465a9f71 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.24+4 + +* Allows for video recording without audio when permission RECORD_AUDIO is denied. + ## 0.6.24+3 * Bumps com.android.tools.build:gradle from 8.12.1 to 8.13.1. diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PendingRecordingProxyApi.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PendingRecordingProxyApi.java index 8cf28799b911..fcff73b59e3c 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PendingRecordingProxyApi.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/PendingRecordingProxyApi.java @@ -38,14 +38,17 @@ public PendingRecording asPersistentRecording(PendingRecording pigeonInstance) { @NonNull @Override public PendingRecording withAudioEnabled(PendingRecording pigeonInstance, boolean initialMuted) { - if (!initialMuted - && ContextCompat.checkSelfPermission( + boolean hasPermission = + ContextCompat.checkSelfPermission( getPigeonRegistrar().getContext(), Manifest.permission.RECORD_AUDIO) - == PackageManager.PERMISSION_GRANTED) { - return pigeonInstance.withAudioEnabled(false); + == PackageManager.PERMISSION_GRANTED; + + if (hasPermission) { + return pigeonInstance.withAudioEnabled(initialMuted); } - return pigeonInstance.withAudioEnabled(true); + // By default, the recording will not contain audio. + return pigeonInstance; } @NonNull diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PendingRecordingTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PendingRecordingTest.java index 883cc8aefcfc..089d926bedef 100644 --- a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PendingRecordingTest.java +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/PendingRecordingTest.java @@ -8,6 +8,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -52,7 +53,6 @@ public void withAudioEnabled_doesNotEnableAudioWhenRequestedAndPermissionNotGran final PigeonApiPendingRecording api = new TestProxyApiRegistrar().getPigeonApiPendingRecording(); final PendingRecording instance = mock(PendingRecording.class); - final PendingRecording newInstance = mock(PendingRecording.class); try (MockedStatic mockedContextCompat = Mockito.mockStatic(ContextCompat.class)) { @@ -63,10 +63,32 @@ public void withAudioEnabled_doesNotEnableAudioWhenRequestedAndPermissionNotGran any(Context.class), eq(Manifest.permission.RECORD_AUDIO))) .thenAnswer((Answer) invocation -> PackageManager.PERMISSION_DENIED); - when(instance.withAudioEnabled(true)).thenReturn(newInstance); + when(instance.withAudioEnabled(false)).thenReturn(instance); - assertEquals(api.withAudioEnabled(instance, false), newInstance); - verify(instance).withAudioEnabled(true); + assertEquals(api.withAudioEnabled(instance, false), instance); + verify(instance, never()).withAudioEnabled(false); + } + } + + @Test + public void withAudioEnabled_doesNotEnableAudioWhenNotRequestedAndPermissionNotGranted() { + final PigeonApiPendingRecording api = + new TestProxyApiRegistrar().getPigeonApiPendingRecording(); + final PendingRecording instance = mock(PendingRecording.class); + + try (MockedStatic mockedContextCompat = + Mockito.mockStatic(ContextCompat.class)) { + mockedContextCompat + .when( + () -> + ContextCompat.checkSelfPermission( + any(Context.class), eq(Manifest.permission.RECORD_AUDIO))) + .thenAnswer((Answer) invocation -> PackageManager.PERMISSION_DENIED); + + when(instance.withAudioEnabled(true)).thenReturn(instance); + + assertEquals(api.withAudioEnabled(instance, true), instance); + verify(instance, never()).withAudioEnabled(true); } } diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index dc86c19fe67c..02cf04fe9d79 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.6.24+3 +version: 0.6.24+4 environment: sdk: ^3.9.0