Android: Don't use SettingsAdapter's static state in file picker

This commit is contained in:
JosJuice 2020-03-23 00:53:22 -04:00 committed by Ryan Meredith
parent ccda75f33f
commit de5430b222
8 changed files with 81 additions and 46 deletions

View File

@ -1,5 +1,7 @@
package org.dolphinemu.dolphinemu.activities;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import androidx.annotation.Nullable;
@ -10,21 +12,38 @@ import com.nononsenseapps.filepicker.FilePickerActivity;
import org.dolphinemu.dolphinemu.fragments.CustomFilePickerFragment;
import java.io.File;
import java.util.HashSet;
public class CustomFilePickerActivity extends FilePickerActivity
{
public static final String EXTRA_EXTENSIONS = "dolphinemu.org.filepicker.extensions";
private HashSet<String> mExtensions;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent != null)
{
mExtensions = (HashSet<String>) intent.getSerializableExtra(EXTRA_EXTENSIONS);
}
}
@Override
protected AbstractFilePickerFragment<File> getFragment(
@Nullable final String startPath, final int mode, final boolean allowMultiple,
final boolean allowCreateDir, final boolean allowExistingFile,
final boolean singleClick)
{
AbstractFilePickerFragment<File> fragment = new CustomFilePickerFragment();
CustomFilePickerFragment fragment = new CustomFilePickerFragment();
// startPath is allowed to be null. In that case, default folder should be SD-card and not "/"
fragment.setArgs(
startPath != null ? startPath : Environment.getExternalStorageDirectory().getPath(),
mode, allowMultiple, allowCreateDir, allowExistingFile, singleClick);
fragment.setExtensions(mExtensions);
return fragment;
}
}

View File

@ -633,7 +633,8 @@ public final class EmulationActivity extends AppCompatActivity
return;
case MENU_ACTION_CHANGE_DISC:
FileBrowserHelper.openFilePicker(this, REQUEST_CHANGE_DISC, false);
FileBrowserHelper.openFilePicker(this, REQUEST_CHANGE_DISC, false,
FileBrowserHelper.GAME_EXTENSIONS);
return;
case MENU_SET_IR_SENSITIVITY:

View File

@ -176,9 +176,6 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
Toast.makeText(this, "Saved settings to INI files", Toast.LENGTH_SHORT).show();
}
}
// Clear static variables for File Picker activities that don't set extensions.
SettingsAdapter.sFilePicker = null;
SettingsAdapter.sItem = null;
// TODO: After result of FilePicker, duplicate SettingsActivity appears.
// Finish to avoid this. Is there a better method?

View File

@ -47,11 +47,9 @@ import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.Log;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder>
implements DialogInterface.OnClickListener, SeekBar.OnSeekBarChangeListener
@ -67,13 +65,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
private AlertDialog mDialog;
private TextView mTextSliderValue;
public static FilePicker sFilePicker;
public static SettingsItem sItem;
private static final Set<String> gameExtensions = new HashSet<>(Arrays.asList(
"gcm", "tgc", "iso", "ciso", "gcz", "wbfs", "wad", "dol", "elf", "dff"));
private static final Set<String> SDExtensions = new HashSet<>(Collections.singletonList("raw"));
// TODO: Properly restore these two on activity recreation
private static FilePicker sFilePicker;
private static SettingsItem sItem;
public SettingsAdapter(SettingsFragmentView view, Context context)
{
@ -305,7 +299,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
sFilePicker = (FilePicker) item;
sItem = item;
FileBrowserHelper.openDirectoryPicker(mView.getActivity());
FileBrowserHelper.openDirectoryPicker(mView.getActivity(), FileBrowserHelper.GAME_EXTENSIONS);
}
public void onFilePickerFileClick(SettingsItem item)
@ -313,7 +307,21 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
sFilePicker = (FilePicker) item;
sItem = item;
FileBrowserHelper.openFilePicker(mView.getActivity(), sFilePicker.getRequestType(), false);
HashSet<String> extensions;
switch (sFilePicker.getRequestType())
{
case MainPresenter.REQUEST_SD_FILE:
extensions = FileBrowserHelper.RAW_EXTENSION;
break;
case MainPresenter.REQUEST_GAME_FILE:
extensions = FileBrowserHelper.GAME_EXTENSIONS;
break;
default:
throw new InvalidParameterException("Unhandled request code");
}
FileBrowserHelper.openFilePicker(mView.getActivity(), sFilePicker.getRequestType(), false,
extensions);
}
public static void onFilePickerConfirmation(String file)
@ -340,25 +348,6 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
NativeLibrary.ReloadConfig();
}
public static Set<String> getExtensions()
{
try
{
if (sFilePicker.getRequestType() == MainPresenter.REQUEST_SD_FILE)
{
return SDExtensions;
}
else
{
return gameExtensions;
}
}
catch (NullPointerException ex)
{
return gameExtensions;
}
}
@Override
public void onClick(DialogInterface dialog, int which)
{

View File

@ -10,14 +10,28 @@ import android.view.View;
import android.widget.TextView;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;
import com.nononsenseapps.filepicker.FilePickerFragment;
import java.io.File;
import java.util.HashSet;
public class CustomFilePickerFragment extends FilePickerFragment
{
public static final String KEY_EXTENSIONS = "KEY_EXTENSIONS";
private HashSet<String> mExtensions;
public void setExtensions(HashSet<String> extensions)
{
Bundle b = getArguments();
if (b == null)
b = new Bundle();
b.putSerializable(KEY_EXTENSIONS, extensions);
setArguments(b);
}
@NonNull
@Override
public Uri toUri(@NonNull final File file)
@ -32,6 +46,8 @@ public class CustomFilePickerFragment extends FilePickerFragment
{
super.onActivityCreated(savedInstanceState);
mExtensions = (HashSet<String>) getArguments().getSerializable(KEY_EXTENSIONS);
if (mode == MODE_DIR)
{
TextView ok = getActivity().findViewById(R.id.nnf_button_ok);
@ -51,8 +67,7 @@ public class CustomFilePickerFragment extends FilePickerFragment
return (showHiddenItems || !file.isHidden()) &&
(file.isDirectory() ||
SettingsAdapter.getExtensions()
.contains(fileExtension(file.getName()).toLowerCase()));
mExtensions.contains(fileExtension(file.getName()).toLowerCase()));
}
@Override

View File

@ -145,13 +145,14 @@ public final class MainActivity extends AppCompatActivity implements MainView
@Override
public void launchFileListActivity()
{
FileBrowserHelper.openDirectoryPicker(this);
FileBrowserHelper.openDirectoryPicker(this, FileBrowserHelper.GAME_EXTENSIONS);
}
@Override
public void launchOpenFileActivity()
{
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false);
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false,
FileBrowserHelper.GAME_EXTENSIONS);
}
/**

View File

@ -142,13 +142,14 @@ public final class TvMainActivity extends FragmentActivity implements MainView
@Override
public void launchFileListActivity()
{
FileBrowserHelper.openDirectoryPicker(this);
FileBrowserHelper.openDirectoryPicker(this, FileBrowserHelper.GAME_EXTENSIONS);
}
@Override
public void launchOpenFileActivity()
{
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false);
FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_GAME_FILE, false,
FileBrowserHelper.GAME_EXTENSIONS);
}
@Override

View File

@ -14,11 +14,20 @@ import org.dolphinemu.dolphinemu.activities.CustomFilePickerActivity;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
public final class FileBrowserHelper
{
public static void openDirectoryPicker(FragmentActivity activity)
public static final HashSet<String> GAME_EXTENSIONS = new HashSet<>(Arrays.asList(
"gcm", "tgc", "iso", "ciso", "gcz", "wbfs", "wad", "dol", "elf", "dff"));
public static final HashSet<String> RAW_EXTENSION = new HashSet<>(Collections.singletonList(
"raw"));
public static void openDirectoryPicker(FragmentActivity activity, HashSet<String> extensions)
{
Intent i = new Intent(activity, CustomFilePickerActivity.class);
@ -27,11 +36,13 @@ public final class FileBrowserHelper
i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR);
i.putExtra(FilePickerActivity.EXTRA_START_PATH,
Environment.getExternalStorageDirectory().getPath());
i.putExtra(CustomFilePickerActivity.EXTRA_EXTENSIONS, extensions);
activity.startActivityForResult(i, MainPresenter.REQUEST_DIRECTORY);
}
public static void openFilePicker(FragmentActivity activity, int requestCode, boolean allowMulti)
public static void openFilePicker(FragmentActivity activity, int requestCode, boolean allowMulti,
HashSet<String> extensions)
{
Intent i = new Intent(activity, CustomFilePickerActivity.class);
@ -40,6 +51,7 @@ public final class FileBrowserHelper
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);
}