From 11de2ae1fe0c2ee2caedadd5d3cd510b946fd4cb Mon Sep 17 00:00:00 2001 From: Braden Farmer Date: Sun, 7 Nov 2021 23:08:24 -0700 Subject: [PATCH] [Android / Play Store] Implement MANAGE_EXTERNAL_STORAGE permission --- pkg/android/phoenix/.gitignore | 1 + pkg/android/phoenix/AndroidManifest.xml | 1 + pkg/android/phoenix/build.gradle | 8 +-- .../browser/mainmenu/MainMenuActivity.java | 59 ++++++++++++++++--- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/pkg/android/phoenix/.gitignore b/pkg/android/phoenix/.gitignore index 8308c56420..6430038b7e 100644 --- a/pkg/android/phoenix/.gitignore +++ b/pkg/android/phoenix/.gitignore @@ -1,5 +1,6 @@ .gradle .externalNativeBuild +.cxx build phoenix.iml output.json diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 9be62d2c76..abda7aa287 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -12,6 +12,7 @@ + diff --git a/pkg/android/phoenix/build.gradle b/pkg/android/phoenix/build.gradle index 9216ea2b48..acd215135a 100644 --- a/pkg/android/phoenix/build.gradle +++ b/pkg/android/phoenix/build.gradle @@ -25,8 +25,8 @@ allprojects { apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" ndkVersion "22.0.7026061" flavorDimensions "variant" @@ -72,7 +72,7 @@ android { } playStoreNormal { minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 30 versionCode getPlayStoreVersionCode() versionName getPlayStoreVersionName() @@ -83,7 +83,7 @@ android { } playStorePlus { minSdkVersion 26 - targetSdkVersion 29 + targetSdkVersion 30 versionCode getPlayStoreVersionCode() versionName getPlayStoreVersionName() diff --git a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java index 60802bbda5..3cc6f3d524 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java @@ -3,10 +3,11 @@ package com.retroarch.browser.mainmenu; import com.retroarch.browser.preferences.util.UserPreferences; import com.retroarch.browser.retroactivity.RetroActivityFuture; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; import android.media.AudioManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; @@ -21,6 +22,7 @@ import android.Manifest; import android.content.DialogInterface; import android.app.AlertDialog; import android.util.Log; +import android.widget.Toast; /** * {@link PreferenceActivity} subclass that provides all of the @@ -31,6 +33,7 @@ public final class MainMenuActivity extends PreferenceActivity final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; public static String PACKAGE_NAME; boolean checkPermissions = false; + boolean checkManageExternalStoragePermission = false; public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener) { @@ -64,12 +67,25 @@ public final class MainMenuActivity extends PreferenceActivity List permissionsNeeded = new ArrayList(); final List permissionsList = new ArrayList(); - if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) - permissionsNeeded.add("Read External Storage"); - if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) - permissionsNeeded.add("Write External Storage"); + final boolean requiresManageExternalStoragePermission = + getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.Q + && Build.VERSION.SDK_INT > Build.VERSION_CODES.Q; - if (permissionsList.size() > 0) + boolean shouldRequestManageExternalStoragePermission = false; + + if (requiresManageExternalStoragePermission) { + if (!Environment.isExternalStorageManager()) { + shouldRequestManageExternalStoragePermission = true; + permissionsNeeded.add("Manage External Storage"); + } + } else { + if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) + permissionsNeeded.add("Read External Storage"); + if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) + permissionsNeeded.add("Write External Storage"); + } + + if (permissionsList.size() > 0 || shouldRequestManageExternalStoragePermission) { checkPermissions = true; @@ -91,10 +107,26 @@ public final class MainMenuActivity extends PreferenceActivity { if (which == AlertDialog.BUTTON_POSITIVE) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) - { + if (requiresManageExternalStoragePermission) { + checkManageExternalStoragePermission = true; + + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + intent.setData(Uri.fromParts("package", getPackageName(), null)); + + try { + startActivity(intent); + } catch (ActivityNotFoundException e) { + // Redirect to app info page instead, so that the user can manually grant the permission + String text = "Navigate to Permissions -> Files and media -> Allow all the time"; + Toast.makeText(MainMenuActivity.this, text, Toast.LENGTH_LONG).show(); + + intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", getPackageName(), null)); + startActivity(intent); + } + } else { requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), - REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); + REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); Log.i("MainMenuActivity", "User accepted request for external storage permissions."); } @@ -194,4 +226,13 @@ public final class MainMenuActivity extends PreferenceActivity checkRuntimePermissions(); } + + @Override + public void onTopResumedActivityChanged(boolean onTop) { + if(onTop && checkManageExternalStoragePermission) { + checkPermissions = false; + checkManageExternalStoragePermission = false; + checkRuntimePermissions(); + } + } }