mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-14 00:09:24 +01:00
Android: Use storage access framework for picking single games
This commit is contained in:
parent
a7c05d7e84
commit
e60665da94
@ -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:
|
||||||
|
@ -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());
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user