From 4f51310e835ef4ee21bd64df6d6df58456737b78 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 2 Jun 2021 02:57:13 +1000 Subject: [PATCH] Android: Add option in gamedirs to force scoped storage --- .../duckstation/GameDirectoriesActivity.java | 30 ++++++++++++++++++- .../stenzek/duckstation/MainActivity.java | 2 +- .../res/menu/menu_edit_game_directories.xml | 4 +++ android/app/src/main/res/values/strings.xml | 1 + 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java index 3361ed6f5..4c1bd85b2 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java @@ -50,6 +50,7 @@ import java.util.Set; public class GameDirectoriesActivity extends AppCompatActivity { private static final int REQUEST_ADD_DIRECTORY_TO_GAME_LIST = 1; + private static final String FORCE_SAF_CONFIG_KEY = "GameList/ForceStorageAccessFramework"; private class DirectoryListAdapter extends RecyclerView.Adapter { private class Entry { @@ -219,6 +220,23 @@ public class GameDirectoriesActivity extends AppCompatActivity { public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_edit_game_directories, menu); + + menu.findItem(R.id.force_saf) + .setEnabled(android.os.Build.VERSION.SDK_INT < 30) + .setChecked(PreferenceManager.getDefaultSharedPreferences(this).getBoolean( + FORCE_SAF_CONFIG_KEY, false)) + .setOnMenuItemClickListener(item -> { + final SharedPreferences sharedPreferences = + PreferenceManager.getDefaultSharedPreferences(this); + final boolean newValue =!sharedPreferences.getBoolean( + FORCE_SAF_CONFIG_KEY, false); + sharedPreferences.edit() + .putBoolean(FORCE_SAF_CONFIG_KEY, newValue) + .commit(); + item.setChecked(newValue); + return true; + }); + return true; } @@ -240,6 +258,16 @@ public class GameDirectoriesActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } + public static boolean useStorageAccessFramework(Context context) { + // Use legacy storage on devices older than Android 11... apparently some of them + // have broken storage access framework.... + if (android.os.Build.VERSION.SDK_INT >= 30) + return true; + + return PreferenceManager.getDefaultSharedPreferences(context).getBoolean( + "GameList/ForceStorageAccessFramework", false); + } + public static void addSearchDirectory(Context context, String path, boolean recursive) { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final String key = recursive ? "GameList/RecursivePaths" : "GameList/Paths"; @@ -294,7 +322,7 @@ public class GameDirectoriesActivity extends AppCompatActivity { // Use legacy storage on devices older than Android 11... apparently some of them // have broken storage access framework.... - if (android.os.Build.VERSION.SDK_INT < 30) { + if (!useStorageAccessFramework(this)) { final String path = FileHelper.getFullPathFromTreeUri(data.getData(), this); if (path != null) { addSearchDirectory(this, path, true); diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java index 48abc89d7..3554eb29e 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java @@ -274,7 +274,7 @@ public class MainActivity extends AppCompatActivity { // Use legacy storage on devices older than Android 11... apparently some of them // have broken storage access framework.... - if (android.os.Build.VERSION.SDK_INT < 30) { + if (!GameDirectoriesActivity.useStorageAccessFramework(this)) { final String path = FileHelper.getFullPathFromTreeUri(data.getData(), this); if (path != null) { GameDirectoriesActivity.addSearchDirectory(this, path, true); diff --git a/android/app/src/main/res/menu/menu_edit_game_directories.xml b/android/app/src/main/res/menu/menu_edit_game_directories.xml index d7606da26..06192fbb8 100644 --- a/android/app/src/main/res/menu/menu_edit_game_directories.xml +++ b/android/app/src/main/res/menu/menu_edit_game_directories.xml @@ -8,4 +8,8 @@ + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index d21e9ea17..545fcef50 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -362,4 +362,5 @@ Reduces hitches in emulation by reading/decompressing CD data asynchronously on a worker thread. Apply Image Patches Automatically applies patches to disc images when they are present, currently only PPF is supported. + Force Scoped Storage