From 56fce6c2fb6c40266d10fa808ff35f0e426fb155 Mon Sep 17 00:00:00 2001 From: David Martos Date: Sun, 27 Nov 2022 11:29:42 +0100 Subject: [PATCH 1/5] [camera] Handle empty grantResults on permission request --- .../java/io/flutter/plugins/camera/CameraPermissions.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java index 4441751e19cf..ee8fa5a71a16 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java @@ -105,7 +105,9 @@ public boolean onRequestPermissionsResult(int id, String[] permissions, int[] gr } alreadyCalled = true; - if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + // grantResults could be empty if the permissions request with the user is interrupted + // https://developer.android.com/reference/android/app/Activity#onRequestPermissionsResult(int,%20java.lang.String[],%20int[]) + if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { callback.onResult(CAMERA_ACCESS_DENIED, CAMERA_ACCESS_DENIED_MESSAGE); } else if (grantResults.length > 1 && grantResults[1] != PackageManager.PERMISSION_GRANTED) { callback.onResult(AUDIO_ACCESS_DENIED, AUDIO_ACCESS_DENIED_MESSAGE); From 306ecceec237722e773c7e08bbf57ba7080ed84e Mon Sep 17 00:00:00 2001 From: David Martos Date: Sun, 27 Nov 2022 11:40:59 +0100 Subject: [PATCH 2/5] update changelog and add test --- packages/camera/camera_android/CHANGELOG.md | 3 +++ .../plugins/camera/CameraPermissionsTest.java | 15 +++++++++++++++ packages/camera/camera_android/pubspec.yaml | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index a62d3169e409..b9cc261395cb 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.10.0+5 + +* Fixes `ArrayIndexOutOfBoundsException` when the permission request is interrupted. ## 0.10.0+4 * Upgrades `androidx.annotation` version to 1.5.0. diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java index d734a63b15ca..6400a4c09ee7 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java @@ -72,4 +72,19 @@ public void callback_doesNotRespond() { verify(fakeResultCallback, never()) .onResult("AudioAccessDenied", "Audio access permission was denied."); } + + @Test + public void callback_respondsWithCameraAccessDeniedWhenEmptyResult() { + // Handles the case where the grantReults array is empty + + ResultCallback fakeResultCallback = mock(ResultCallback.class); + CameraRequestPermissionsListener permissionsListener = + new CameraRequestPermissionsListener(fakeResultCallback); + + permissionsListener.onRequestPermissionsResult( + 9796, null, new int[] {}); + + verify(fakeResultCallback) + .onResult("CameraAccessDenied", "Camera access permission was denied."); + } } diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 6f1b667670e8..6aa78268cb00 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.10.0+4 +version: 0.10.0+5 environment: sdk: ">=2.14.0 <3.0.0" From ca6a669652e818e4ab4354f88f6899d38acb29b8 Mon Sep 17 00:00:00 2001 From: David Martos Date: Sun, 27 Nov 2022 11:44:26 +0100 Subject: [PATCH 3/5] fix typo --- .../java/io/flutter/plugins/camera/CameraPermissionsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java index 6400a4c09ee7..401c94c5d860 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java @@ -75,7 +75,7 @@ public void callback_doesNotRespond() { @Test public void callback_respondsWithCameraAccessDeniedWhenEmptyResult() { - // Handles the case where the grantReults array is empty + // Handles the case where the grantResults array is empty ResultCallback fakeResultCallback = mock(ResultCallback.class); CameraRequestPermissionsListener permissionsListener = From 5b04e8e677e7619b8ce17927bf8a6591e2cba3c5 Mon Sep 17 00:00:00 2001 From: David Martos Date: Sun, 27 Nov 2022 12:34:32 +0100 Subject: [PATCH 4/5] format --- .../io/flutter/plugins/camera/CameraPermissionsTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java index 401c94c5d860..575ec8c1caad 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPermissionsTest.java @@ -76,13 +76,12 @@ public void callback_doesNotRespond() { @Test public void callback_respondsWithCameraAccessDeniedWhenEmptyResult() { // Handles the case where the grantResults array is empty - + ResultCallback fakeResultCallback = mock(ResultCallback.class); CameraRequestPermissionsListener permissionsListener = new CameraRequestPermissionsListener(fakeResultCallback); - permissionsListener.onRequestPermissionsResult( - 9796, null, new int[] {}); + permissionsListener.onRequestPermissionsResult(9796, null, new int[] {}); verify(fakeResultCallback) .onResult("CameraAccessDenied", "Camera access permission was denied."); From f3a07a7cd1c8b907639cd1c5e4a01ec0ba4a7358 Mon Sep 17 00:00:00 2001 From: David Martos Date: Mon, 28 Nov 2022 20:00:14 +0100 Subject: [PATCH 5/5] Update packages/camera/camera_android/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/camera/camera_android/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index b9cc261395cb..750145ea1cb4 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.10.0+5 * Fixes `ArrayIndexOutOfBoundsException` when the permission request is interrupted. + ## 0.10.0+4 * Upgrades `androidx.annotation` version to 1.5.0.