Android: Centralize setting definitions

Except controller settings, because those would be annoying
to fit into the same system, and I only need the non-controller
settings to be brought over for the next commits to work.
This commit is contained in:
JosJuice 2020-07-18 19:27:32 +02:00
parent b1fecbb71c
commit 13d1ef6681
42 changed files with 929 additions and 786 deletions

View File

@ -33,6 +33,7 @@ import androidx.fragment.app.FragmentManager;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.fragments.EmulationFragment;
@ -855,7 +856,7 @@ public final class EmulationActivity extends AppCompatActivity
{
editor.putInt("wiiController", indexSelected);
File wiimoteNewFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_WIIMOTE);
File wiimoteNewFile = SettingsFile.getSettingsFile(Settings.FILE_WIIMOTE);
IniFile wiimoteNewIni = new IniFile(wiimoteNewFile);
wiimoteNewIni.setString("Wiimote1", "Extension",
getResources().getStringArray(R.array.controllersValues)[indexSelected]);
@ -889,7 +890,7 @@ public final class EmulationActivity extends AppCompatActivity
else
mMotionListener.disable();
File wiimoteNewFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_WIIMOTE);
File wiimoteNewFile = SettingsFile.getSettingsFile(Settings.FILE_WIIMOTE);
IniFile wiimoteNewIni = new IniFile(wiimoteNewFile);
wiimoteNewIni.setBoolean("Wiimote1", "IMUIR/Enabled", indexSelected != 1);
wiimoteNewIni.save(wiimoteNewFile);

View File

@ -8,15 +8,13 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.IniFile;
import org.dolphinemu.dolphinemu.utils.Log;
import java.io.File;
@ -65,14 +63,10 @@ public class GamePropertiesDialog extends DialogFragment
.getSupportFragmentManager(), "game_details");
break;
case 1:
File dolphinFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN);
IniFile dolphinIni = new IniFile(dolphinFile);
dolphinIni.setString(Settings.SECTION_INI_CORE, SettingsFile.KEY_DEFAULT_ISO,
path);
dolphinIni.save(dolphinFile);
NativeLibrary.ReloadConfig();
Toast.makeText(getContext(), "Default ISO set", Toast.LENGTH_SHORT).show();
Settings settings = new Settings();
settings.loadSettings(null);
Setting.MAIN_DEFAULT_ISO.setString(settings, path);
settings.saveSettings(null, getContext());
break;
case 2:
SettingsActivity.launch(getContext(), MenuTag.CONFIG, gameId);

View File

@ -0,0 +1,6 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public interface AbstractSetting
{
boolean delete(Settings settings);
}

View File

@ -0,0 +1,8 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public interface BooleanSetting extends AbstractSetting
{
boolean getBoolean(Settings settings, boolean defaultValue);
void setBoolean(Settings settings, boolean newValue);
}

View File

@ -0,0 +1,8 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public interface FloatSetting extends AbstractSetting
{
float getFloat(Settings settings, float defaultValue);
void setFloat(Settings settings, float newValue);
}

View File

@ -0,0 +1,8 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public interface IntSetting extends AbstractSetting
{
int getInt(Settings settings, int defaultValue);
void setInt(Settings settings, int newValue);
}

View File

@ -0,0 +1,69 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public class LegacySetting implements StringSetting, BooleanSetting, IntSetting, FloatSetting
{
private final String mFile;
private final String mSection;
private final String mKey;
public LegacySetting(String file, String section, String key)
{
mFile = file;
mSection = section;
mKey = key;
}
@Override
public boolean delete(Settings settings)
{
return settings.getSection(mFile, mSection).delete(mKey);
}
@Override
public String getString(Settings settings, String defaultValue)
{
return settings.getSection(mFile, mSection).getString(mKey, defaultValue);
}
@Override
public boolean getBoolean(Settings settings, boolean defaultValue)
{
return settings.getSection(mFile, mSection).getBoolean(mKey, defaultValue);
}
@Override
public int getInt(Settings settings, int defaultValue)
{
return settings.getSection(mFile, mSection).getInt(mKey, defaultValue);
}
@Override
public float getFloat(Settings settings, float defaultValue)
{
return settings.getSection(mFile, mSection).getFloat(mKey, defaultValue);
}
@Override
public void setString(Settings settings, String newValue)
{
settings.getSection(mFile, mSection).setString(mKey, newValue);
}
@Override
public void setBoolean(Settings settings, boolean newValue)
{
settings.getSection(mFile, mSection).setBoolean(mKey, newValue);
}
@Override
public void setInt(Settings settings, int newValue)
{
settings.getSection(mFile, mSection).setInt(mKey, newValue);
}
@Override
public void setFloat(Settings settings, float newValue)
{
settings.getSection(mFile, mSection).setFloat(mKey, newValue);
}
}

View File

@ -0,0 +1,186 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public enum Setting implements StringSetting, BooleanSetting, IntSetting, FloatSetting
{
// These entries have the same names and order as in C++, just for consistency.
MAIN_CPU_CORE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "CPUCore"),
MAIN_DSP_HLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "DSPHLE"),
MAIN_CPU_THREAD(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "CPUThread"),
MAIN_DEFAULT_ISO(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "DefaultISO"),
MAIN_GC_LANGUAGE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SelectedLanguage"),
MAIN_OVERRIDE_REGION_SETTINGS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE,
"OverrideRegionSettings"),
MAIN_AUDIO_STRETCH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AudioStretch"),
MAIN_SLOT_A(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotA"),
MAIN_SLOT_B(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotB"),
MAIN_WII_SD_CARD(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCard"),
MAIN_WIIMOTE_CONTINUOUS_SCANNING(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE,
"WiimoteContinuousScanning"),
MAIN_WIIMOTE_ENABLE_SPEAKER(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE,
"WiimoteEnableSpeaker"),
MAIN_EMULATION_SPEED(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EmulationSpeed"),
MAIN_OVERCLOCK(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "Overclock"),
MAIN_OVERCLOCK_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "OverclockEnable"),
MAIN_GFX_BACKEND(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "GFXBackend"),
MAIN_AUTO_DISC_CHANGE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AutoDiscChange"),
MAIN_ALLOW_SD_WRITES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCardAllowWrites"),
MAIN_ENABLE_SAVESTATES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EnableSaveStates"),
MAIN_DSP_JIT(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "EnableJIT"),
MAIN_AUDIO_VOLUME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "Volume"),
MAIN_DUMP_PATH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, "DumpPath"),
MAIN_LOAD_PATH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, "LoadPath"),
MAIN_RESOURCEPACK_PATH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, "ResourcePackPath"),
MAIN_FS_PATH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, "NANDRootPath"),
MAIN_SD_PATH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, "WiiSDCardPath"),
MAIN_USE_PANIC_HANDLERS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_INTERFACE,
"UsePanicHandlers"),
MAIN_OSD_MESSAGES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_INTERFACE,
"OnScreenDisplayMessages"),
MAIN_ANALYTICS_ENABLED(Settings.FILE_DOLPHIN, Settings.SECTION_ANALYTICS, "Enabled"),
MAIN_ANALYTICS_PERMISSION_ASKED(Settings.FILE_DOLPHIN, Settings.SECTION_ANALYTICS,
"PermissionAsked"),
MAIN_RECURSIVE_ISO_PATHS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL,
"RecursiveISOPaths"),
MAIN_LAST_PLATFORM_TAB(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "LastPlatformTab"),
GFX_WIDESCREEN_HACK(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "wideScreenHack"),
GFX_ASPECT_RATIO(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "AspectRatio"),
GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"SafeTextureCacheColorSamples"),
GFX_SHOW_FPS(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "ShowFPS"),
GFX_ENABLE_GPU_TEXTURE_DECODING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"EnableGPUTextureDecoding"),
GFX_ENABLE_PIXEL_LIGHTING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"EnablePixelLighting"),
GFX_FAST_DEPTH_CALC(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "FastDepthCalc"),
GFX_MSAA(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "MSAA"),
GFX_EFB_SCALE(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "InternalResolution"),
GFX_DISABLE_FOG(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "DisableFog"),
GFX_BACKEND_MULTITHREADING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"BackendMultithreading"),
GFX_WAIT_FOR_SHADERS_BEFORE_STARTING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"WaitForShadersBeforeStarting"),
GFX_SHADER_COMPILATION_MODE(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS,
"ShaderCompilationMode"),
GFX_ENHANCE_FORCE_FILTERING(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS,
"ForceFiltering"),
GFX_ENHANCE_MAX_ANISOTROPY(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, "MaxAnisotropy"),
GFX_ENHANCE_POST_SHADER(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS,
"PostProcessingShader"),
GFX_ENHANCE_FORCE_TRUE_COLOR(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS,
"ForceTrueColor"),
GFX_ENHANCE_DISABLE_COPY_FILTER(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS,
"DisableCopyFilter"),
GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS,
"ArbitraryMipmapDetection"),
GFX_STEREO_MODE(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoMode"),
GFX_STEREO_DEPTH(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoDepth"),
GFX_STEREO_CONVERGENCE_PERCENTAGE(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY,
"StereoConvergencePercentage"),
GFX_STEREO_SWAP_EYES(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoSwapEyes"),
GFX_HACK_EFB_ACCESS_ENABLE(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "EFBAccessEnable"),
GFX_HACK_SKIP_EFB_COPY_TO_RAM(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS,
"EFBToTextureEnable"),
GFX_HACK_SKIP_XFB_COPY_TO_RAM(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS,
"XFBToTextureEnable"),
GFX_HACK_DEFER_EFB_COPIES(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "DeferEFBCopies"),
GFX_HACK_IMMEDIATE_XFB(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "ImmediateXFBEnable"),
GFX_HACK_SKIP_DUPLICATE_XFBS(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "SkipDuplicateXFBs"),
GFX_HACK_COPY_EFB_SCALED(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "EFBScaledCopy"),
GFX_HACK_EFB_EMULATE_FORMAT_CHANGES(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS,
"EFBEmulateFormatChanges"),
LOGGER_WRITE_TO_FILE(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "WriteToFile"),
LOGGER_VERBOSITY(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "Verbosity"),
// These settings are not yet in the new config system in C++ - please move them once they are
MAIN_JIT_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitOff"),
MAIN_JIT_LOAD_STORE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitLoadStoreOff"),
MAIN_JIT_LOAD_STORE_FLOATING_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG,
"JitLoadStoreFloatingOff"),
MAIN_JIT_LOAD_STORE_PAIRED_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG,
"JitLoadStorePairedOff"),
MAIN_JIT_FLOATING_POINT_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitFloatingPointOff"),
MAIN_JIT_INTEGER_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitIntegerOff"),
MAIN_JIT_PAIRED_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitPairedOff"),
MAIN_JIT_SYSTEM_REGISTERS_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG,
"JitSystemRegistersOff"),
MAIN_JIT_BRANCH_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitBranchOff"),
MAIN_JIT_REGISTER_CACHE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitRegisterCacheOff");
private final String mFile;
private final String mSection;
private final String mKey;
Setting(String file, String section, String key)
{
mFile = file;
mSection = section;
mKey = key;
}
@Override
public boolean delete(Settings settings)
{
return settings.getSection(mFile, mSection).delete(mKey);
}
@Override
public String getString(Settings settings, String defaultValue)
{
return settings.getSection(mFile, mSection).getString(mKey, defaultValue);
}
@Override
public boolean getBoolean(Settings settings, boolean defaultValue)
{
return settings.getSection(mFile, mSection).getBoolean(mKey, defaultValue);
}
@Override
public int getInt(Settings settings, int defaultValue)
{
return settings.getSection(mFile, mSection).getInt(mKey, defaultValue);
}
@Override
public float getFloat(Settings settings, float defaultValue)
{
return settings.getSection(mFile, mSection).getFloat(mKey, defaultValue);
}
@Override
public void setString(Settings settings, String newValue)
{
settings.getSection(mFile, mSection).setString(mKey, newValue);
}
@Override
public void setBoolean(Settings settings, boolean newValue)
{
settings.getSection(mFile, mSection).setBoolean(mKey, newValue);
}
@Override
public void setInt(Settings settings, int newValue)
{
settings.getSection(mFile, mSection).setInt(mKey, newValue);
}
@Override
public void setFloat(Settings settings, float newValue)
{
settings.getSection(mFile, mSection).setFloat(mKey, newValue);
}
}

View File

@ -2,6 +2,7 @@ package org.dolphinemu.dolphinemu.features.settings.model;
import android.content.Context;
import android.text.TextUtils;
import android.widget.Toast;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView;
@ -9,13 +10,17 @@ import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
import org.dolphinemu.dolphinemu.utils.IniFile;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Settings
{
public static final String FILE_DOLPHIN = "Dolphin";
public static final String FILE_GFX = "GFX";
public static final String FILE_LOGGER = "Logger";
public static final String FILE_GCPAD = "GCPadNew";
public static final String FILE_WIIMOTE = "WiimoteNew";
public static final String SECTION_INI_ANDROID = "Android";
public static final String SECTION_INI_GENERAL = "General";
public static final String SECTION_INI_CORE = "Core";
@ -39,22 +44,19 @@ public class Settings
public static final String SECTION_CONTROLS = "Controls";
public static final String SECTION_PROFILE = "Profile";
private static final int DSP_HLE = 0;
private static final int DSP_LLE_RECOMPILER = 1;
private static final int DSP_LLE_INTERPRETER = 2;
public static final String SECTION_ANALYTICS = "Analytics";
public static final String GAME_SETTINGS_PLACEHOLDER_FILE_NAME = "";
private String gameId;
private static final String[] configFiles = new String[]{SettingsFile.FILE_NAME_DOLPHIN,
SettingsFile.FILE_NAME_GFX, SettingsFile.FILE_NAME_LOGGER,
SettingsFile.FILE_NAME_WIIMOTE};
private static final String[] configFiles = new String[]{FILE_DOLPHIN, FILE_GFX, FILE_LOGGER,
FILE_WIIMOTE};
private HashMap<String, IniFile> mIniFiles = new HashMap<>();
private boolean mLoadedRecursiveIsoPathsValue = false;
private IniFile getGameSpecificFile()
{
if (TextUtils.isEmpty(gameId) || mIniFiles.size() != 1)
@ -93,6 +95,8 @@ public class Settings
{
loadCustomGameSettings(gameId, view);
}
mLoadedRecursiveIsoPathsValue = Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this, false);
}
private void loadDolphinSettings(SettingsActivityView view)
@ -123,62 +127,37 @@ public class Settings
loadSettings(view);
}
public void saveSettings(SettingsActivityView view, Context context, Set<String> modifiedSettings)
public void saveSettings(SettingsActivityView view, Context context)
{
if (TextUtils.isEmpty(gameId))
{
view.showToastMessage("Saved settings to INI files");
if (context != null)
Toast.makeText(context, "Saved settings to INI files", Toast.LENGTH_SHORT).show();
for (Map.Entry<String, IniFile> entry : mIniFiles.entrySet())
{
SettingsFile.saveFile(entry.getKey(), entry.getValue(), view);
}
if (modifiedSettings.contains(SettingsFile.KEY_DSP_ENGINE))
{
File dolphinFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN);
IniFile dolphinIni = new IniFile(dolphinFile);
switch (dolphinIni.getInt(Settings.SECTION_INI_ANDROID, SettingsFile.KEY_DSP_ENGINE,
DSP_HLE))
{
case DSP_HLE:
dolphinIni.setBoolean(Settings.SECTION_INI_CORE, SettingsFile.KEY_DSP_HLE, true);
dolphinIni.setBoolean(Settings.SECTION_INI_DSP, SettingsFile.KEY_DSP_ENABLE_JIT, true);
break;
case DSP_LLE_RECOMPILER:
dolphinIni.setBoolean(Settings.SECTION_INI_CORE, SettingsFile.KEY_DSP_HLE, false);
dolphinIni.setBoolean(Settings.SECTION_INI_DSP, SettingsFile.KEY_DSP_ENABLE_JIT, true);
break;
case DSP_LLE_INTERPRETER:
dolphinIni.setBoolean(Settings.SECTION_INI_CORE, SettingsFile.KEY_DSP_HLE, false);
dolphinIni.setBoolean(Settings.SECTION_INI_DSP, SettingsFile.KEY_DSP_ENABLE_JIT, false);
break;
}
dolphinIni.save(dolphinFile);
}
// Notify the native code of the changes
NativeLibrary.ReloadConfig();
NativeLibrary.ReloadWiimoteConfig();
NativeLibrary.ReloadLoggerConfig();
NativeLibrary.UpdateGCAdapterScanThread();
if (modifiedSettings.contains(SettingsFile.KEY_RECURSIVE_ISO_PATHS))
if (mLoadedRecursiveIsoPathsValue != Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this, false))
{
// Refresh game library
GameFileCacheService.startRescan(context);
}
modifiedSettings.clear();
}
else
{
// custom game settings
view.showToastMessage("Saved settings for " + gameId);
if (context != null)
Toast.makeText(context, "Saved settings for " + gameId, Toast.LENGTH_SHORT).show();
SettingsFile.saveCustomGameSettings(gameId, getGameSpecificFile());
}
}
@ -214,6 +193,6 @@ public class Settings
if (TextUtils.isEmpty(gameId))
return false;
return getSection(SettingsFile.FILE_NAME_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName");
return getSection(Settings.FILE_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName");
}
}

View File

@ -0,0 +1,8 @@
package org.dolphinemu.dolphinemu.features.settings.model;
public interface StringSetting extends AbstractSetting
{
String getString(Settings settings, String defaultValue);
void setString(Settings settings, String newValue);
}

View File

@ -1,26 +1,29 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public class CheckBoxSetting extends SettingsItem
{
protected BooleanSetting mSetting;
protected boolean mDefaultValue;
public CheckBoxSetting(String file, String section, String key, int titleId, int descriptionId,
public CheckBoxSetting(BooleanSetting setting, int titleId, int descriptionId,
boolean defaultValue)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mDefaultValue = defaultValue;
}
public boolean isChecked(Settings settings)
{
return settings.getSection(getFile(), getSection()).getBoolean(getKey(), mDefaultValue);
return mSetting.getBoolean(settings, mDefaultValue);
}
public void setChecked(Settings settings, boolean checked)
{
settings.getSection(getFile(), getSection()).setBoolean(getKey(), checked);
mSetting.setBoolean(settings, checked);
}
@Override

View File

@ -9,7 +9,7 @@ public final class ConfirmRunnable extends SettingsItem
public ConfirmRunnable(int titleId, int descriptionId, int alertText, int confirmationText,
Runnable runnable)
{
super(null, null, null, titleId, descriptionId);
super(titleId, descriptionId);
mAlertText = alertText;
mConfirmationText = confirmationText;
mRunnable = runnable;

View File

@ -1,28 +1,31 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting;
public final class FilePicker extends SettingsItem
{
private StringSetting mSetting;
private String mDefaultValue;
private int mRequestType;
public FilePicker(String file, String section, String key, int titleId, int descriptionId,
public FilePicker(StringSetting setting, int titleId, int descriptionId,
String defaultVault, int requestType)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mDefaultValue = defaultVault;
mRequestType = requestType;
}
public String getSelectedValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getString(getKey(), mDefaultValue);
return mSetting.getString(settings, mDefaultValue);
}
public void setSelectedValue(Settings settings, String selection)
{
settings.getSection(getFile(), getSection()).setString(getKey(), selection);
mSetting.setString(settings, selection);
}
public int getRequestType()

View File

@ -1,26 +1,28 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public class FloatSliderSetting extends SliderSetting
{
protected FloatSetting mSetting;
protected float mDefaultValue;
public FloatSliderSetting(String file, String section, String key, int titleId, int descriptionId,
int max, String units, float defaultValue)
public FloatSliderSetting(FloatSetting setting, int titleId, int descriptionId, int max,
String units, float defaultValue)
{
super(file, section, key, titleId, descriptionId, max, units);
super(titleId, descriptionId, max, units);
mSetting = setting;
mDefaultValue = defaultValue;
}
public int getSelectedValue(Settings settings)
{
float value = settings.getSection(getFile(), getSection()).getFloat(getKey(), mDefaultValue);
return Math.round(value);
return Math.round(mSetting.getFloat(settings, mDefaultValue));
}
public void setSelectedValue(Settings settings, float selection)
{
settings.getSection(getFile(), getSection()).setFloat(getKey(), selection);
mSetting.setFloat(settings, selection);
}
}

View File

@ -2,9 +2,9 @@ package org.dolphinemu.dolphinemu.features.settings.model.view;
public final class HeaderSetting extends SettingsItem
{
public HeaderSetting(String key, int titleId, int descriptionId)
public HeaderSetting(int titleId, int descriptionId)
{
super(null, null, key, titleId, descriptionId);
super(titleId, descriptionId);
}
@Override

View File

@ -10,17 +10,29 @@ import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public class InputBindingSetting extends SettingsItem
{
private String gameId;
private String mFile;
private String mSection;
private String mKey;
private String mGameId;
public InputBindingSetting(String file, String section, String key, int titleId, String gameId)
{
super(file, section, key, titleId, 0);
this.gameId = gameId;
super(titleId, 0);
mFile = file;
mSection = section;
mKey = key;
mGameId = gameId;
}
public String getKey()
{
return mKey;
}
public String getValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getString(getKey(), "");
return settings.getSection(mFile, mSection).getString(mKey, "");
}
/**
@ -60,10 +72,10 @@ public class InputBindingSetting extends SettingsItem
preferences =
PreferenceManager.getDefaultSharedPreferences(DolphinApplication.getAppContext());
SharedPreferences.Editor editor = preferences.edit();
editor.putString(getKey() + gameId, ui);
editor.putString(mKey + mGameId, ui);
editor.apply();
settings.getSection(getFile(), getSection()).setString(getKey(), bind);
settings.getSection(mFile, mSection).setString(mKey, bind);
}
public void clearValue(Settings settings)
@ -79,6 +91,6 @@ public class InputBindingSetting extends SettingsItem
public String getGameId()
{
return gameId;
return mGameId;
}
}

View File

@ -1,25 +1,28 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public final class IntSliderSetting extends SliderSetting
{
private IntSetting mSetting;
private int mDefaultValue;
public IntSliderSetting(String file, String section, String key, int titleId, int descriptionId,
int max, String units, int defaultValue)
public IntSliderSetting(IntSetting setting, int titleId, int descriptionId, int max,
String units, int defaultValue)
{
super(file, section, key, titleId, descriptionId, max, units);
super(titleId, descriptionId, max, units);
mSetting = setting;
mDefaultValue = defaultValue;
}
public int getSelectedValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue);
return mSetting.getInt(settings, mDefaultValue);
}
public void setSelectedValue(Settings settings, int selection)
{
settings.getSection(getFile(), getSection()).setInt(getKey(), selection);
mSetting.setInt(settings, selection);
}
}

View File

@ -1,24 +1,25 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public final class InvertedCheckBoxSetting extends CheckBoxSetting
{
public InvertedCheckBoxSetting(String file, String section, String key, int titleId,
public InvertedCheckBoxSetting(BooleanSetting setting, int titleId,
int descriptionId, boolean defaultValue)
{
super(file, section, key, titleId, descriptionId, !defaultValue);
super(setting, titleId, descriptionId, !defaultValue);
}
@Override
public boolean isChecked(Settings settings)
{
return !settings.getSection(getFile(), getSection()).getBoolean(getKey(), mDefaultValue);
return !mSetting.getBoolean(settings, mDefaultValue);
}
@Override
public void setChecked(Settings settings, boolean checked)
{
settings.getSection(getFile(), getSection()).setBoolean(getKey(), !checked);
mSetting.setBoolean(settings, !checked);
}
}

View File

@ -0,0 +1,22 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.LegacySetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public class LogCheckBoxSetting extends CheckBoxSetting
{
String mKey;
public LogCheckBoxSetting(String key, int titleId, int descriptionId,
boolean defaultValue)
{
super(new LegacySetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key), titleId,
descriptionId, defaultValue);
mKey = key;
}
public String getKey()
{
return mKey;
}
}

View File

@ -1,25 +1,25 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
public final class PercentSliderSetting extends FloatSliderSetting
{
public PercentSliderSetting(String file, String section, String key, int titleId,
int descriptionId, int max, String units, float defaultValue)
public PercentSliderSetting(FloatSetting setting, int titleId, int descriptionId, int max,
String units, float defaultValue)
{
super(file, section, key, titleId, descriptionId, max, units, defaultValue / 100);
super(setting, titleId, descriptionId, max, units, defaultValue / 100);
}
@Override
public int getSelectedValue(Settings settings)
{
float value = settings.getSection(getFile(), getSection()).getFloat(getKey(), mDefaultValue);
return Math.round(value * 100);
return Math.round(mSetting.getFloat(settings, mDefaultValue) * 100);
}
@Override
public void setSelectedValue(Settings settings, float selection)
{
settings.getSection(getFile(), getSection()).setFloat(getKey(), selection / 100);
mSetting.setFloat(settings, selection / 100);
}
}

View File

@ -21,56 +21,22 @@ public abstract class SettingsItem
public static final int TYPE_FILE_PICKER = 9;
public static final int TYPE_CONFIRM_RUNNABLE = 10;
private String mFile;
private String mSection;
private String mKey;
private int mNameId;
private int mDescriptionId;
/**
* Base constructor.
*
* @param file File to which the Setting belongs.
* @param section Section to which the Setting belongs.
* @param key Identifier for the Setting represented by this Item.
* @param nameId Resource ID for a text string to be displayed as this setting's name.
* @param descriptionId Resource ID for a text string to be displayed as this setting's description.
*/
public SettingsItem(String file, String section, String key, int nameId, int descriptionId)
public SettingsItem(int nameId, int descriptionId)
{
mFile = file;
mSection = section;
mKey = key;
mNameId = nameId;
mDescriptionId = descriptionId;
}
/**
* @return The file in which the backing setting belongs.
*/
public String getFile()
{
return mFile;
}
/**
* @return The header under which the backing setting belongs.
*/
public String getSection()
{
return mSection;
}
/**
* @return The identifier for the backing setting.
*/
public String getKey()
{
return mKey;
}
/**
* @return A resource ID for a text string representing this setting's name.
*/

View File

@ -1,30 +1,33 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
public final class SingleChoiceSetting extends SettingsItem
{
private IntSetting mSetting;
private int mDefaultValue;
private int mChoicesId;
private int mValuesId;
private MenuTag menuTag;
public SingleChoiceSetting(String file, String section, String key, int titleId,
int descriptionId, int choicesId, int valuesId, int defaultValue, MenuTag menuTag)
public SingleChoiceSetting(IntSetting setting, int titleId, int descriptionId, int choicesId,
int valuesId, int defaultValue, MenuTag menuTag)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mDefaultValue = defaultValue;
mValuesId = valuesId;
mChoicesId = choicesId;
mDefaultValue = defaultValue;
this.menuTag = menuTag;
}
public SingleChoiceSetting(String file, String section, String key, int titleId,
int descriptionId, int choicesId, int valuesId, int defaultValue)
public SingleChoiceSetting(IntSetting setting, int titleId, int descriptionId, int choicesId,
int valuesId, int defaultValue)
{
this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
}
public int getChoicesId()
@ -39,7 +42,7 @@ public final class SingleChoiceSetting extends SettingsItem
public int getSelectedValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue);
return mSetting.getInt(settings, mDefaultValue);
}
public MenuTag getMenuTag()
@ -49,7 +52,7 @@ public final class SingleChoiceSetting extends SettingsItem
public void setSelectedValue(Settings settings, int selection)
{
settings.getSection(getFile(), getSection()).setInt(getKey(), selection);
mSetting.setInt(settings, selection);
}
@Override

View File

@ -1,10 +1,12 @@
package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem
{
private IntSetting mSetting;
private int mDefaultValue;
private int mChoicesId;
@ -13,24 +15,25 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem
private int mDescriptionValuesId;
private MenuTag menuTag;
public SingleChoiceSettingDynamicDescriptions(String file, String section, String key,
int titleId, int descriptionId, int choicesId, int valuesId, int descriptionChoicesId,
int descriptionValuesId, int defaultValue, MenuTag menuTag)
public SingleChoiceSettingDynamicDescriptions(IntSetting setting, int titleId, int descriptionId,
int choicesId, int valuesId, int descriptionChoicesId, int descriptionValuesId,
int defaultValue, MenuTag menuTag)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mDefaultValue = defaultValue;
mValuesId = valuesId;
mChoicesId = choicesId;
mDescriptionChoicesId = descriptionChoicesId;
mDescriptionValuesId = descriptionValuesId;
mDefaultValue = defaultValue;
this.menuTag = menuTag;
}
public SingleChoiceSettingDynamicDescriptions(String file, String section, String key,
int titleId, int descriptionId, int choicesId, int valuesId, int descriptionChoicesId,
int descriptionValuesId, int defaultValue)
public SingleChoiceSettingDynamicDescriptions(IntSetting setting, int titleId, int descriptionId,
int choicesId, int valuesId, int descriptionChoicesId, int descriptionValuesId,
int defaultValue)
{
this(file, section, key, titleId, descriptionId, choicesId, valuesId, descriptionChoicesId,
this(setting, titleId, descriptionId, choicesId, valuesId, descriptionChoicesId,
descriptionValuesId, defaultValue, null);
}
@ -56,7 +59,7 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem
public int getSelectedValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue);
return mSetting.getInt(settings, mDefaultValue);
}
public MenuTag getMenuTag()
@ -66,7 +69,7 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem
public void setSelectedValue(Settings settings, int selection)
{
settings.getSection(getFile(), getSection()).setInt(getKey(), selection);
mSetting.setInt(settings, selection);
}
@Override

View File

@ -7,10 +7,9 @@ public abstract class SliderSetting extends SettingsItem
private int mMax;
private String mUnits;
public SliderSetting(String file, String section, String key, int nameId, int descriptionId,
int max, String units)
public SliderSetting(int nameId, int descriptionId, int max, String units)
{
super(file, section, key, nameId, descriptionId);
super(nameId, descriptionId);
mMax = max;
mUnits = units;
}

View File

@ -2,47 +2,51 @@ package org.dolphinemu.dolphinemu.features.settings.model.view;
import org.dolphinemu.dolphinemu.DolphinApplication;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
public class StringSingleChoiceSetting extends SettingsItem
{
private StringSetting mSetting;
private String mDefaultValue;
private String[] mChoicesId;
private String[] mValuesId;
private MenuTag mMenuTag;
public StringSingleChoiceSetting(String file, String section, String key, int titleId,
public StringSingleChoiceSetting(StringSetting setting, int titleId,
int descriptionId, String[] choicesId, String[] valuesId, String defaultValue,
MenuTag menuTag)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mChoicesId = choicesId;
mValuesId = valuesId;
mDefaultValue = defaultValue;
mMenuTag = menuTag;
}
public StringSingleChoiceSetting(String file, String section, String key, int titleId,
public StringSingleChoiceSetting(StringSetting setting, int titleId,
int descriptionId, String[] choicesId, String[] valuesId, String defaultValue)
{
this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
}
public StringSingleChoiceSetting(String file, String section, String key, int titleId,
public StringSingleChoiceSetting(StringSetting setting, int titleId,
int descriptionId, int choicesId, int valuesId, String defaultValue, MenuTag menuTag)
{
super(file, section, key, titleId, descriptionId);
super(titleId, descriptionId);
mSetting = setting;
mChoicesId = DolphinApplication.getAppContext().getResources().getStringArray(choicesId);
mValuesId = DolphinApplication.getAppContext().getResources().getStringArray(valuesId);
mDefaultValue = defaultValue;
mMenuTag = menuTag;
}
public StringSingleChoiceSetting(String file, String section, String key, int titleId,
public StringSingleChoiceSetting(StringSetting setting, int titleId,
int descriptionId, int choicesId, int valuesId, String defaultValue)
{
this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null);
}
public String[] getChoicesId()
@ -70,7 +74,7 @@ public class StringSingleChoiceSetting extends SettingsItem
public String getSelectedValue(Settings settings)
{
return settings.getSection(getFile(), getSection()).getString(getKey(), mDefaultValue);
return mSetting.getString(settings, mDefaultValue);
}
public int getSelectValueIndex(Settings settings)
@ -94,7 +98,7 @@ public class StringSingleChoiceSetting extends SettingsItem
public void setSelectedValue(Settings settings, String selection)
{
settings.getSection(getFile(), getSection()).setString(getKey(), selection);
mSetting.setString(settings, selection);
}
@Override

View File

@ -6,9 +6,9 @@ public final class SubmenuSetting extends SettingsItem
{
private MenuTag mMenuKey;
public SubmenuSetting(String key, int titleId, MenuTag menuKey)
public SubmenuSetting(int titleId, MenuTag menuKey)
{
super(null, null, key, titleId, 0);
super(titleId, 0);
mMenuKey = menuKey;
}

View File

@ -224,9 +224,9 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
}
@Override
public void onSettingChanged(String key)
public void onSettingChanged()
{
mPresenter.onSettingChanged(key);
mPresenter.onSettingChanged();
}
@Override

View File

@ -10,9 +10,6 @@ import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.Log;
import java.util.HashSet;
import java.util.Set;
public final class SettingsActivityPresenter
{
private static final String KEY_SHOULD_SAVE = "should_save";
@ -29,8 +26,6 @@ public final class SettingsActivityPresenter
private String gameId;
private Context context;
private final Set<String> modifiedSettings = new HashSet<>();
SettingsActivityPresenter(SettingsActivityView view, Settings settings)
{
mView = view;
@ -98,7 +93,7 @@ public final class SettingsActivityPresenter
public void clearSettings()
{
mSettings.clearSettings();
onSettingChanged(null);
onSettingChanged();
}
public void onStop(boolean finishing)
@ -112,7 +107,7 @@ public final class SettingsActivityPresenter
if (mSettings != null && finishing && mShouldSave)
{
Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...");
mSettings.saveSettings(mView, context, modifiedSettings);
mSettings.saveSettings(mView, context);
}
}
@ -127,13 +122,8 @@ public final class SettingsActivityPresenter
return false;
}
public void onSettingChanged(String key)
public void onSettingChanged()
{
if (key != null)
{
modifiedSettings.add(key);
}
mShouldSave = true;
}

View File

@ -53,10 +53,8 @@ public interface SettingsActivityView
/**
* Called by a containing Fragment to tell the Activity that a setting was changed;
* unless this has been called, the Activity will not save to disk.
*
* @param key Key of the modified setting.
*/
void onSettingChanged(String key);
void onSettingChanged();
/**
* Called by a containing Fragment to tell the containing Activity that a GCPad's setting

View File

@ -13,6 +13,8 @@ import androidx.recyclerview.widget.RecyclerView;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.dialogs.MotionAlertDialog;
import org.dolphinemu.dolphinemu.features.settings.model.LegacySetting;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker;
@ -36,10 +38,8 @@ import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SettingViewHold
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SingleChoiceViewHolder;
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SliderViewHolder;
import org.dolphinemu.dolphinemu.features.settings.ui.viewholder.SubmenuViewHolder;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.IniFile;
import java.security.InvalidParameterException;
import java.util.ArrayList;
@ -164,7 +164,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
item.setChecked(getSettings(), checked);
notifyItemChanged(position);
mView.onSettingChanged(item.getKey());
mView.onSettingChanged();
}
public void onSingleChoiceClick(SingleChoiceSetting item, int position)
@ -265,7 +265,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
dialog.setOnDismissListener(dialog1 ->
{
notifyItemChanged(position);
mView.onSettingChanged(item.getKey());
mView.onSettingChanged();
});
dialog.setCanceledOnTouchOutside(false);
dialog.show();
@ -308,7 +308,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
FilePicker filePicker = (FilePicker) mClickedItem;
if (!filePicker.getSelectedValue(mView.getSettings()).equals(selectedFile))
mView.onSettingChanged(filePicker.getKey());
mView.onSettingChanged();
filePicker.setSelectedValue(mView.getSettings(), selectedFile);
@ -317,32 +317,29 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
public void resetPaths()
{
IniFile.Section coreSection = mView.getSettings().getSection(SettingsFile.FILE_NAME_DOLPHIN,
Settings.SECTION_INI_CORE);
IniFile.Section generalSection = mView.getSettings().getSection(SettingsFile.FILE_NAME_DOLPHIN,
Settings.SECTION_INI_GENERAL);
Settings settings = mView.getSettings();
coreSection.delete(SettingsFile.KEY_DEFAULT_ISO);
generalSection.delete(SettingsFile.KEY_NAND_ROOT_PATH);
generalSection.delete(SettingsFile.KEY_DUMP_PATH);
generalSection.delete(SettingsFile.KEY_LOAD_PATH);
generalSection.delete(SettingsFile.KEY_RESOURCE_PACK_PATH);
generalSection.delete(SettingsFile.KEY_WII_SD_CARD_PATH);
Setting.MAIN_DEFAULT_ISO.delete(settings);
Setting.MAIN_FS_PATH.delete(settings);
Setting.MAIN_DUMP_PATH.delete(settings);
Setting.MAIN_LOAD_PATH.delete(settings);
Setting.MAIN_RESOURCEPACK_PATH.delete(settings);
Setting.MAIN_SD_PATH.delete(settings);
mView.onSettingChanged(null);
mView.onSettingChanged();
}
public void setAllLogTypes(boolean value)
{
IniFile.Section section = mView.getSettings().getSection(SettingsFile.FILE_NAME_LOGGER,
Settings.SECTION_LOGGER_LOGS);
Settings settings = mView.getSettings();
for (Map.Entry<String, String> entry : SettingsFragmentPresenter.LOG_TYPE_NAMES.entrySet())
{
section.setBoolean(entry.getKey(), value);
new LegacySetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey())
.setBoolean(settings, value);
}
mView.onSettingChanged(null);
mView.onSettingChanged();
}
private void handleMenuTag(MenuTag menuTag, int value)
@ -375,7 +372,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
int value = getValueForSingleChoiceSelection(scSetting, which);
if (scSetting.getSelectedValue(getSettings()) != value)
mView.onSettingChanged(mClickedItem.getKey());
mView.onSettingChanged();
handleMenuTag(scSetting.getMenuTag(), value);
@ -390,7 +387,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
int value = getValueForSingleChoiceDynamicDescriptionsSelection(scSetting, which);
if (scSetting.getSelectedValue(getSettings()) != value)
mView.onSettingChanged(mClickedItem.getKey());
mView.onSettingChanged();
scSetting.setSelectedValue(getSettings(), value);
@ -401,7 +398,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
StringSingleChoiceSetting scSetting = (StringSingleChoiceSetting) mClickedItem;
String value = scSetting.getValueAt(which);
if (!scSetting.getSelectedValue(getSettings()).equals(value))
mView.onSettingChanged(mClickedItem.getKey());
mView.onSettingChanged();
handleMenuTag(scSetting.getMenuTag(), which);
@ -413,7 +410,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
{
IntSliderSetting sliderSetting = (IntSliderSetting) mClickedItem;
if (sliderSetting.getSelectedValue(getSettings()) != mSeekbarProgress)
mView.onSettingChanged(mClickedItem.getKey());
mView.onSettingChanged();
sliderSetting.setSelectedValue(getSettings(), mSeekbarProgress);
@ -423,7 +420,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
{
FloatSliderSetting sliderSetting = (FloatSliderSetting) mClickedItem;
if (sliderSetting.getSelectedValue(getSettings()) != mSeekbarProgress)
mView.onSettingChanged(mClickedItem.getKey());
mView.onSettingChanged();
sliderSetting.setSelectedValue(getSettings(), mSeekbarProgress);

View File

@ -193,9 +193,9 @@ public final class SettingsFragment extends Fragment implements SettingsFragment
}
@Override
public void onSettingChanged(String key)
public void onSettingChanged()
{
mActivity.onSettingChanged(key);
mActivity.onSettingChanged();
}
@Override

View File

@ -66,10 +66,8 @@ public interface SettingsFragmentView
/**
* Have the fragment tell the containing Activity that a setting was modified.
*
* @param key Key of the modified setting, potentially null for multiple settings.
*/
void onSettingChanged(String key);
void onSettingChanged();
/**
* Have the fragment tell the containing Activity that a GCPad's setting was modified.

View File

@ -5,8 +5,8 @@ import android.widget.CheckBox;
import android.widget.TextView;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.LogCheckBoxSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsFragmentPresenter;
@ -39,9 +39,10 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder
mItem = (CheckBoxSetting) item;
// Special case for LogTypes retrieved via JNI since those aren't string references.
if (item.getNameId() == 0 && item.getSection().equals(Settings.SECTION_LOGGER_LOGS))
if (item.getNameId() == 0 && item instanceof LogCheckBoxSetting)
{
mTextSettingName.setText(SettingsFragmentPresenter.LOG_TYPE_NAMES.get(item.getKey()));
String key = ((LogCheckBoxSetting) item).getKey();
mTextSettingName.setText(SettingsFragmentPresenter.LOG_TYPE_NAMES.get(key));
}
else
{

View File

@ -16,92 +16,6 @@ import java.io.File;
*/
public final class SettingsFile
{
public static final String FILE_NAME_DOLPHIN = "Dolphin";
public static final String FILE_NAME_GFX = "GFX";
public static final String FILE_NAME_LOGGER = "Logger";
public static final String FILE_NAME_GCPAD = "GCPadNew";
public static final String FILE_NAME_WIIMOTE = "WiimoteNew";
public static final String KEY_DSP_ENGINE = "DSPEngine";
public static final String KEY_LAST_PLATFORM_TAB = "LastPlatformTab";
public static final String KEY_CPU_CORE = "CPUCore";
public static final String KEY_DUAL_CORE = "CPUThread";
public static final String KEY_OVERCLOCK_ENABLE = "OverclockEnable";
public static final String KEY_OVERCLOCK_PERCENT = "Overclock";
public static final String KEY_SPEED_LIMIT = "EmulationSpeed";
public static final String KEY_VIDEO_BACKEND = "GFXBackend";
public static final String KEY_DSP_HLE = "DSPHLE";
public static final String KEY_DSP_ENABLE_JIT = "EnableJIT";
public static final String KEY_AUDIO_STRETCH = "AudioStretch";
public static final String KEY_AUDIO_VOLUME = "Volume";
public static final String KEY_AUTO_DISC_CHANGE = "AutoDiscChange";
public static final String KEY_GAME_CUBE_LANGUAGE = "SelectedLanguage";
public static final String KEY_OVERRIDE_REGION_SETTINGS = "OverrideRegionSettings";
public static final String KEY_SLOT_A_DEVICE = "SlotA";
public static final String KEY_SLOT_B_DEVICE = "SlotB";
public static final String KEY_ENABLE_SAVE_STATES = "EnableSaveStates";
public static final String KEY_RECURSIVE_ISO_PATHS = "RecursiveISOPaths";
public static final String KEY_DEFAULT_ISO = "DefaultISO";
public static final String KEY_NAND_ROOT_PATH = "NANDRootPath";
public static final String KEY_DUMP_PATH = "DumpPath";
public static final String KEY_LOAD_PATH = "LoadPath";
public static final String KEY_RESOURCE_PACK_PATH = "ResourcePackPath";
public static final String KEY_WII_SD_CARD_PATH = "WiiSDCardPath";
public static final String KEY_ANALYTICS_ENABLED = "Enabled";
public static final String KEY_ANALYTICS_PERMISSION_ASKED = "PermissionAsked";
public static final String KEY_USE_PANIC_HANDLERS = "UsePanicHandlers";
public static final String KEY_OSD_MESSAGES = "OnScreenDisplayMessages";
public static final String KEY_SHOW_FPS = "ShowFPS";
public static final String KEY_INTERNAL_RES = "InternalResolution";
public static final String KEY_FSAA = "MSAA";
public static final String KEY_ANISOTROPY = "MaxAnisotropy";
public static final String KEY_POST_SHADER = "PostProcessingShader";
public static final String KEY_SCALED_EFB = "EFBScaledCopy";
public static final String KEY_PER_PIXEL = "EnablePixelLighting";
public static final String KEY_FORCE_FILTERING = "ForceFiltering";
public static final String KEY_DISABLE_FOG = "DisableFog";
public static final String KEY_DISABLE_COPY_FILTER = "DisableCopyFilter";
public static final String KEY_ARBITRARY_MIPMAP_DETECTION = "ArbitraryMipmapDetection";
public static final String KEY_WIDE_SCREEN_HACK = "wideScreenHack";
public static final String KEY_FORCE_24_BIT_COLOR = "ForceTrueColor";
public static final String KEY_BACKEND_MULTITHREADING = "BackendMultithreading";
public static final String KEY_STEREO_MODE = "StereoMode";
public static final String KEY_STEREO_DEPTH = "StereoDepth";
public static final String KEY_STEREO_CONV = "StereoConvergencePercentage";
public static final String KEY_STEREO_SWAP = "StereoSwapEyes";
public static final String KEY_SKIP_EFB = "EFBAccessEnable";
public static final String KEY_IGNORE_FORMAT = "EFBEmulateFormatChanges";
public static final String KEY_EFB_TEXTURE = "EFBToTextureEnable";
public static final String KEY_DEFER_EFB_COPIES = "DeferEFBCopies";
public static final String KEY_TEXCACHE_ACCURACY = "SafeTextureCacheColorSamples";
public static final String KEY_GPU_TEXTURE_DECODING = "EnableGPUTextureDecoding";
public static final String KEY_XFB_TEXTURE = "XFBToTextureEnable";
public static final String KEY_IMMEDIATE_XFB = "ImmediateXFBEnable";
public static final String KEY_SKIP_DUPLICATE_XFBS = "SkipDuplicateXFBs";
public static final String KEY_FAST_DEPTH = "FastDepthCalc";
public static final String KEY_ASPECT_RATIO = "AspectRatio";
public static final String KEY_SHADER_COMPILATION_MODE = "ShaderCompilationMode";
public static final String KEY_WAIT_FOR_SHADERS = "WaitForShadersBeforeStarting";
public static final String KEY_DEBUG_JITOFF = "JitOff";
public static final String KEY_DEBUG_JITLOADSTOREOFF = "JitLoadStoreOff";
public static final String KEY_DEBUG_JITLOADSTOREFLOATINGPOINTOFF = "JitLoadStoreFloatingOff";
public static final String KEY_DEBUG_JITLOADSTOREPAIREDOFF = "JitLoadStorePairedOff";
public static final String KEY_DEBUG_JITFLOATINGPOINTOFF = "JitFloatingPointOff";
public static final String KEY_DEBUG_JITINTEGEROFF = "JitIntegerOff";
public static final String KEY_DEBUG_JITPAIREDOFF = "JitPairedOff";
public static final String KEY_DEBUG_JITSYSTEMREGISTEROFF = "JitSystemRegistersOff";
public static final String KEY_DEBUG_JITBRANCHOFF = "JitBranchOff";
public static final String KEY_DEBUG_JITREGISTERCACHEOFF = "JitRegisterCacheOff";
public static final String KEY_GCPAD_TYPE = "SIDevice";
public static final String KEY_GCPAD_PLAYER_1 = "SIDevice0";
public static final String KEY_GCPAD_G_TYPE = "PadType";
@ -264,14 +178,6 @@ public final class SettingsFile
public static final String KEY_WIIBIND_TURNTABLE_CROSSFADE_LEFT = "TurntableCrossLeft_";
public static final String KEY_WIIBIND_TURNTABLE_CROSSFADE_RIGHT = "TurntableCrossRight_";
public static final String KEY_WII_SD_CARD = "WiiSDCard";
public static final String KEY_WII_SD_CARD_ALLOW_WRITES = "WiiSDCardAllowWrites";
public static final String KEY_WIIMOTE_SCAN = "WiimoteContinuousScanning";
public static final String KEY_WIIMOTE_SPEAKER = "WiimoteEnableSpeaker";
public static final String KEY_ENABLE_LOGGING = "WriteToFile";
public static final String KEY_LOG_VERBOSITY = "Verbosity";
private static BiMap<String, String> sectionsMap = new BiMap<>();
static
@ -310,7 +216,7 @@ public final class SettingsFile
{
readFile(getSettingsFile(fileName), ini, view);
if (fileName.equals(SettingsFile.FILE_NAME_DOLPHIN))
if (fileName.equals(Settings.FILE_DOLPHIN))
{
addGcPadSettingsIfTheyDontExist(ini);
}
@ -505,15 +411,4 @@ public final class SettingsFile
}
}
}
public static void firstAnalyticsAdd(boolean enabled)
{
IniFile dolphinIni = new IniFile();
readFile(SettingsFile.FILE_NAME_DOLPHIN, dolphinIni, null);
dolphinIni.setBoolean(Settings.SECTION_ANALYTICS, KEY_ANALYTICS_ENABLED, enabled);
dolphinIni.setBoolean(Settings.SECTION_ANALYTICS, KEY_ANALYTICS_PERMISSION_ASKED, true);
saveFile(SettingsFile.FILE_NAME_DOLPHIN, dolphinIni, null);
}
}

View File

@ -16,8 +16,8 @@ import androidx.fragment.app.Fragment;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
public final class MenuFragment extends Fragment implements View.OnClickListener
{
@ -83,11 +83,8 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
updatePauseUnpauseVisibility();
boolean enableSaveStates = ((EmulationActivity) getActivity()).getSettings()
.getSection(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE)
.getBoolean(SettingsFile.KEY_ENABLE_SAVE_STATES, false);
if (enableSaveStates)
Settings settings = ((EmulationActivity) getActivity()).getSettings();
if (Setting.MAIN_ENABLE_SAVESTATES.getBoolean(settings, false))
{
options.findViewById(R.id.menu_quicksave).setVisibility(View.VISIBLE);
options.findViewById(R.id.menu_quickload).setVisibility(View.VISIBLE);

View File

@ -4,9 +4,8 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.utils.IniFile;
import java.io.File;
import java.util.HashSet;
@ -82,10 +81,9 @@ public class GameFileCache
*/
public boolean scanLibrary(Context context)
{
IniFile dolphinIni =
new IniFile(SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN));
boolean recursiveScan = dolphinIni.getBoolean(Settings.SECTION_INI_GENERAL,
SettingsFile.KEY_RECURSIVE_ISO_PATHS, false);
Settings settings = new Settings();
settings.loadSettings(null);
boolean recursiveScan = Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(settings, false);
removeNonExistentGameFolders(context);

View File

@ -706,8 +706,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
// Add all the enabled overlay items back to the HashSet.
if (EmulationActivity.isGameCubeGame())
{
IniFile dolphinIni =
new IniFile(SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN));
IniFile dolphinIni = new IniFile(SettingsFile.getSettingsFile(Settings.FILE_DOLPHIN));
switch (dolphinIni.getInt(Settings.SECTION_INI_CORE, SettingsFile.KEY_GCPAD_PLAYER_1,
EMULATED_GAMECUBE_CONTROLLER))

View File

@ -20,22 +20,19 @@ import com.google.android.material.tabs.TabLayout;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.adapters.PlatformPagerAdapter;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.ui.platform.PlatformGamesView;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.IniFile;
import org.dolphinemu.dolphinemu.utils.PermissionsHandler;
import org.dolphinemu.dolphinemu.utils.StartupHandler;
import java.io.File;
/**
* The main Activity of the Lollipop style UI. Manages several PlatformGamesFragments, which
* individually display a grid of available games for each Fragment, in a tabbed layout.
@ -273,18 +270,19 @@ public final class MainActivity extends AppCompatActivity implements MainView
{
super.onTabSelected(tab);
File dolphinFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN);
IniFile dolphinIni = new IniFile(dolphinFile);
dolphinIni.setInt(Settings.SECTION_INI_ANDROID, SettingsFile.KEY_LAST_PLATFORM_TAB,
tab.getPosition());
dolphinIni.save(dolphinFile);
Settings settings = new Settings();
settings.loadSettings(null);
Setting.MAIN_LAST_PLATFORM_TAB.setInt(settings, tab.getPosition());
// Context is set to null to avoid toasts
settings.saveSettings(null, null);
}
});
IniFile dolphinIni =
new IniFile(SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_DOLPHIN));
mViewPager.setCurrentItem(dolphinIni.getInt(Settings.SECTION_INI_ANDROID,
SettingsFile.KEY_LAST_PLATFORM_TAB, 0));
Settings settings = new Settings();
settings.loadSettings(null);
mViewPager.setCurrentItem(Setting.MAIN_LAST_PLATFORM_TAB.getInt(settings, 0));
showGames();
GameFileCacheService.startLoad(this);

View File

@ -1,9 +1,7 @@
package org.dolphinemu.dolphinemu.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import androidx.appcompat.app.AlertDialog;
@ -12,16 +10,11 @@ import com.android.volley.toolbox.StringRequest;
import org.dolphinemu.dolphinemu.DolphinApplication;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.model.Setting;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
public class Analytics
{
private static final String analyticsAsked =
Settings.SECTION_ANALYTICS + "_" + SettingsFile.KEY_ANALYTICS_PERMISSION_ASKED;
private static final String analyticsEnabled =
Settings.SECTION_ANALYTICS + "_" + SettingsFile.KEY_ANALYTICS_ENABLED;
private static final String DEVICE_MANUFACTURER = "DEVICE_MANUFACTURER";
private static final String DEVICE_OS = "DEVICE_OS";
private static final String DEVICE_MODEL = "DEVICE_MODEL";
@ -29,39 +22,42 @@ public class Analytics
public static void checkAnalyticsInit(Context context)
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (!preferences.getBoolean(analyticsAsked, false))
new AfterDirectoryInitializationRunner().run(context, false, () ->
{
new AfterDirectoryInitializationRunner().run(context, false,
() -> showMessage(context, preferences));
Settings settings = new Settings();
settings.loadSettings(null);
if (!Setting.MAIN_ANALYTICS_PERMISSION_ASKED.getBoolean(settings, false))
{
showMessage(context, settings);
}
});
}
private static void showMessage(Context context, SharedPreferences preferences)
private static void showMessage(Context context, Settings settings)
{
// We asked, set to true regardless of answer
SharedPreferences.Editor sPrefsEditor = preferences.edit();
sPrefsEditor.putBoolean(analyticsAsked, true);
sPrefsEditor.apply();
new AlertDialog.Builder(context, R.style.DolphinDialogBase)
.setTitle(context.getString(R.string.analytics))
.setMessage(context.getString(R.string.analytics_desc))
.setPositiveButton(R.string.yes, (dialogInterface, i) ->
{
sPrefsEditor.putBoolean(analyticsEnabled, true);
sPrefsEditor.apply();
SettingsFile.firstAnalyticsAdd(true);
firstAnalyticsAdd(settings, true);
})
.setNegativeButton(R.string.no, (dialogInterface, i) ->
{
sPrefsEditor.putBoolean(analyticsEnabled, false);
sPrefsEditor.apply();
SettingsFile.firstAnalyticsAdd(false);
firstAnalyticsAdd(settings, false);
})
.show();
}
private static void firstAnalyticsAdd(Settings settings, boolean enabled)
{
Setting.MAIN_ANALYTICS_ENABLED.setBoolean(settings, enabled);
Setting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true);
// Context is set to null to avoid toasts
settings.saveSettings(null, null);
}
public static void sendReport(String endpoint, byte[] data)
{
StringRequest request = new StringRequest(Request.Method.POST, endpoint,

View File

@ -29,7 +29,7 @@ public class Rumble
for (int i = 0; i < 8; i++)
{
String deviceName = activity.getSettings()
.getSection(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS)
.getSection(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS)
.getString(SettingsFile.KEY_EMU_RUMBLE + i, "");
if (!deviceName.isEmpty())

View File

@ -287,7 +287,7 @@
<string name="debug_jitfloatingpointoff">Jit Floating Point Disabled</string>
<string name="debug_jitintegeroff">Jit Integer Disabled</string>
<string name="debug_jitpairedoff">Jit Paired Disabled</string>
<string name="debug_jitsystemregistersoffr">Jit System Registers Disabled</string>
<string name="debug_jitsystemregistersoff">Jit System Registers Disabled</string>
<string name="debug_jitbranchoff">Jit Branch Disabled</string>
<string name="debug_jitregistercacheoff">Jit Register Cache Disabled</string>