From 2a4b43d43c47731f66f66009fc4a54d5071026c2 Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Fri, 25 Aug 2023 11:11:19 -0300 Subject: [PATCH 1/6] Only request CAMERA permission for Android 13+ --- .../main/java/org/wordpress/android/util/PermissionUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java index 586e1f8a9..ff421e1ef 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -113,7 +113,7 @@ public static boolean checkAndRequestStoragePermission(Fragment fragment, int re public static String[] getCameraAndStoragePermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - return new String[]{permission.CAMERA, permission.READ_MEDIA_IMAGES, permission.READ_MEDIA_VIDEO}; + return new String[]{permission.CAMERA}; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return new String[]{permission.CAMERA, permission.READ_EXTERNAL_STORAGE}; } else { From 96d50cfce7083f4a71b0b655fd6a4084d1bdf1dd Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Fri, 25 Aug 2023 11:19:41 -0300 Subject: [PATCH 2/6] remove getLastRecordedVideoUri This method is only being used to get the last recorded video right after requesting for `ACTION_VIDEO_CAPTURE`, but that's not the correct way of getting the video that was recorded as a result of the video capture request intent. Also, with Android 14, the user can provide partial access to selected media files, so this method will no longer work in that scenario, as if the user selected that option it won't have given permission to this freshly taken video. When using `ACTION_VIDEO_CAPTURE` without passing an EXTRA_OUTPUT the Uri of the video comes back in the `onActivityResult` result intent `data` field. Also, that Uri already has the proper access permissions for the requester, which makes it suitable for use with Android 14. In any case, the file permission is given by the Camera application so it's good to keep an eye on possible issues on Android 14 with Camera apps from lesser known manufactures, which could have incorrect implementation. Reference: https://developer.android.com/reference/android/provider/MediaStore#ACTION_VIDEO_CAPTURE --- .../org/wordpress/android/util/MediaUtils.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/MediaUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/MediaUtils.java index 2abfbf63f..609c5abe1 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/MediaUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/MediaUtils.java @@ -2,7 +2,6 @@ import android.content.ContentUris; import android.content.Context; -import android.content.CursorLoader; import android.database.Cursor; import android.graphics.BitmapFactory; import android.net.Uri; @@ -106,19 +105,6 @@ public static boolean isLocalFile(String state) { || state.equalsIgnoreCase("failed"); } - public static Uri getLastRecordedVideoUri(Context appContext) { - String[] proj = {MediaStore.Video.Media._ID}; - Uri contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - String sortOrder = MediaStore.Video.VideoColumns.DATE_TAKEN + " DESC"; - CursorLoader loader = new CursorLoader(appContext, contentUri, proj, null, null, sortOrder); - Cursor cursor = loader.loadInBackground(); - cursor.moveToFirst(); - long value = cursor.getLong(0); - SqlUtils.closeCursor(cursor); - - return Uri.parse(contentUri.toString() + "/" + value); - } - /** * Get image max size setting from the image max size setting string. This string can be an int, in this case it's * the maximum image width defined by the site. From 35dcff12b08de0745a957f8d379ad26ae1bf50b9 Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Fri, 25 Aug 2023 19:17:36 -0300 Subject: [PATCH 3/6] Update FileDownload storage permission request --- .../android/util/PermissionUtils.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java index ff421e1ef..e0f72f03b 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -2,9 +2,11 @@ import android.Manifest.permission; import android.app.Activity; +import android.app.DownloadManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; +import android.os.Build.VERSION_CODES; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -107,8 +109,8 @@ public static boolean checkAndRequestStoragePermission(Activity activity, int re return checkAndRequestPermissions(activity, requestCode, getStoragePermissions()); } - public static boolean checkAndRequestStoragePermission(Fragment fragment, int requestCode) { - return checkAndRequestPermissions(fragment, requestCode, getStoragePermissions()); + public static boolean checkAndRequestFileDownloadPermission(Fragment fragment, int requestCode) { + return checkAndRequestPermissions(fragment, requestCode, getFileDownloadPermission()); } public static String[] getCameraAndStoragePermissions() { @@ -121,6 +123,19 @@ public static String[] getCameraAndStoragePermissions() { } } + /** + * Starting from Android Q (SDK 29), the WRITE_EXTERNAL_STORAGE permission is not needed anymore for downloading + * files when using setDestinationInExternalPublicDir. Reference: + * ... + */ + private static String[] getFileDownloadPermission() { + if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) { + return new String[]{}; + } else { + return new String[]{permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE}; + } + } + private static String[] getStoragePermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return new String[]{permission.READ_MEDIA_IMAGES, permission.READ_MEDIA_VIDEO}; From 1e3b1125b8473190a2f9cfb017c3cee54998794e Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Fri, 25 Aug 2023 20:18:23 -0300 Subject: [PATCH 4/6] Remove storage permissions Storage permissions are very specific to each context and situation, having them in this shared library under such a generic term is misleading as it was being used in several places (at least on WordPress-Android) that didn't even need storage permissions for working. --- .../wordpress/android/util/PermissionUtils.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java index e0f72f03b..56d47ef1c 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -105,10 +105,6 @@ public static boolean checkAndRequestCameraAndStoragePermissions(Activity activi return checkAndRequestPermissions(activity, requestCode, getCameraAndStoragePermissions()); } - public static boolean checkAndRequestStoragePermission(Activity activity, int requestCode) { - return checkAndRequestPermissions(activity, requestCode, getStoragePermissions()); - } - public static boolean checkAndRequestFileDownloadPermission(Fragment fragment, int requestCode) { return checkAndRequestPermissions(fragment, requestCode, getFileDownloadPermission()); } @@ -135,14 +131,4 @@ private static String[] getFileDownloadPermission() { return new String[]{permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE}; } } - - private static String[] getStoragePermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - return new String[]{permission.READ_MEDIA_IMAGES, permission.READ_MEDIA_VIDEO}; - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - return new String[]{permission.READ_EXTERNAL_STORAGE}; - } else { - return new String[]{permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE}; - } - } } From ead083444ffbcd8d6742c42c00bf455958980fb0 Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Tue, 29 Aug 2023 10:30:19 -0300 Subject: [PATCH 5/6] Remove unused import and long comment --- .../main/java/org/wordpress/android/util/PermissionUtils.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java index 56d47ef1c..fd6e7f705 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -2,7 +2,6 @@ import android.Manifest.permission; import android.app.Activity; -import android.app.DownloadManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; @@ -121,8 +120,7 @@ public static String[] getCameraAndStoragePermissions() { /** * Starting from Android Q (SDK 29), the WRITE_EXTERNAL_STORAGE permission is not needed anymore for downloading - * files when using setDestinationInExternalPublicDir. Reference: - * ... + * files when using DownloadManager.Request#setDestinationInExternalPublicDir. */ private static String[] getFileDownloadPermission() { if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) { From 0dbd60d9d9ba22e69a14ab9445a1e9d6f73d827a Mon Sep 17 00:00:00 2001 From: Thomas Horta Date: Tue, 29 Aug 2023 19:55:06 -0300 Subject: [PATCH 6/6] Remove unused import --- .../main/java/org/wordpress/android/util/PermissionUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java index fd6e7f705..974d2eb76 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; -import android.os.Build.VERSION_CODES; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -123,7 +122,7 @@ public static String[] getCameraAndStoragePermissions() { * files when using DownloadManager.Request#setDestinationInExternalPublicDir. */ private static String[] getFileDownloadPermission() { - if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return new String[]{}; } else { return new String[]{permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE};