diff --git a/android/jdonkey/AndroidManifest.xml b/android/jdonkey/AndroidManifest.xml index 57aa3bdd..2f52c9cb 100644 --- a/android/jdonkey/AndroidManifest.xml +++ b/android/jdonkey/AndroidManifest.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" package="org.dkf.jmule" android:installLocation="auto" - android:versionCode="36" - android:versionName="36"> + android:versionCode="37" + android:versionName="37"> diff --git a/android/jdonkey/src/main/java/org/dkf/jmule/util/DangerousPermissionsChecker.java b/android/jdonkey/src/main/java/org/dkf/jmule/util/DangerousPermissionsChecker.java index ff6a663f..97776624 100644 --- a/android/jdonkey/src/main/java/org/dkf/jmule/util/DangerousPermissionsChecker.java +++ b/android/jdonkey/src/main/java/org/dkf/jmule/util/DangerousPermissionsChecker.java @@ -90,17 +90,20 @@ public void requestPermissions() { } Activity activity = activityRef.get(); String[] permissions = null; - switch (requestCode) { - case EXTERNAL_STORAGE_PERMISSIONS_REQUEST_CODE: - if (SystemUtils.hasAndroid10OrNewer()) { - permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; - } else { - permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; - } - break; - case ACCESS_COARSE_LOCATION_PERMISSIONS_REQUEST_CODE: - permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}; - break; + if (requestCode == EXTERNAL_STORAGE_PERMISSIONS_REQUEST_CODE) { + if (SystemUtils.hasAndroid13OrNewer()) { + // As of Android13 the geniuses at Android decided yet another change + // on how to ask for permissions, now we have to be more granular about it + permissions = new String[]{Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_IMAGES}; + } else if (SystemUtils.hasAndroid11OrNewer()) { + // no more need for WRITE_EXTERNAL_STORAGE permission on Android 11, + // android:requestLegacyExternalStorage does nothing for android11 and up + // and it's ok because they finally let you use File API on the public downloads folders + permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; + } else { + // Android 10 (29) + android:requestLegacyExternalStorage should make it work + permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } } if (permissions != null) { @@ -110,14 +113,8 @@ public void requestPermissions() { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - switch (requestCode) { - case EXTERNAL_STORAGE_PERMISSIONS_REQUEST_CODE: - onExternalStoragePermissionsResult(permissions, grantResults); - break; - case ACCESS_COARSE_LOCATION_PERMISSIONS_REQUEST_CODE: - onAccessCoarseLocationPermissionsResult(permissions, grantResults); - default: - break; + if (requestCode == EXTERNAL_STORAGE_PERMISSIONS_REQUEST_CODE) { + onExternalStoragePermissionsResult(permissions, grantResults); } } @@ -207,16 +204,6 @@ private boolean onExternalStoragePermissionsResult(String[] permissions, int[] g return true; } - private boolean onAccessCoarseLocationPermissionsResult(String[] permissions, int[] grantResults) { - for (int i = 0; i < permissions.length; i++) { - if (permissions[i].equals(Manifest.permission.ACCESS_COARSE_LOCATION)) { - log.info("ACCESS_COARSE_LOCATION permission granted? " + (grantResults[i] == PackageManager.PERMISSION_GRANTED)); - return grantResults[i] == PackageManager.PERMISSION_GRANTED; - } - } - return false; - } - private void shutdownMule() { if (!Ref.alive(activityRef)) { return; diff --git a/android/jdonkey/src/main/java/org/dkf/jmule/util/SystemUtils.java b/android/jdonkey/src/main/java/org/dkf/jmule/util/SystemUtils.java index f3514370..4bd766d1 100644 --- a/android/jdonkey/src/main/java/org/dkf/jmule/util/SystemUtils.java +++ b/android/jdonkey/src/main/java/org/dkf/jmule/util/SystemUtils.java @@ -54,6 +54,7 @@ public final class SystemUtils { private static final int VERSION_SDK_ANDROID_10_Q = 29; private static final int VERSION_SDK_ANDROID_11_R = 30; private static final int VERSION_SDK_ANDROID_12_S = 31; + private static final int VERSION_SDK_ANDROID_13_TIRAMISU = 33; private SystemUtils() { } @@ -216,6 +217,8 @@ public static boolean hasAndroid11OrNewer() { return hasSdkOrNewer(VERSION_SDK_ANDROID_11_R); } + public static boolean hasAndroid13OrNewer() { return hasSdkOrNewer(VERSION_SDK_ANDROID_13_TIRAMISU); } + /** * Used to determine if the device is running * KitKat (Android 4.4) or greater