Android: Use storage access framework for picking single games

This commit is contained in:
JosJuice 2020-11-05 19:29:13 +01:00
parent a7c05d7e84
commit e60665da94
6 changed files with 50 additions and 72 deletions

View File

@ -45,6 +45,7 @@ import org.dolphinemu.dolphinemu.fragments.SaveLoadStateFragment;
import org.dolphinemu.dolphinemu.overlay.InputOverlay; import org.dolphinemu.dolphinemu.overlay.InputOverlay;
import org.dolphinemu.dolphinemu.overlay.InputOverlayPointer; import org.dolphinemu.dolphinemu.overlay.InputOverlayPointer;
import org.dolphinemu.dolphinemu.ui.main.MainActivity; import org.dolphinemu.dolphinemu.ui.main.MainActivity;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import org.dolphinemu.dolphinemu.ui.main.TvMainActivity; import org.dolphinemu.dolphinemu.ui.main.TvMainActivity;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.ControllerMappingHelper; import org.dolphinemu.dolphinemu.utils.ControllerMappingHelper;
@ -165,6 +166,11 @@ public final class EmulationActivity extends AppCompatActivity
EmulationActivity.MENU_ACTION_MOTION_CONTROLS); EmulationActivity.MENU_ACTION_MOTION_CONTROLS);
} }
public static void launch(FragmentActivity activity, String filePath)
{
launch(activity, new String[]{filePath});
}
public static void launch(FragmentActivity activity, String[] filePaths) public static void launch(FragmentActivity activity, String[] filePaths)
{ {
if (sIgnoreLaunchRequests) if (sIgnoreLaunchRequests)
@ -411,11 +417,7 @@ public final class EmulationActivity extends AppCompatActivity
// If the user picked a file, as opposed to just backing out. // If the user picked a file, as opposed to just backing out.
if (resultCode == MainActivity.RESULT_OK) if (resultCode == MainActivity.RESULT_OK)
{ {
String newDiscPath = FileBrowserHelper.getSelectedPath(result); NativeLibrary.ChangeDisc(result.getData().toString());
if (!TextUtils.isEmpty(newDiscPath))
{
NativeLibrary.ChangeDisc(newDiscPath);
}
} }
} }
} }
@ -640,8 +642,10 @@ public final class EmulationActivity extends AppCompatActivity
break; break;
case MENU_ACTION_CHANGE_DISC: case MENU_ACTION_CHANGE_DISC:
FileBrowserHelper.openFilePicker(this, REQUEST_CHANGE_DISC, false, Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
FileBrowserHelper.GAME_EXTENSIONS); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CHANGE_DISC);
break; break;
case MENU_SET_IR_SENSITIVITY: case MENU_SET_IR_SENSITIVITY:

View File

@ -24,6 +24,8 @@ import org.dolphinemu.dolphinemu.ui.main.TvMainActivity;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper; import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.TvUtil; import org.dolphinemu.dolphinemu.utils.TvUtil;
import java.util.Set;
public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView
{ {
private static final String ARG_MENU_TAG = "menu_tag"; private static final String ARG_MENU_TAG = "menu_tag";
@ -172,13 +174,19 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
// If the user picked a file, as opposed to just backing out. // If the user picked a file, as opposed to just backing out.
if (resultCode == MainActivity.RESULT_OK) if (resultCode == MainActivity.RESULT_OK)
{ {
if (requestCode == MainPresenter.REQUEST_SD_FILE) if (requestCode != MainPresenter.REQUEST_DIRECTORY)
{ {
Uri uri = canonicalizeIfPossible(result.getData()); Uri uri = canonicalizeIfPossible(result.getData());
int takeFlags = result.getFlags() &
(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.RAW_EXTENSION, () -> Set<String> validExtensions = requestCode == MainPresenter.REQUEST_GAME_FILE ?
FileBrowserHelper.GAME_EXTENSIONS : FileBrowserHelper.RAW_EXTENSION;
int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
if (requestCode != MainPresenter.REQUEST_GAME_FILE)
flags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
int takeFlags = flags & result.getFlags();
FileBrowserHelper.runAfterExtensionCheck(this, uri, validExtensions, () ->
{ {
getContentResolver().takePersistableUriPermission(uri, takeFlags); getContentResolver().takePersistableUriPermission(uri, takeFlags);
getFragment().getAdapter().onFilePickerConfirmation(uri.toString()); getFragment().getAdapter().onFilePickerConfirmation(uri.toString());

View File

@ -306,28 +306,17 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
mClickedPosition = position; mClickedPosition = position;
FilePicker filePicker = (FilePicker) item; FilePicker filePicker = (FilePicker) item;
switch (filePicker.getRequestType()) Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{ {
case MainPresenter.REQUEST_SD_FILE: intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI,
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); filePicker.getSelectedValue(mView.getSettings()));
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI,
filePicker.getSelectedValue(mView.getSettings()));
}
mView.getActivity().startActivityForResult(intent, filePicker.getRequestType());
break;
case MainPresenter.REQUEST_GAME_FILE:
FileBrowserHelper.openFilePicker(mView.getActivity(), filePicker.getRequestType(), false,
FileBrowserHelper.GAME_EXTENSIONS);
break;
default:
throw new InvalidParameterException("Unhandled request code");
} }
mView.getActivity().startActivityForResult(intent, filePicker.getRequestType());
} }
public void onFilePickerConfirmation(String selectedFile) public void onFilePickerConfirmation(String selectedFile)

View File

@ -2,6 +2,7 @@ package org.dolphinemu.dolphinemu.ui.main;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -168,8 +169,10 @@ public final class MainActivity extends AppCompatActivity implements MainView
@Override @Override
public void launchOpenFileActivity() public void launchOpenFileActivity()
{ {
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false, Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
FileBrowserHelper.GAME_EXTENSIONS); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, MainPresenter.REQUEST_GAME_FILE);
} }
@Override @Override
@ -194,6 +197,7 @@ public final class MainActivity extends AppCompatActivity implements MainView
// If the user picked a file, as opposed to just backing out. // If the user picked a file, as opposed to just backing out.
if (resultCode == MainActivity.RESULT_OK) if (resultCode == MainActivity.RESULT_OK)
{ {
Uri uri = result.getData();
switch (requestCode) switch (requestCode)
{ {
case MainPresenter.REQUEST_DIRECTORY: case MainPresenter.REQUEST_DIRECTORY:
@ -201,12 +205,12 @@ public final class MainActivity extends AppCompatActivity implements MainView
break; break;
case MainPresenter.REQUEST_GAME_FILE: case MainPresenter.REQUEST_GAME_FILE:
EmulationActivity.launch(this, FileBrowserHelper.getSelectedFiles(result)); FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.GAME_EXTENSIONS,
() -> EmulationActivity.launch(this, result.getData().toString()));
break; break;
case MainPresenter.REQUEST_WAD_FILE: case MainPresenter.REQUEST_WAD_FILE:
FileBrowserHelper.runAfterExtensionCheck(this, result.getData(), FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.WAD_EXTENSION,
FileBrowserHelper.WAD_EXTENSION,
() -> mPresenter.installWAD(result.getData().toString())); () -> mPresenter.installWAD(result.getData().toString()));
break; break;
} }

View File

@ -2,6 +2,7 @@ package org.dolphinemu.dolphinemu.ui.main;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.widget.Toast; import android.widget.Toast;
@ -173,8 +174,10 @@ public final class TvMainActivity extends FragmentActivity implements MainView
@Override @Override
public void launchOpenFileActivity() public void launchOpenFileActivity()
{ {
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false, Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
FileBrowserHelper.GAME_EXTENSIONS); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, MainPresenter.REQUEST_GAME_FILE);
} }
@Override @Override
@ -218,6 +221,7 @@ public final class TvMainActivity extends FragmentActivity implements MainView
// If the user picked a file, as opposed to just backing out. // If the user picked a file, as opposed to just backing out.
if (resultCode == MainActivity.RESULT_OK) if (resultCode == MainActivity.RESULT_OK)
{ {
Uri uri = result.getData();
switch (requestCode) switch (requestCode)
{ {
case MainPresenter.REQUEST_DIRECTORY: case MainPresenter.REQUEST_DIRECTORY:
@ -225,12 +229,12 @@ public final class TvMainActivity extends FragmentActivity implements MainView
break; break;
case MainPresenter.REQUEST_GAME_FILE: case MainPresenter.REQUEST_GAME_FILE:
EmulationActivity.launch(this, FileBrowserHelper.getSelectedFiles(result)); FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.GAME_EXTENSIONS,
() -> EmulationActivity.launch(this, result.getData().toString()));
break; break;
case MainPresenter.REQUEST_WAD_FILE: case MainPresenter.REQUEST_WAD_FILE:
FileBrowserHelper.runAfterExtensionCheck(this, result.getData(), FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.WAD_EXTENSION,
FileBrowserHelper.WAD_EXTENSION,
() -> mPresenter.installWAD(result.getData().toString())); () -> mPresenter.installWAD(result.getData().toString()));
break; break;
} }

View File

@ -50,21 +50,6 @@ public final class FileBrowserHelper
activity.startActivityForResult(i, MainPresenter.REQUEST_DIRECTORY); activity.startActivityForResult(i, MainPresenter.REQUEST_DIRECTORY);
} }
public static void openFilePicker(FragmentActivity activity, int requestCode, boolean allowMulti,
HashSet<String> extensions)
{
Intent i = new Intent(activity, CustomFilePickerActivity.class);
i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, allowMulti);
i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false);
i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE);
i.putExtra(FilePickerActivity.EXTRA_START_PATH,
Environment.getExternalStorageDirectory().getPath());
i.putExtra(CustomFilePickerActivity.EXTRA_EXTENSIONS, extensions);
activity.startActivityForResult(i, requestCode);
}
@Nullable @Nullable
public static String getSelectedPath(Intent result) public static String getSelectedPath(Intent result)
{ {
@ -79,22 +64,6 @@ public final class FileBrowserHelper
return null; return null;
} }
@Nullable
public static String[] getSelectedFiles(Intent result)
{
// Use the provided utility method to parse the result
List<Uri> files = Utils.getSelectedFilesFromResult(result);
if (!files.isEmpty())
{
String[] paths = new String[files.size()];
for (int i = 0; i < files.size(); i++)
paths[i] = Utils.getFileForUri(files.get(i)).getAbsolutePath();
return paths;
}
return null;
}
public static boolean isPathEmptyOrValid(StringSetting path) public static boolean isPathEmptyOrValid(StringSetting path)
{ {
return isPathEmptyOrValid(path.getStringGlobal()); return isPathEmptyOrValid(path.getStringGlobal());