Revert "Android: Remove External Storage permission"

This reverts commit 850560d1b6e774753d536690259d84610f623927.
This commit is contained in:
LibretroAdmin 2024-07-01 18:40:40 -07:00
parent 61d830eea2
commit e91f9ab641
3 changed files with 127 additions and 25 deletions

View File

@ -10,6 +10,8 @@
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<uses-feature android:name="android.software.leanback" android:required="false" /> <uses-feature android:name="android.software.leanback" android:required="false" />
<uses-feature android:name="android.hardware.gamepad" android:required="false"/> <uses-feature android:name="android.hardware.gamepad" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
@ -23,6 +25,7 @@
android:isGame="true" android:isGame="true"
android:banner="@drawable/banner" android:banner="@drawable/banner"
android:extractNativeLibs="true" android:extractNativeLibs="true"
android:requestLegacyExternalStorage="true"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<activity android:name="com.retroarch.browser.mainmenu.MainMenuActivity" android:exported="true" android:launchMode="singleInstance"> <activity android:name="com.retroarch.browser.mainmenu.MainMenuActivity" android:exported="true" android:launchMode="singleInstance">
<intent-filter> <intent-filter>

View File

@ -26,7 +26,92 @@ import android.util.Log;
*/ */
public final class MainMenuActivity extends PreferenceActivity public final class MainMenuActivity extends PreferenceActivity
{ {
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
public static String PACKAGE_NAME; public static String PACKAGE_NAME;
boolean checkPermissions = false;
public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener)
{
new AlertDialog.Builder(this).setMessage(message)
.setPositiveButton("OK", onClickListener).setCancelable(false)
.setNegativeButton("Cancel", null).create().show();
}
private boolean addPermission(List<String> permissionsList, String permission)
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
{
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED)
{
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
}
return true;
}
public void checkRuntimePermissions()
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
{
// Android 6.0+ needs runtime permission checks
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
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)
{
checkPermissions = true;
if (permissionsNeeded.size() > 0)
{
// Need Rationale
Log.i("MainMenuActivity", "Need to request external storage permissions.");
String message = "You need to grant access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if (which == AlertDialog.BUTTON_POSITIVE)
{
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
Log.i("MainMenuActivity", "User accepted request for external storage permissions.");
}
}
});
}
else
{
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
Log.i("MainMenuActivity", "Requested external storage permissions.");
}
}
}
if (!checkPermissions)
{
finalStartup();
}
}
public void finalStartup() public void finalStartup()
{ {
@ -47,6 +132,33 @@ public final class MainMenuActivity extends PreferenceActivity
finish(); finish();
} }
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
switch (requestCode)
{
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
for (int i = 0; i < permissions.length; i++)
{
if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
{
Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was granted.");
}
else
{
Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was not granted.");
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
break;
}
finalStartup();
}
public static void startRetroActivity(Intent retro, String contentPath, String corePath, public static void startRetroActivity(Intent retro, String contentPath, String corePath,
String configFilePath, String imePath, String dataDirPath, String dataSourcePath) String configFilePath, String imePath, String dataDirPath, String dataSourcePath)
{ {
@ -58,8 +170,8 @@ public final class MainMenuActivity extends PreferenceActivity
retro.putExtra("IME", imePath); retro.putExtra("IME", imePath);
retro.putExtra("DATADIR", dataDirPath); retro.putExtra("DATADIR", dataDirPath);
retro.putExtra("APK", dataSourcePath); retro.putExtra("APK", dataSourcePath);
retro.putExtra("SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath());
String external = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + PACKAGE_NAME + "/files"; String external = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + PACKAGE_NAME + "/files";
retro.putExtra("SDCARD", external);
retro.putExtra("EXTERNAL", external); retro.putExtra("EXTERNAL", external);
} }
@ -75,6 +187,6 @@ public final class MainMenuActivity extends PreferenceActivity
UserPreferences.updateConfigFile(this); UserPreferences.updateConfigFile(this);
finalStartup(); checkRuntimePermissions();
} }
} }

View File

@ -10,7 +10,6 @@ import android.database.MatrixCursor;
import android.graphics.Point; import android.graphics.Point;
import android.os.Build; import android.os.Build;
import android.os.CancellationSignal; import android.os.CancellationSignal;
import android.os.Environment;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract; import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Document;
@ -70,31 +69,19 @@ public class RetroDocumentsProvider extends DocumentsProvider {
@Override @Override
public Cursor queryRoots(String[] projection) throws FileNotFoundException { public Cursor queryRoots(String[] projection) throws FileNotFoundException {
final File BASE_DIR = new File(getContext().getFilesDir().getParent());
final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_ROOT_PROJECTION); final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_ROOT_PROJECTION);
@SuppressWarnings("ConstantConditions") final String applicationName = getContext().getString(R.string.app_name); @SuppressWarnings("ConstantConditions") final String applicationName = getContext().getString(R.string.app_name);
final File CORE_DIR = new File(getContext().getFilesDir().getParent()); final MatrixCursor.RowBuilder row = result.newRow();
final MatrixCursor.RowBuilder core = result.newRow(); row.add(Root.COLUMN_ROOT_ID, getDocIdForFile(BASE_DIR));
core.add(Root.COLUMN_ROOT_ID, getDocIdForFile(CORE_DIR)); row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(BASE_DIR));
core.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(CORE_DIR)); row.add(Root.COLUMN_SUMMARY, null);
core.add(Root.COLUMN_SUMMARY, "Core Data"); row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD);
core.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD); row.add(Root.COLUMN_TITLE, applicationName);
core.add(Root.COLUMN_TITLE, applicationName); row.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES);
core.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES); row.add(Root.COLUMN_AVAILABLE_BYTES, BASE_DIR.getFreeSpace());
core.add(Root.COLUMN_AVAILABLE_BYTES, CORE_DIR.getFreeSpace()); row.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
core.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
final File USER_DIR = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName() + "/files/RetroArch");
final MatrixCursor.RowBuilder user = result.newRow();
user.add(Root.COLUMN_ROOT_ID, getDocIdForFile(USER_DIR));
user.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(USER_DIR));
user.add(Root.COLUMN_SUMMARY, "User Data");
user.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD);
user.add(Root.COLUMN_TITLE, applicationName);
user.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES);
user.add(Root.COLUMN_AVAILABLE_BYTES, USER_DIR.getFreeSpace());
user.add(Root.COLUMN_ICON, R.mipmap.ic_launcher);
return result; return result;
} }