From 13d1ef6681f5bf95be2669720edccd26ea258754 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 18 Jul 2020 19:27:32 +0200 Subject: [PATCH 1/8] 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. --- .../activities/EmulationActivity.java | 5 +- .../dialogs/GamePropertiesDialog.java | 16 +- .../settings/model/AbstractSetting.java | 6 + .../settings/model/BooleanSetting.java | 8 + .../features/settings/model/FloatSetting.java | 8 + .../features/settings/model/IntSetting.java | 8 + .../settings/model/LegacySetting.java | 69 ++ .../features/settings/model/Setting.java | 186 ++++ .../features/settings/model/Settings.java | 65 +- .../settings/model/StringSetting.java | 8 + .../settings/model/view/CheckBoxSetting.java | 11 +- .../settings/model/view/ConfirmRunnable.java | 2 +- .../settings/model/view/FilePicker.java | 11 +- .../model/view/FloatSliderSetting.java | 14 +- .../settings/model/view/HeaderSetting.java | 4 +- .../model/view/InputBindingSetting.java | 26 +- .../settings/model/view/IntSliderSetting.java | 13 +- .../model/view/InvertedCheckBoxSetting.java | 9 +- .../model/view/LogCheckBoxSetting.java | 22 + .../model/view/PercentSliderSetting.java | 12 +- .../settings/model/view/SettingsItem.java | 36 +- .../model/view/SingleChoiceSetting.java | 21 +- ...ingleChoiceSettingDynamicDescriptions.java | 25 +- .../settings/model/view/SliderSetting.java | 5 +- .../model/view/StringSingleChoiceSetting.java | 24 +- .../settings/model/view/SubmenuSetting.java | 4 +- .../settings/ui/SettingsActivity.java | 4 +- .../ui/SettingsActivityPresenter.java | 16 +- .../settings/ui/SettingsActivityView.java | 4 +- .../features/settings/ui/SettingsAdapter.java | 47 +- .../settings/ui/SettingsFragment.java | 4 +- .../ui/SettingsFragmentPresenter.java | 808 +++++++++--------- .../settings/ui/SettingsFragmentView.java | 4 +- .../viewholder/CheckBoxSettingViewHolder.java | 7 +- .../features/settings/utils/SettingsFile.java | 107 +-- .../dolphinemu/fragments/MenuFragment.java | 9 +- .../dolphinemu/model/GameFileCache.java | 10 +- .../dolphinemu/overlay/InputOverlay.java | 3 +- .../dolphinemu/ui/main/MainActivity.java | 24 +- .../dolphinemu/utils/Analytics.java | 46 +- .../dolphinemu/dolphinemu/utils/Rumble.java | 2 +- .../app/src/main/res/values/strings.xml | 2 +- 42 files changed, 929 insertions(+), 786 deletions(-) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index 2e5430d9ee..bb325639c9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -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); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java index ec50ac2854..d7007e529e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java @@ -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); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java new file mode 100644 index 0000000000..e24565410b --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java @@ -0,0 +1,6 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public interface AbstractSetting +{ + boolean delete(Settings settings); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java new file mode 100644 index 0000000000..4ee266a031 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -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); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java new file mode 100644 index 0000000000..b8ed91a4b9 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -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); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java new file mode 100644 index 0000000000..14182df6c3 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -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); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java new file mode 100644 index 0000000000..a04acc47f6 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java @@ -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); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java new file mode 100644 index 0000000000..a16ea015ee --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java @@ -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); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index c676d68a34..d0803f67d0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -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 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 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 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"); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java new file mode 100644 index 0000000000..ee710ad7e5 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -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); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java index 8e03ac038c..5f8ed11951 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java index 4950778b64..b1a17ca96a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java @@ -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; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java index 8a6890d019..d6c2da5319 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java @@ -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() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java index 06c27989de..3c736c376f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java @@ -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); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java index 7948d5e67a..c793f9dac8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java index d1941ab5d0..706a6ef21d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java @@ -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; } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java index 3455c1dd4a..eab1d4b54a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java @@ -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); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java index 8381843e43..9e5b9f08eb 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java @@ -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); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java new file mode 100644 index 0000000000..6bd9fccdda --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java @@ -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; + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java index dda5a6a774..14b5eaf459 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java @@ -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); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java index 0a50a33f31..a301f5ec19 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java @@ -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. */ diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java index f3a0b3cf7b..8dac68e536 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java index a3135569b7..bc1cf1ab65 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SliderSetting.java index 75c0f9b617..a50d5203a6 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SliderSetting.java @@ -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; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java index 8532e34ccd..97ce6d00a2 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java index fd6f9dd346..598c0fc9cb 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java @@ -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; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index e4575b9b14..07e2340be9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java index 710510c40c..6f24bbfc28 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java @@ -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 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; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java index f22261d36d..af4d12083b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java @@ -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 diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index dc7e503175..da8d00a895 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -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 { notifyItemChanged(position); - mView.onSettingChanged(item.getKey()); + mView.onSettingChanged(); }); dialog.setCanceledOnTouchOutside(false); dialog.show(); @@ -308,7 +308,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter 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 sl) { - sl.add(new SubmenuSetting(null, R.string.general_submenu, MenuTag.CONFIG_GENERAL)); - sl.add(new SubmenuSetting(null, R.string.interface_submenu, MenuTag.CONFIG_INTERFACE)); - sl.add(new SubmenuSetting(null, R.string.audio_submenu, MenuTag.CONFIG_AUDIO)); - sl.add(new SubmenuSetting(null, R.string.paths_submenu, MenuTag.CONFIG_PATHS)); - sl.add(new SubmenuSetting(null, R.string.gamecube_submenu, MenuTag.CONFIG_GAME_CUBE)); - sl.add(new SubmenuSetting(null, R.string.wii_submenu, MenuTag.CONFIG_WII)); - sl.add(new SubmenuSetting(null, R.string.advanced_submenu, MenuTag.CONFIG_ADVANCED)); - sl.add(new SubmenuSetting(null, R.string.log_submenu, MenuTag.CONFIG_LOG)); - sl.add(new SubmenuSetting(null, R.string.debug_submenu, MenuTag.DEBUG)); - sl.add(new HeaderSetting(null, R.string.gametdb_thanks, 0)); + sl.add(new SubmenuSetting(R.string.general_submenu, MenuTag.CONFIG_GENERAL)); + sl.add(new SubmenuSetting(R.string.interface_submenu, MenuTag.CONFIG_INTERFACE)); + sl.add(new SubmenuSetting(R.string.audio_submenu, MenuTag.CONFIG_AUDIO)); + sl.add(new SubmenuSetting(R.string.paths_submenu, MenuTag.CONFIG_PATHS)); + sl.add(new SubmenuSetting(R.string.gamecube_submenu, MenuTag.CONFIG_GAME_CUBE)); + sl.add(new SubmenuSetting(R.string.wii_submenu, MenuTag.CONFIG_WII)); + sl.add(new SubmenuSetting(R.string.advanced_submenu, MenuTag.CONFIG_ADVANCED)); + sl.add(new SubmenuSetting(R.string.log_submenu, MenuTag.CONFIG_LOG)); + sl.add(new SubmenuSetting(R.string.debug_submenu, MenuTag.DEBUG)); + sl.add(new HeaderSetting(R.string.gametdb_thanks, 0)); } private void addGeneralSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_DUAL_CORE, R.string.dual_core, R.string.dual_core_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_OVERRIDE_REGION_SETTINGS, R.string.override_region_settings, 0, - false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_AUTO_DISC_CHANGE, R.string.auto_disc_change, 0, false)); - sl.add(new PercentSliderSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_SPEED_LIMIT, R.string.speed_limit, 0, 200, "%", 100)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_ANALYTICS, - SettingsFile.KEY_ANALYTICS_ENABLED, R.string.analytics, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_ENABLE_SAVE_STATES, R.string.enable_save_states, + sl.add(new CheckBoxSetting(Setting.MAIN_CPU_THREAD, R.string.dual_core, + R.string.dual_core_description, true)); + sl.add(new CheckBoxSetting(Setting.MAIN_OVERRIDE_REGION_SETTINGS, + R.string.override_region_settings, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_AUTO_DISC_CHANGE, R.string.auto_disc_change, 0, false)); + sl.add(new PercentSliderSetting(Setting.MAIN_EMULATION_SPEED, R.string.speed_limit, 0, 200, "%", + 100)); + sl.add(new CheckBoxSetting(Setting.MAIN_ANALYTICS_ENABLED, R.string.analytics, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_ENABLE_SAVESTATES, R.string.enable_save_states, R.string.enable_save_states_description, false)); } private void addInterfaceSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_INTERFACE, - SettingsFile.KEY_USE_PANIC_HANDLERS, R.string.panic_handlers, + sl.add(new CheckBoxSetting(Setting.MAIN_USE_PANIC_HANDLERS, R.string.panic_handlers, R.string.panic_handlers_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_INTERFACE, - SettingsFile.KEY_OSD_MESSAGES, R.string.osd_messages, + sl.add(new CheckBoxSetting(Setting.MAIN_OSD_MESSAGES, R.string.osd_messages, R.string.osd_messages_description, true)); } private void addAudioSettings(ArrayList sl) { + final int DSP_HLE = 0; + final int DSP_LLE_RECOMPILER = 1; + final int DSP_LLE_INTERPRETER = 2; + + IntSetting dspEmulationEngine = new IntSetting() + { + @Override + public int getInt(Settings settings, int defaultValue) + { + if (Setting.MAIN_DSP_HLE.getBoolean(settings, true)) + { + return DSP_HLE; + } + else + { + boolean jit = Setting.MAIN_DSP_JIT.getBoolean(settings, true); + return jit ? DSP_LLE_RECOMPILER : DSP_LLE_INTERPRETER; + } + } + + @Override + public void setInt(Settings settings, int newValue) + { + switch (newValue) + { + case DSP_HLE: + Setting.MAIN_DSP_HLE.setBoolean(settings, true); + Setting.MAIN_DSP_JIT.setBoolean(settings, true); + break; + + case DSP_LLE_RECOMPILER: + Setting.MAIN_DSP_HLE.setBoolean(settings, false); + Setting.MAIN_DSP_JIT.setBoolean(settings, true); + break; + + case DSP_LLE_INTERPRETER: + Setting.MAIN_DSP_HLE.setBoolean(settings, false); + Setting.MAIN_DSP_JIT.setBoolean(settings, false); + break; + } + } + + @Override + public boolean delete(Settings settings) + { + // Not short circuiting + return Setting.MAIN_DSP_HLE.delete(settings) & Setting.MAIN_DSP_JIT.delete(settings); + } + }; + // TODO: Exclude values from arrays instead of having multiple arrays. int defaultCpuCore = NativeLibrary.DefaultCPUCore(); int dspEngineEntries; @@ -262,39 +310,29 @@ public final class SettingsFragmentPresenter dspEngineEntries = R.array.dspEngineEntriesGeneric; dspEngineValues = R.array.dspEngineValuesGeneric; } - // DSP Emulation Engine controls two settings. - // DSP Emulation Engine is read by Settings.saveSettings to modify the relevant settings. - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_ANDROID, - SettingsFile.KEY_DSP_ENGINE, R.string.dsp_emulation_engine, 0, dspEngineEntries, - dspEngineValues, 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_AUDIO_STRETCH, R.string.audio_stretch, + sl.add(new SingleChoiceSetting(dspEmulationEngine, R.string.dsp_emulation_engine, 0, + dspEngineEntries, dspEngineValues, 0)); + sl.add(new CheckBoxSetting(Setting.MAIN_AUDIO_STRETCH, R.string.audio_stretch, R.string.audio_stretch_description, false)); - sl.add(new IntSliderSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_DSP, - SettingsFile.KEY_AUDIO_VOLUME, R.string.audio_volume, 0, 100, "%", 100)); + sl.add(new IntSliderSetting(Setting.MAIN_AUDIO_VOLUME, R.string.audio_volume, 0, 100, "%", + 100)); } private void addPathsSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_RECURSIVE_ISO_PATHS, R.string.search_subfolders, 0, false)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_DEFAULT_ISO, R.string.default_ISO, 0, "", + sl.add(new CheckBoxSetting(Setting.MAIN_RECURSIVE_ISO_PATHS, R.string.search_subfolders, 0, + false)); + sl.add(new FilePicker(Setting.MAIN_DEFAULT_ISO, R.string.default_ISO, 0, "", MainPresenter.REQUEST_GAME_FILE)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_NAND_ROOT_PATH, R.string.wii_NAND_root, 0, getDefaultNANDRootPath(), + sl.add(new FilePicker(Setting.MAIN_FS_PATH, R.string.wii_NAND_root, 0, getDefaultNANDRootPath(), MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_DUMP_PATH, R.string.dump_path, 0, getDefaultDumpPath(), + sl.add(new FilePicker(Setting.MAIN_DUMP_PATH, R.string.dump_path, 0, getDefaultDumpPath(), MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_LOAD_PATH, R.string.load_path, 0, getDefaultLoadPath(), + sl.add(new FilePicker(Setting.MAIN_LOAD_PATH, R.string.load_path, 0, getDefaultLoadPath(), MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_RESOURCE_PACK_PATH, R.string.resource_pack_path, 0, + sl.add(new FilePicker(Setting.MAIN_RESOURCEPACK_PATH, R.string.resource_pack_path, 0, getDefaultResourcePackPath(), MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_GENERAL, - SettingsFile.KEY_WII_SD_CARD_PATH, R.string.SD_card_path, 0, getDefaultSDPath(), + sl.add(new FilePicker(Setting.MAIN_SD_PATH, R.string.SD_card_path, 0, getDefaultSDPath(), MainPresenter.REQUEST_SD_FILE)); sl.add(new ConfirmRunnable(R.string.reset_paths, 0, R.string.reset_paths_confirmation, 0, mView.getAdapter()::resetPaths)); @@ -302,29 +340,23 @@ public final class SettingsFragmentPresenter private void addGameCubeSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GAME_CUBE_LANGUAGE, R.string.gamecube_system_language, 0, + sl.add(new SingleChoiceSetting(Setting.MAIN_GC_LANGUAGE, R.string.gamecube_system_language, 0, R.array.gameCubeSystemLanguageEntries, R.array.gameCubeSystemLanguageValues, 0)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_SLOT_A_DEVICE, R.string.slot_a_device, 0, R.array.slotDeviceEntries, - R.array.slotDeviceValues, 8)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_SLOT_B_DEVICE, R.string.slot_b_device, 0, R.array.slotDeviceEntries, - R.array.slotDeviceValues, 255)); + sl.add(new SingleChoiceSetting(Setting.MAIN_SLOT_A, R.string.slot_a_device, 0, + R.array.slotDeviceEntries, R.array.slotDeviceValues, 8)); + sl.add(new SingleChoiceSetting(Setting.MAIN_SLOT_B, R.string.slot_b_device, 0, + R.array.slotDeviceEntries, R.array.slotDeviceValues, 255)); } private void addWiiSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_WII_SD_CARD, R.string.insert_sd_card, + sl.add(new CheckBoxSetting(Setting.MAIN_WII_SD_CARD, R.string.insert_sd_card, R.string.insert_sd_card_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_WII_SD_CARD_ALLOW_WRITES, R.string.wii_sd_card_allow_writes, 0, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_WIIMOTE_SCAN, R.string.wiimote_scanning, + sl.add(new CheckBoxSetting(Setting.MAIN_ALLOW_SD_WRITES, R.string.wii_sd_card_allow_writes, 0, + true)); + sl.add(new CheckBoxSetting(Setting.MAIN_WIIMOTE_CONTINUOUS_SCANNING, R.string.wiimote_scanning, R.string.wiimote_scanning_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_WIIMOTE_SPEAKER, R.string.wiimote_speaker, + sl.add(new CheckBoxSetting(Setting.MAIN_WIIMOTE_ENABLE_SPEAKER, R.string.wiimote_speaker, R.string.wiimote_speaker_description, false)); } @@ -351,14 +383,11 @@ public final class SettingsFragmentPresenter emuCoresEntries = R.array.emuCoresEntriesGeneric; emuCoresValues = R.array.emuCoresValuesGeneric; } - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_CPU_CORE, R.string.cpu_core, 0, emuCoresEntries, emuCoresValues, - defaultCpuCore)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_OVERCLOCK_ENABLE, R.string.overclock_enable, + sl.add(new SingleChoiceSetting(Setting.MAIN_CPU_CORE, R.string.cpu_core, 0, emuCoresEntries, + emuCoresValues, defaultCpuCore)); + sl.add(new CheckBoxSetting(Setting.MAIN_OVERCLOCK_ENABLE, R.string.overclock_enable, R.string.overclock_enable_description, false)); - sl.add(new PercentSliderSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_OVERCLOCK_PERCENT, R.string.overclock_title, + sl.add(new PercentSliderSetting(Setting.MAIN_OVERCLOCK, R.string.overclock_title, R.string.overclock_title_description, 400, "%", 100)); } @@ -366,20 +395,20 @@ public final class SettingsFragmentPresenter { for (int i = 0; i < 4; i++) { + LegacySetting gcPadSetting; if (mGameID.equals("")) { - // TODO: This controller_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCPAD_TYPE + i, R.string.controller_0 + i, 0, - R.array.gcpadTypeEntries, R.array.gcpadTypeValues, 0, MenuTag.getGCPadMenuTag(i))); + gcPadSetting = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_TYPE + i); } else { - sl.add(new SingleChoiceSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_GCPAD_G_TYPE + i, - R.string.controller_0 + i, 0, R.array.gcpadTypeEntries, R.array.gcpadTypeValues, 0, - MenuTag.getGCPadMenuTag(i))); + gcPadSetting = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_GCPAD_G_TYPE + i); } + // TODO: This controller_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. + sl.add(new SingleChoiceSetting(gcPadSetting, R.string.controller_0 + i, 0, + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, 0, MenuTag.getGCPadMenuTag(i))); } } @@ -387,103 +416,84 @@ public final class SettingsFragmentPresenter { for (int i = 0; i < 4; i++) { - // TODO: This wiimote_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. + LegacySetting wiimoteSetting; if (mGameID.equals("")) { - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_WIIMOTE, - Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE, - R.string.wiimote_4 + i, 0, R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, - 0, MenuTag.getWiimoteMenuTag(i + 4))); + wiimoteSetting = new LegacySetting(Settings.FILE_WIIMOTE, + Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE); } else { - sl.add(new SingleChoiceSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_G_TYPE + i, - R.string.wiimote_4 + i, 0, R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, - 0, MenuTag.getWiimoteMenuTag(i + 4))); + wiimoteSetting = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_G_TYPE + i); } + // TODO: This wiimote_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. + sl.add(new SingleChoiceSetting(wiimoteSetting, R.string.wiimote_4 + i, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, 0, + MenuTag.getWiimoteMenuTag(i + 4))); } } private void addGraphicsSettings(ArrayList sl) { - sl.add(new HeaderSetting(null, R.string.graphics_general, 0)); - sl.add(new StringSingleChoiceSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_VIDEO_BACKEND, R.string.video_backend, 0, + sl.add(new HeaderSetting(R.string.graphics_general, 0)); + sl.add(new StringSingleChoiceSetting(Setting.MAIN_GFX_BACKEND, R.string.video_backend, 0, R.array.videoBackendEntries, R.array.videoBackendValues, "OGL")); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_SHOW_FPS, R.string.show_fps, R.string.show_fps_description, false)); - sl.add(new SingleChoiceSettingDynamicDescriptions(SettingsFile.FILE_NAME_GFX, - Settings.SECTION_GFX_SETTINGS, SettingsFile.KEY_SHADER_COMPILATION_MODE, + sl.add(new CheckBoxSetting(Setting.GFX_SHOW_FPS, R.string.show_fps, + R.string.show_fps_description, false)); + sl.add(new SingleChoiceSettingDynamicDescriptions(Setting.GFX_SHADER_COMPILATION_MODE, R.string.shader_compilation_mode, 0, R.array.shaderCompilationModeEntries, R.array.shaderCompilationModeValues, R.array.shaderCompilationDescriptionEntries, R.array.shaderCompilationDescriptionValues, 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_WAIT_FOR_SHADERS, R.string.wait_for_shaders, - R.string.wait_for_shaders_description, false)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_ASPECT_RATIO, R.string.aspect_ratio, 0, R.array.aspectRatioEntries, - R.array.aspectRatioValues, 0)); + sl.add(new CheckBoxSetting(Setting.GFX_WAIT_FOR_SHADERS_BEFORE_STARTING, + R.string.wait_for_shaders, R.string.wait_for_shaders_description, false)); + sl.add(new SingleChoiceSetting(Setting.GFX_ASPECT_RATIO, R.string.aspect_ratio, 0, + R.array.aspectRatioEntries, R.array.aspectRatioValues, 0)); - sl.add(new HeaderSetting(null, R.string.graphics_enhancements_and_hacks, 0)); - sl.add(new SubmenuSetting(null, R.string.enhancements_submenu, MenuTag.ENHANCEMENTS)); - sl.add(new SubmenuSetting(null, R.string.hacks_submenu, MenuTag.HACKS)); + sl.add(new HeaderSetting(R.string.graphics_enhancements_and_hacks, 0)); + sl.add(new SubmenuSetting(R.string.enhancements_submenu, MenuTag.ENHANCEMENTS)); + sl.add(new SubmenuSetting(R.string.hacks_submenu, MenuTag.HACKS)); } private void addEnhanceSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_INTERNAL_RES, R.string.internal_resolution, + sl.add(new SingleChoiceSetting(Setting.GFX_EFB_SCALE, R.string.internal_resolution, R.string.internal_resolution_description, R.array.internalResolutionEntries, R.array.internalResolutionValues, 1)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_FSAA, R.string.FSAA, R.string.FSAA_description, R.array.FSAAEntries, - R.array.FSAAValues, 1)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_ENHANCEMENTS, - SettingsFile.KEY_ANISOTROPY, R.string.anisotropic_filtering, - R.string.anisotropic_filtering_description, R.array.anisotropicFilteringEntries, - R.array.anisotropicFilteringValues, 0)); + sl.add(new SingleChoiceSetting(Setting.GFX_MSAA, R.string.FSAA, R.string.FSAA_description, + R.array.FSAAEntries, R.array.FSAAValues, 1)); + sl.add(new SingleChoiceSetting(Setting.GFX_ENHANCE_MAX_ANISOTROPY, + R.string.anisotropic_filtering, R.string.anisotropic_filtering_description, + R.array.anisotropicFilteringEntries, R.array.anisotropicFilteringValues, 0)); - int stereoModeValue = - mSettings.getSection(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY) - .getInt(SettingsFile.KEY_STEREO_MODE, 0); + int stereoModeValue = Setting.GFX_STEREO_MODE.getInt(mSettings, 0); final int anaglyphMode = 3; String subDir = stereoModeValue == anaglyphMode ? "Anaglyph" : null; String[] shaderListEntries = getShaderList(subDir); String[] shaderListValues = new String[shaderListEntries.length]; System.arraycopy(shaderListEntries, 0, shaderListValues, 0, shaderListEntries.length); shaderListValues[0] = ""; - sl.add(new StringSingleChoiceSetting(SettingsFile.FILE_NAME_GFX, - Settings.SECTION_GFX_ENHANCEMENTS, SettingsFile.KEY_POST_SHADER, + sl.add(new StringSingleChoiceSetting(Setting.GFX_ENHANCE_POST_SHADER, R.string.post_processing_shader, 0, shaderListEntries, shaderListValues, "")); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_SCALED_EFB, R.string.scaled_efb_copy, + sl.add(new CheckBoxSetting(Setting.GFX_HACK_COPY_EFB_SCALED, R.string.scaled_efb_copy, R.string.scaled_efb_copy_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_PER_PIXEL, R.string.per_pixel_lighting, + sl.add(new CheckBoxSetting(Setting.GFX_ENABLE_PIXEL_LIGHTING, R.string.per_pixel_lighting, R.string.per_pixel_lighting_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_ENHANCEMENTS, - SettingsFile.KEY_FORCE_FILTERING, R.string.force_texture_filtering, - R.string.force_texture_filtering_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, - Settings.SECTION_GFX_ENHANCEMENTS, SettingsFile.KEY_FORCE_24_BIT_COLOR, - R.string.force_24bit_color, R.string.force_24bit_color_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_DISABLE_FOG, R.string.disable_fog, R.string.disable_fog_description, - false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_ENHANCEMENTS, - SettingsFile.KEY_DISABLE_COPY_FILTER, R.string.disable_copy_filter, - R.string.disable_copy_filter_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_ENHANCEMENTS, - SettingsFile.KEY_ARBITRARY_MIPMAP_DETECTION, R.string.arbitrary_mipmap_detection, - R.string.arbitrary_mipmap_detection_description, + sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_FORCE_FILTERING, + R.string.force_texture_filtering, R.string.force_texture_filtering_description, false)); + sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_FORCE_TRUE_COLOR, R.string.force_24bit_color, + R.string.force_24bit_color_description, true)); + sl.add(new CheckBoxSetting(Setting.GFX_DISABLE_FOG, R.string.disable_fog, + R.string.disable_fog_description, false)); + sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_DISABLE_COPY_FILTER, + R.string.disable_copy_filter, R.string.disable_copy_filter_description, false)); + sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION, + R.string.arbitrary_mipmap_detection, R.string.arbitrary_mipmap_detection_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_WIDE_SCREEN_HACK, R.string.wide_screen_hack, + sl.add(new CheckBoxSetting(Setting.GFX_WIDESCREEN_HACK, R.string.wide_screen_hack, R.string.wide_screen_hack_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_BACKEND_MULTITHREADING, R.string.backend_multithreading, + sl.add(new CheckBoxSetting(Setting.GFX_BACKEND_MULTITHREADING, R.string.backend_multithreading, R.string.backend_multithreading_description, false)); /* @@ -497,8 +507,7 @@ public final class SettingsFragmentPresenter (helper.supportsGLES3() && helper.GetVersion() >= 310 && helper.SupportsExtension("GL_ANDROID_extension_pack_es31a"))) { - sl.add(new SubmenuSetting(SettingsFile.KEY_STEREO_MODE, R.string.stereoscopy_submenu, - MenuTag.STEREOSCOPY)); + sl.add(new SubmenuSetting(R.string.stereoscopy_submenu, MenuTag.STEREOSCOPY)); } } @@ -544,113 +553,89 @@ public final class SettingsFragmentPresenter private void addHackSettings(ArrayList sl) { - sl.add(new HeaderSetting(null, R.string.embedded_frame_buffer, 0)); - sl.add(new InvertedCheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_SKIP_EFB, R.string.skip_efb_access, + sl.add(new HeaderSetting(R.string.embedded_frame_buffer, 0)); + sl.add(new InvertedCheckBoxSetting(Setting.GFX_HACK_EFB_ACCESS_ENABLE, R.string.skip_efb_access, R.string.skip_efb_access_description, false)); - sl.add(new InvertedCheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_IGNORE_FORMAT, R.string.ignore_format_changes, - R.string.ignore_format_changes_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_EFB_TEXTURE, R.string.efb_copy_method, + sl.add(new InvertedCheckBoxSetting(Setting.GFX_HACK_EFB_EMULATE_FORMAT_CHANGES, + R.string.ignore_format_changes, R.string.ignore_format_changes_description, true)); + sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_EFB_COPY_TO_RAM, R.string.efb_copy_method, R.string.efb_copy_method_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_DEFER_EFB_COPIES, R.string.defer_efb_copies, + sl.add(new CheckBoxSetting(Setting.GFX_HACK_DEFER_EFB_COPIES, R.string.defer_efb_copies, R.string.defer_efb_copies_description, true)); - sl.add(new HeaderSetting(null, R.string.texture_cache, 0)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_TEXCACHE_ACCURACY, R.string.texture_cache_accuracy, - R.string.texture_cache_accuracy_description, R.array.textureCacheAccuracyEntries, - R.array.textureCacheAccuracyValues, 128)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_GPU_TEXTURE_DECODING, R.string.gpu_texture_decoding, - R.string.gpu_texture_decoding_description, false)); + sl.add(new HeaderSetting(R.string.texture_cache, 0)); + sl.add(new SingleChoiceSetting(Setting.GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, + R.string.texture_cache_accuracy, R.string.texture_cache_accuracy_description, + R.array.textureCacheAccuracyEntries, R.array.textureCacheAccuracyValues, 128)); + sl.add(new CheckBoxSetting(Setting.GFX_ENABLE_GPU_TEXTURE_DECODING, + R.string.gpu_texture_decoding, R.string.gpu_texture_decoding_description, false)); - sl.add(new HeaderSetting(null, R.string.external_frame_buffer, 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_XFB_TEXTURE, R.string.xfb_copy_method, + sl.add(new HeaderSetting(R.string.external_frame_buffer, 0)); + sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_XFB_COPY_TO_RAM, R.string.xfb_copy_method, R.string.xfb_copy_method_description, true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_IMMEDIATE_XFB, R.string.immediate_xfb, + sl.add(new CheckBoxSetting(Setting.GFX_HACK_IMMEDIATE_XFB, R.string.immediate_xfb, R.string.immediate_xfb_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_SKIP_DUPLICATE_XFBS, R.string.skip_duplicate_xfbs, + sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_DUPLICATE_XFBS, R.string.skip_duplicate_xfbs, R.string.skip_duplicate_xfbs_description, true)); - sl.add(new HeaderSetting(null, R.string.other, 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_FAST_DEPTH, R.string.fast_depth_calculation, + sl.add(new HeaderSetting(R.string.other, 0)); + sl.add(new CheckBoxSetting(Setting.GFX_FAST_DEPTH_CALC, R.string.fast_depth_calculation, R.string.fast_depth_calculation_description, true)); } private void addLogConfigurationSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_LOGGER, Settings.SECTION_LOGGER_OPTIONS, - SettingsFile.KEY_ENABLE_LOGGING, R.string.enable_logging, + sl.add(new CheckBoxSetting(Setting.LOGGER_WRITE_TO_FILE, R.string.enable_logging, R.string.enable_logging_description, false)); - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_LOGGER, Settings.SECTION_LOGGER_OPTIONS, - SettingsFile.KEY_LOG_VERBOSITY, R.string.log_verbosity, 0, getLogVerbosityEntries(), - getLogVerbosityValues(), 1)); + sl.add(new SingleChoiceSetting(Setting.LOGGER_VERBOSITY, R.string.log_verbosity, 0, + getLogVerbosityEntries(), getLogVerbosityValues(), 1)); sl.add(new ConfirmRunnable(R.string.log_enable_all, 0, R.string.log_enable_all_confirmation, 0, () -> mView.getAdapter().setAllLogTypes(true))); sl.add(new ConfirmRunnable(R.string.log_disable_all, 0, R.string.log_disable_all_confirmation, 0, () -> mView.getAdapter().setAllLogTypes(false))); - sl.add(new HeaderSetting(null, R.string.log_types, 0)); + sl.add(new HeaderSetting(R.string.log_types, 0)); for (Map.Entry entry : LOG_TYPE_NAMES.entrySet()) { // TitleID is handled by special case in CheckBoxSettingViewHolder. - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_LOGGER, Settings.SECTION_LOGGER_LOGS, - entry.getKey(), 0, 0, false)); + sl.add(new LogCheckBoxSetting(entry.getKey(), 0, 0, false)); } } private void addDebugSettings(ArrayList sl) { - sl.add(new HeaderSetting(null, R.string.debug_warning, 0)); + sl.add(new HeaderSetting(R.string.debug_warning, 0)); - sl.add(new HeaderSetting(null, R.string.debug_jit_header, 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITOFF, R.string.debug_jitoff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITLOADSTOREOFF, R.string.debug_jitloadstoreoff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, - SettingsFile.KEY_DEBUG_JITLOADSTOREFLOATINGPOINTOFF, Settings.SECTION_DEBUG, + sl.add(new HeaderSetting(R.string.debug_jit_header, 0)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_OFF, R.string.debug_jitoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_OFF, R.string.debug_jitloadstoreoff, 0, + false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_FLOATING_OFF, R.string.debug_jitloadstorefloatingoff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITLOADSTOREPAIREDOFF, R.string.debug_jitloadstorepairedoff, 0, - false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITFLOATINGPOINTOFF, R.string.debug_jitfloatingpointoff, 0, - false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITINTEGEROFF, R.string.debug_jitintegeroff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITPAIREDOFF, R.string.debug_jitpairedoff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITSYSTEMREGISTEROFF, R.string.debug_jitsystemregistersoffr, 0, - false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITBRANCHOFF, R.string.debug_jitbranchoff, 0, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_DEBUG, - SettingsFile.KEY_DEBUG_JITREGISTERCACHEOFF, R.string.debug_jitregistercacheoff, 0, + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_PAIRED_OFF, + R.string.debug_jitloadstorepairedoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_FLOATING_POINT_OFF, + R.string.debug_jitfloatingpointoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_INTEGER_OFF, R.string.debug_jitintegeroff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_PAIRED_OFF, R.string.debug_jitpairedoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_SYSTEM_REGISTERS_OFF, + R.string.debug_jitsystemregistersoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_BRANCH_OFF, R.string.debug_jitbranchoff, 0, false)); + sl.add(new CheckBoxSetting(Setting.MAIN_JIT_REGISTER_CACHE_OFF, + R.string.debug_jitregistercacheoff, 0, false)); } private void addStereoSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY, - SettingsFile.KEY_STEREO_MODE, R.string.stereoscopy_mode, 0, + sl.add(new SingleChoiceSetting(Setting.GFX_STEREO_MODE, R.string.stereoscopy_mode, 0, R.array.stereoscopyEntries, R.array.stereoscopyValues, 0)); - sl.add(new IntSliderSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY, - SettingsFile.KEY_STEREO_DEPTH, R.string.stereoscopy_depth, + sl.add(new IntSliderSetting(Setting.GFX_STEREO_DEPTH, R.string.stereoscopy_depth, R.string.stereoscopy_depth_description, 100, "%", 20)); - sl.add(new IntSliderSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY, - SettingsFile.KEY_STEREO_CONV, R.string.stereoscopy_convergence, - R.string.stereoscopy_convergence_description, 200, "%", 0)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY, - SettingsFile.KEY_STEREO_SWAP, R.string.stereoscopy_swap_eyes, + sl.add(new IntSliderSetting(Setting.GFX_STEREO_CONVERGENCE_PERCENTAGE, + R.string.stereoscopy_convergence, R.string.stereoscopy_convergence_description, 200, + "%", 0)); + sl.add(new CheckBoxSetting(Setting.GFX_STEREO_SWAP_EYES, R.string.stereoscopy_swap_eyes, R.string.stereoscopy_swap_eyes_description, false)); } @@ -658,70 +643,73 @@ public final class SettingsFragmentPresenter { if (gcPadType == 1) // Emulated { - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_A + gcPadNumber, R.string.button_a, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_B + gcPadNumber, R.string.button_b, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_X + gcPadNumber, R.string.button_x, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_Y + gcPadNumber, R.string.button_y, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_Z + gcPadNumber, R.string.button_z, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_START + gcPadNumber, R.string.button_start, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_control, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_control, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_CONTROL_UP + gcPadNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_CONTROL_DOWN + gcPadNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_CONTROL_LEFT + gcPadNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_CONTROL_RIGHT + gcPadNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_c, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_c, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_C_UP + gcPadNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_C_DOWN + gcPadNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_C_LEFT + gcPadNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_C_RIGHT + gcPadNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_trig, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_trig, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_TRIGGER_L + gcPadNumber, R.string.trigger_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_TRIGGER_R + gcPadNumber, R.string.trigger_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_dpad, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_dpad, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_DPAD_UP + gcPadNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_DPAD_DOWN + gcPadNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_DPAD_LEFT + gcPadNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_GCBIND_DPAD_RIGHT + gcPadNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.emulation_control_rumble, 0)); - sl.add(new RumbleBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.emulation_control_rumble, 0)); + sl.add(new RumbleBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_EMU_RUMBLE + gcPadNumber, R.string.emulation_control_rumble, mGameID)); } else // Adapter { - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCADAPTER_RUMBLE + gcPadNumber, R.string.gc_adapter_rumble, + LegacySetting rumble = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCADAPTER_RUMBLE + gcPadNumber); + LegacySetting bongo = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCADAPTER_BONGOS + gcPadNumber); + + sl.add(new CheckBoxSetting(rumble, R.string.gc_adapter_rumble, R.string.gc_adapter_rumble_description, false)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCADAPTER_BONGOS + gcPadNumber, R.string.gc_adapter_bongos, + sl.add(new CheckBoxSetting(bongo, R.string.gc_adapter_bongos, R.string.gc_adapter_bongos_description, false)); } } @@ -732,110 +720,110 @@ public final class SettingsFragmentPresenter // But game game specific extension settings are saved in their own profile. These profiles // do not have any way to specify the controller that is loaded outside of knowing the filename // of the profile that was loaded. + LegacySetting extension; if (mGameID.isEmpty()) { - sl.add(new StringSingleChoiceSetting(SettingsFile.FILE_NAME_WIIMOTE, - Settings.SECTION_WIIMOTE + (wiimoteNumber - 3), SettingsFile.KEY_WIIMOTE_EXTENSION, - R.string.wiimote_extensions, 0, R.array.wiimoteExtensionsEntries, - R.array.wiimoteExtensionsValues, getExtensionValue(wiimoteNumber - 3), - MenuTag.getWiimoteExtensionMenuTag(wiimoteNumber))); + extension = new LegacySetting(Settings.FILE_WIIMOTE, + Settings.SECTION_WIIMOTE + (wiimoteNumber - 3), SettingsFile.KEY_WIIMOTE_EXTENSION); } else { mSettings.loadWiimoteProfile(mGameID, wiimoteNumber - 4); - sl.add(new StringSingleChoiceSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_EXTENSION + (wiimoteNumber - 4), - R.string.wiimote_extensions, 0, R.array.wiimoteExtensionsEntries, - R.array.wiimoteExtensionsValues, getExtensionValue(wiimoteNumber - 4), - MenuTag.getWiimoteExtensionMenuTag(wiimoteNumber))); + extension = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_EXTENSION + (wiimoteNumber - 4)); } - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new StringSingleChoiceSetting(extension, R.string.wiimote_extensions, 0, + R.array.wiimoteExtensionsEntries, R.array.wiimoteExtensionsValues, + getExtensionValue(wiimoteNumber - 3), + MenuTag.getWiimoteExtensionMenuTag(wiimoteNumber))); + + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_A + wiimoteNumber, R.string.button_a, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_B + wiimoteNumber, R.string.button_b, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_1 + wiimoteNumber, R.string.button_one, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_2 + wiimoteNumber, R.string.button_two, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_MINUS + wiimoteNumber, R.string.button_minus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_PLUS + wiimoteNumber, R.string.button_plus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_HOME + wiimoteNumber, R.string.button_home, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_ir, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_ir, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_FORWARD + wiimoteNumber, R.string.generic_forward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_BACKWARD + wiimoteNumber, R.string.generic_backward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_IR_HIDE + wiimoteNumber, R.string.ir_hide, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_swing, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_swing, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_FORWARD + wiimoteNumber, R.string.generic_forward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SWING_BACKWARD + wiimoteNumber, R.string.generic_backward, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_tilt, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_tilt, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TILT_FORWARD + wiimoteNumber, R.string.generic_forward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TILT_BACKWARD + wiimoteNumber, R.string.generic_backward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TILT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TILT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TILT_MODIFIER + wiimoteNumber, R.string.tilt_modifier, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_shake, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_shake, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SHAKE_X + wiimoteNumber, R.string.shake_x, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SHAKE_Y + wiimoteNumber, R.string.shake_y, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_SHAKE_Z + wiimoteNumber, R.string.shake_z, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_dpad, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_dpad, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DPAD_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DPAD_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DPAD_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DPAD_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.emulation_control_rumble, 0)); - sl.add(new RumbleBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.emulation_control_rumble, 0)); + sl.add(new RumbleBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_EMU_RUMBLE + wiimoteNumber, R.string.emulation_control_rumble, mGameID)); } @@ -846,316 +834,316 @@ public final class SettingsFragmentPresenter switch (extentionType) { case 1: // Nunchuk - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_C + wiimoteNumber, R.string.nunchuk_button_c, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_Z + wiimoteNumber, R.string.button_z, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_stick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_stick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_swing, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_swing, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_FORWARD + wiimoteNumber, R.string.generic_forward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_BACKWARD + wiimoteNumber, R.string.generic_backward, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_tilt, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_tilt, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_FORWARD + wiimoteNumber, R.string.generic_forward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_BACKWARD + wiimoteNumber, R.string.generic_backward, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_MODIFIER + wiimoteNumber, R.string.tilt_modifier, mGameID)); - sl.add(new HeaderSetting(null, R.string.wiimote_shake, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.wiimote_shake, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_X + wiimoteNumber, R.string.shake_x, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_Y + wiimoteNumber, R.string.shake_y, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_Z + wiimoteNumber, R.string.shake_z, mGameID)); break; case 2: // Classic - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_A + wiimoteNumber, R.string.button_a, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_B + wiimoteNumber, R.string.button_b, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_X + wiimoteNumber, R.string.button_x, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_Y + wiimoteNumber, R.string.button_y, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_ZL + wiimoteNumber, R.string.classic_button_zl, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_ZR + wiimoteNumber, R.string.classic_button_zr, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_MINUS + wiimoteNumber, R.string.button_minus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_PLUS + wiimoteNumber, R.string.button_plus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_HOME + wiimoteNumber, R.string.button_home, mGameID)); - sl.add(new HeaderSetting(null, R.string.classic_leftstick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.classic_leftstick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.classic_rightstick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.classic_rightstick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_trig, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_trig, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_TRIGGER_L + wiimoteNumber, R.string.trigger_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_TRIGGER_R + wiimoteNumber, R.string.trigger_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.controller_dpad, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.controller_dpad, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); break; case 3: // Guitar - sl.add(new HeaderSetting(null, R.string.guitar_frets, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.guitar_frets, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_FRET_GREEN + wiimoteNumber, R.string.generic_green, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_FRET_RED + wiimoteNumber, R.string.generic_red, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_FRET_YELLOW + wiimoteNumber, R.string.generic_yellow, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_FRET_BLUE + wiimoteNumber, R.string.generic_blue, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_FRET_ORANGE + wiimoteNumber, R.string.generic_orange, mGameID)); - sl.add(new HeaderSetting(null, R.string.guitar_strum, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.guitar_strum, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STRUM_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STRUM_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_MINUS + wiimoteNumber, R.string.button_minus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_PLUS + wiimoteNumber, R.string.button_plus, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_stick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_stick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STICK_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STICK_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STICK_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_STICK_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.guitar_whammy, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.guitar_whammy, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_GUITAR_WHAMMY_BAR + wiimoteNumber, R.string.generic_right, mGameID)); break; case 4: // Drums - sl.add(new HeaderSetting(null, R.string.drums_pads, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.drums_pads, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_RED + wiimoteNumber, R.string.generic_red, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_YELLOW + wiimoteNumber, R.string.generic_yellow, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_BLUE + wiimoteNumber, R.string.generic_blue, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_GREEN + wiimoteNumber, R.string.generic_green, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_ORANGE + wiimoteNumber, R.string.generic_orange, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PAD_BASS + wiimoteNumber, R.string.drums_pad_bass, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_stick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_stick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_STICK_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_STICK_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_STICK_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_STICK_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_MINUS + wiimoteNumber, R.string.button_minus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_DRUMS_PLUS + wiimoteNumber, R.string.button_plus, mGameID)); break; case 5: // Turntable - sl.add(new HeaderSetting(null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_GREEN_LEFT + wiimoteNumber, R.string.turntable_button_green_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_RED_LEFT + wiimoteNumber, R.string.turntable_button_red_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_BLUE_LEFT + wiimoteNumber, R.string.turntable_button_blue_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_GREEN_RIGHT + wiimoteNumber, R.string.turntable_button_green_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_RED_RIGHT + wiimoteNumber, R.string.turntable_button_red_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_BLUE_RIGHT + wiimoteNumber, R.string.turntable_button_blue_right, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_MINUS + wiimoteNumber, R.string.button_minus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_PLUS + wiimoteNumber, R.string.button_plus, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_EUPHORIA + wiimoteNumber, R.string.turntable_button_euphoria, mGameID)); - sl.add(new HeaderSetting(null, R.string.turntable_table_left, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.turntable_table_left, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_LEFT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_LEFT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.turntable_table_right, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.turntable_table_right, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_RIGHT_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_RIGHT_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.generic_stick, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.generic_stick, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_UP + wiimoteNumber, R.string.generic_up, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_DOWN + wiimoteNumber, R.string.generic_down, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); - sl.add(new HeaderSetting(null, R.string.turntable_effect, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.turntable_effect, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_EFFECT_DIAL + wiimoteNumber, R.string.turntable_effect_dial, mGameID)); - sl.add(new HeaderSetting(null, R.string.turntable_crossfade, 0)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new HeaderSetting(R.string.turntable_crossfade, 0)); + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_CROSSFADE_LEFT + wiimoteNumber, R.string.generic_left, mGameID)); - sl.add(new InputBindingSetting(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_BINDINGS, + sl.add(new InputBindingSetting(Settings.FILE_DOLPHIN, Settings.SECTION_BINDINGS, SettingsFile.KEY_WIIBIND_TURNTABLE_CROSSFADE_RIGHT + wiimoteNumber, R.string.generic_right, mGameID)); break; @@ -1167,7 +1155,7 @@ public final class SettingsFragmentPresenter IniFile.Section section; if (mGameID.equals("")) // Main settings { - section = mSettings.getSection(SettingsFile.FILE_NAME_WIIMOTE, + section = mSettings.getSection(Settings.FILE_WIIMOTE, Settings.SECTION_WIIMOTE + wiimoteNumber); } else // Game settings diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java index 4951164a5b..fd89dbe26d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java @@ -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. diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java index e7103632c6..afecec4ebd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java @@ -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 { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java index 04d4c5627a..e5238c460c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java @@ -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 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); - } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java index 2d053a99d7..eeff9cda14 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java @@ -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); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java index 281fc65349..7ee178c9b7 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java @@ -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); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java index ea1a6ecb54..1c988ec3a6 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java @@ -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)) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java index d96efd27df..bebe91e064 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java @@ -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); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java index f38d4e9e05..59e44c7087 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java @@ -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, diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Rumble.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Rumble.java index a0930d9f06..e7b7360537 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Rumble.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Rumble.java @@ -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()) diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 356bfc1a62..1b10ac6250 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -287,7 +287,7 @@ Jit Floating Point Disabled Jit Integer Disabled Jit Paired Disabled - Jit System Registers Disabled + Jit System Registers Disabled Jit Branch Disabled Jit Register Cache Disabled From f011e859b4450c7386cd9b780027cc3682a646ad Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 20 Jul 2020 17:45:59 +0200 Subject: [PATCH 2/8] Android: Centralize default values for settings I was hoping we would be able to pull in the default values from C++, but it seems like more trouble than it's worth, partially because of different settings having default values of different types and partially because we don't have any convenient way to get a list of all C++ settings. --- .../dolphinemu/dolphinemu/NativeLibrary.java | 2 + .../activities/EmulationActivity.java | 1 - .../dialogs/GamePropertiesDialog.java | 4 +- .../model/AbstractBooleanSetting.java | 8 + .../settings/model/AbstractFloatSetting.java | 8 + .../settings/model/AbstractIntSetting.java | 8 + .../settings/model/AbstractLegacySetting.java | 21 + .../settings/model/AbstractStringSetting.java | 8 + .../settings/model/BooleanSetting.java | 125 +++++- .../features/settings/model/FloatSetting.java | 38 +- .../features/settings/model/IntSetting.java | 67 +++- .../settings/model/LegacyBooleanSetting.java | 24 ++ .../settings/model/LegacyFloatSetting.java | 24 ++ .../settings/model/LegacyIntSetting.java | 24 ++ .../settings/model/LegacySetting.java | 69 ---- .../settings/model/LegacyStringSetting.java | 24 ++ .../features/settings/model/Setting.java | 186 --------- .../features/settings/model/Settings.java | 4 +- .../settings/model/StringSetting.java | 53 ++- .../settings/model/view/CheckBoxSetting.java | 11 +- .../settings/model/view/FilePicker.java | 11 +- .../model/view/FloatSliderSetting.java | 12 +- .../settings/model/view/IntSliderSetting.java | 12 +- .../model/view/InvertedCheckBoxSetting.java | 10 +- .../model/view/LogCheckBoxSetting.java | 9 +- .../model/view/PercentSliderSetting.java | 10 +- .../model/view/SingleChoiceSetting.java | 18 +- ...ingleChoiceSettingDynamicDescriptions.java | 22 +- .../model/view/StringSingleChoiceSetting.java | 30 +- .../features/settings/ui/SettingsAdapter.java | 20 +- .../ui/SettingsFragmentPresenter.java | 376 +++++++++--------- .../dolphinemu/fragments/MenuFragment.java | 4 +- .../dolphinemu/model/GameFileCache.java | 4 +- .../dolphinemu/ui/main/MainActivity.java | 6 +- .../dolphinemu/utils/Analytics.java | 8 +- Source/Android/jni/MainAndroid.cpp | 9 + 36 files changed, 695 insertions(+), 575 deletions(-) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractBooleanSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractFloatSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractIntSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractStringSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyFloatSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java delete mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyStringSetting.java delete mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 8f3a10b8af..86e75d55ec 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -335,6 +335,8 @@ public final class NativeLibrary public static native int DefaultCPUCore(); + public static native String GetDefaultGraphicsBackendName(); + public static native int GetMaxLogLevel(); public static native void ReloadConfig(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index bb325639c9..dd66031531 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -33,7 +33,6 @@ 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; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java index d7007e529e..b60713fb8b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java @@ -9,8 +9,8 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; 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.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; import org.dolphinemu.dolphinemu.ui.platform.Platform; @@ -65,7 +65,7 @@ public class GamePropertiesDialog extends DialogFragment case 1: Settings settings = new Settings(); settings.loadSettings(null); - Setting.MAIN_DEFAULT_ISO.setString(settings, path); + StringSetting.MAIN_DEFAULT_ISO.setString(settings, path); settings.saveSettings(null, getContext()); break; case 2: diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractBooleanSetting.java new file mode 100644 index 0000000000..3ac6ee3640 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractBooleanSetting.java @@ -0,0 +1,8 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public interface AbstractBooleanSetting extends AbstractSetting +{ + boolean getBoolean(Settings settings); + + void setBoolean(Settings settings, boolean newValue); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractFloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractFloatSetting.java new file mode 100644 index 0000000000..49b7c4e2ee --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractFloatSetting.java @@ -0,0 +1,8 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public interface AbstractFloatSetting extends AbstractSetting +{ + float getFloat(Settings settings); + + void setFloat(Settings settings, float newValue); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractIntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractIntSetting.java new file mode 100644 index 0000000000..2d9411a297 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractIntSetting.java @@ -0,0 +1,8 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public interface AbstractIntSetting extends AbstractSetting +{ + int getInt(Settings settings); + + void setInt(Settings settings, int newValue); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java new file mode 100644 index 0000000000..c10dd237a8 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java @@ -0,0 +1,21 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class AbstractLegacySetting implements AbstractSetting +{ + protected final String mFile; + protected final String mSection; + protected final String mKey; + + public AbstractLegacySetting(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); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractStringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractStringSetting.java new file mode 100644 index 0000000000..efc557763b --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractStringSetting.java @@ -0,0 +1,8 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public interface AbstractStringSetting extends AbstractSetting +{ + String getString(Settings settings); + + void setString(Settings settings, String newValue); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 4ee266a031..0d3f853120 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -1,8 +1,127 @@ package org.dolphinemu.dolphinemu.features.settings.model; -public interface BooleanSetting extends AbstractSetting +public enum BooleanSetting implements AbstractBooleanSetting { - boolean getBoolean(Settings settings, boolean defaultValue); + // These entries have the same names and order as in C++, just for consistency. - void setBoolean(Settings settings, boolean newValue); + MAIN_DSP_HLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "DSPHLE", true), + MAIN_CPU_THREAD(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "CPUThread", true), + MAIN_OVERRIDE_REGION_SETTINGS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + "OverrideRegionSettings", false), + MAIN_AUDIO_STRETCH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AudioStretch", false), + MAIN_WII_SD_CARD(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCard", true), + MAIN_WIIMOTE_CONTINUOUS_SCANNING(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + "WiimoteContinuousScanning", false), + MAIN_WIIMOTE_ENABLE_SPEAKER(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + "WiimoteEnableSpeaker", false), + MAIN_OVERCLOCK_ENABLE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "OverclockEnable", false), + MAIN_AUTO_DISC_CHANGE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AutoDiscChange", false), + MAIN_ALLOW_SD_WRITES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCardAllowWrites", + true), + MAIN_ENABLE_SAVESTATES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EnableSaveStates", + false), + + MAIN_DSP_JIT(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "EnableJIT", true), + + MAIN_USE_PANIC_HANDLERS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_INTERFACE, + "UsePanicHandlers", true), + MAIN_OSD_MESSAGES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_INTERFACE, + "OnScreenDisplayMessages", true), + + MAIN_ANALYTICS_ENABLED(Settings.FILE_DOLPHIN, Settings.SECTION_ANALYTICS, "Enabled", false), + MAIN_ANALYTICS_PERMISSION_ASKED(Settings.FILE_DOLPHIN, Settings.SECTION_ANALYTICS, + "PermissionAsked", false), + + MAIN_RECURSIVE_ISO_PATHS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_GENERAL, + "RecursiveISOPaths", false), + + GFX_WIDESCREEN_HACK(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "wideScreenHack", false), + GFX_SHOW_FPS(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "ShowFPS", false), + GFX_ENABLE_GPU_TEXTURE_DECODING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "EnableGPUTextureDecoding", false), + GFX_ENABLE_PIXEL_LIGHTING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "EnablePixelLighting", false), + GFX_FAST_DEPTH_CALC(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "FastDepthCalc", true), + GFX_DISABLE_FOG(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "DisableFog", false), + GFX_BACKEND_MULTITHREADING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "BackendMultithreading", false), + GFX_WAIT_FOR_SHADERS_BEFORE_STARTING(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "WaitForShadersBeforeStarting", false), + + GFX_ENHANCE_FORCE_FILTERING(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, + "ForceFiltering", false), + GFX_ENHANCE_FORCE_TRUE_COLOR(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, + "ForceTrueColor", true), + GFX_ENHANCE_DISABLE_COPY_FILTER(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, + "DisableCopyFilter", true), + GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, + "ArbitraryMipmapDetection", true), + + GFX_STEREO_SWAP_EYES(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoSwapEyes", false), + + GFX_HACK_EFB_ACCESS_ENABLE(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "EFBAccessEnable", + true), + GFX_HACK_SKIP_EFB_COPY_TO_RAM(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, + "EFBToTextureEnable", true), + GFX_HACK_SKIP_XFB_COPY_TO_RAM(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, + "XFBToTextureEnable", true), + GFX_HACK_DEFER_EFB_COPIES(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "DeferEFBCopies", true), + GFX_HACK_IMMEDIATE_XFB(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "ImmediateXFBEnable", + false), + GFX_HACK_SKIP_DUPLICATE_XFBS(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "SkipDuplicateXFBs", + true), + GFX_HACK_COPY_EFB_SCALED(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, "EFBScaledCopy", true), + GFX_HACK_EFB_EMULATE_FORMAT_CHANGES(Settings.FILE_GFX, Settings.SECTION_GFX_HACKS, + "EFBEmulateFormatChanges", false), + + LOGGER_WRITE_TO_FILE(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "WriteToFile", false), + + // 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", false), + MAIN_JIT_LOAD_STORE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitLoadStoreOff", false), + MAIN_JIT_LOAD_STORE_FLOATING_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, + "JitLoadStoreFloatingOff", false), + MAIN_JIT_LOAD_STORE_PAIRED_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, + "JitLoadStorePairedOff", false), + MAIN_JIT_FLOATING_POINT_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitFloatingPointOff", + false), + MAIN_JIT_INTEGER_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitIntegerOff", false), + MAIN_JIT_PAIRED_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitPairedOff", false), + MAIN_JIT_SYSTEM_REGISTERS_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, + "JitSystemRegistersOff", false), + MAIN_JIT_BRANCH_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitBranchOff", false), + MAIN_JIT_REGISTER_CACHE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitRegisterCacheOff", + false); + + private final String mFile; + private final String mSection; + private final String mKey; + private final boolean mDefaultValue; + + BooleanSetting(String file, String section, String key, boolean defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + mDefaultValue = defaultValue; + } + + @Override + public boolean delete(Settings settings) + { + return settings.getSection(mFile, mSection).delete(mKey); + } + + @Override + public boolean getBoolean(Settings settings) + { + return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + } + + @Override + public void setBoolean(Settings settings, boolean newValue) + { + settings.getSection(mFile, mSection).setBoolean(mKey, newValue); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java index b8ed91a4b9..2844074da3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -1,8 +1,40 @@ package org.dolphinemu.dolphinemu.features.settings.model; -public interface FloatSetting extends AbstractSetting +public enum FloatSetting implements AbstractFloatSetting { - float getFloat(Settings settings, float defaultValue); + // These entries have the same names and order as in C++, just for consistency. - void setFloat(Settings settings, float newValue); + MAIN_EMULATION_SPEED(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "EmulationSpeed", 1.0f), + MAIN_OVERCLOCK(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "Overclock", 1.0f); + + private final String mFile; + private final String mSection; + private final String mKey; + private final float mDefaultValue; + + FloatSetting(String file, String section, String key, float defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + mDefaultValue = defaultValue; + } + + @Override + public boolean delete(Settings settings) + { + return settings.getSection(mFile, mSection).delete(mKey); + } + + @Override + public float getFloat(Settings settings) + { + return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue); + } + + @Override + public void setFloat(Settings settings, float newValue) + { + settings.getSection(mFile, mSection).setFloat(mKey, newValue); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index 14182df6c3..09ba84f118 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -1,8 +1,67 @@ package org.dolphinemu.dolphinemu.features.settings.model; -public interface IntSetting extends AbstractSetting -{ - int getInt(Settings settings, int defaultValue); +import org.dolphinemu.dolphinemu.NativeLibrary; - void setInt(Settings settings, int newValue); +public enum IntSetting implements AbstractIntSetting +{ + // 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", + NativeLibrary.DefaultCPUCore()), + MAIN_GC_LANGUAGE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SelectedLanguage", 0), + MAIN_SLOT_A(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotA", 8), + MAIN_SLOT_B(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotB", 255), + + MAIN_AUDIO_VOLUME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "Volume", 100), + + MAIN_LAST_PLATFORM_TAB(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "LastPlatformTab", 0), + + GFX_ASPECT_RATIO(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "AspectRatio", 0), + GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "SafeTextureCacheColorSamples", 128), + GFX_MSAA(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "MSAA", 1), + GFX_EFB_SCALE(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, "InternalResolution", 1), + GFX_SHADER_COMPILATION_MODE(Settings.FILE_GFX, Settings.SECTION_GFX_SETTINGS, + "ShaderCompilationMode", 0), + + GFX_ENHANCE_MAX_ANISOTROPY(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, "MaxAnisotropy", + 0), + + GFX_STEREO_MODE(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoMode", 0), + GFX_STEREO_DEPTH(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoDepth", 20), + GFX_STEREO_CONVERGENCE_PERCENTAGE(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, + "StereoConvergencePercentage", 100), + + LOGGER_VERBOSITY(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "Verbosity", 1); + + private final String mFile; + private final String mSection; + private final String mKey; + private final int mDefaultValue; + + IntSetting(String file, String section, String key, int defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + mDefaultValue = defaultValue; + } + + @Override + public boolean delete(Settings settings) + { + return settings.getSection(mFile, mSection).delete(mKey); + } + + @Override + public int getInt(Settings settings) + { + return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); + } + + @Override + public void setInt(Settings settings, int newValue) + { + settings.getSection(mFile, mSection).setInt(mKey, newValue); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java new file mode 100644 index 0000000000..c2f4a8895d --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java @@ -0,0 +1,24 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class LegacyBooleanSetting extends AbstractLegacySetting implements AbstractBooleanSetting +{ + private final boolean mDefaultValue; + + public LegacyBooleanSetting(String file, String section, String key, boolean defaultValue) + { + super(file, section, key); + mDefaultValue = defaultValue; + } + + @Override + public boolean getBoolean(Settings settings) + { + return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + } + + @Override + public void setBoolean(Settings settings, boolean newValue) + { + settings.getSection(mFile, mSection).setBoolean(mKey, newValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyFloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyFloatSetting.java new file mode 100644 index 0000000000..fb4858ceea --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyFloatSetting.java @@ -0,0 +1,24 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class LegacyFloatSetting extends AbstractLegacySetting implements AbstractFloatSetting +{ + private final float mDefaultValue; + + public LegacyFloatSetting(String file, String section, String key, float defaultValue) + { + super(file, section, key); + mDefaultValue = defaultValue; + } + + @Override + public float getFloat(Settings settings) + { + return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue); + } + + @Override + public void setFloat(Settings settings, float newValue) + { + settings.getSection(mFile, mSection).setFloat(mKey, newValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java new file mode 100644 index 0000000000..7d52660efe --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java @@ -0,0 +1,24 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class LegacyIntSetting extends AbstractLegacySetting implements AbstractIntSetting +{ + private final int mDefaultValue; + + public LegacyIntSetting(String file, String section, String key, int defaultValue) + { + super(file, section, key); + mDefaultValue = defaultValue; + } + + @Override + public int getInt(Settings settings) + { + return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); + } + + @Override + public void setInt(Settings settings, int newValue) + { + settings.getSection(mFile, mSection).setInt(mKey, newValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java deleted file mode 100644 index a04acc47f6..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacySetting.java +++ /dev/null @@ -1,69 +0,0 @@ -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); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyStringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyStringSetting.java new file mode 100644 index 0000000000..8ada455cea --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyStringSetting.java @@ -0,0 +1,24 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class LegacyStringSetting extends AbstractLegacySetting implements AbstractStringSetting +{ + private final String mDefaultValue; + + public LegacyStringSetting(String file, String section, String key, String defaultValue) + { + super(file, section, key); + mDefaultValue = defaultValue; + } + + @Override + public String getString(Settings settings) + { + return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue); + } + + @Override + public void setString(Settings settings, String newValue) + { + settings.getSection(mFile, mSection).setString(mKey, newValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java deleted file mode 100644 index a16ea015ee..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Setting.java +++ /dev/null @@ -1,186 +0,0 @@ -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); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index d0803f67d0..94dce9fcd0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -96,7 +96,7 @@ public class Settings loadCustomGameSettings(gameId, view); } - mLoadedRecursiveIsoPathsValue = Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this, false); + mLoadedRecursiveIsoPathsValue = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this); } private void loadDolphinSettings(SettingsActivityView view) @@ -145,7 +145,7 @@ public class Settings NativeLibrary.ReloadLoggerConfig(); NativeLibrary.UpdateGCAdapterScanThread(); - if (mLoadedRecursiveIsoPathsValue != Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this, false)) + if (mLoadedRecursiveIsoPathsValue != BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this)) { // Refresh game library GameFileCacheService.startRescan(context); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java index ee710ad7e5..627be71eda 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -1,8 +1,53 @@ package org.dolphinemu.dolphinemu.features.settings.model; -public interface StringSetting extends AbstractSetting -{ - String getString(Settings settings, String defaultValue); +import org.dolphinemu.dolphinemu.NativeLibrary; - void setString(Settings settings, String newValue); +public enum StringSetting implements AbstractStringSetting +{ + // These entries have the same names and order as in C++, just for consistency. + + MAIN_DEFAULT_ISO(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "DefaultISO", ""), + MAIN_GFX_BACKEND(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "GFXBackend", + NativeLibrary.GetDefaultGraphicsBackendName()), + + 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", ""), + + GFX_ENHANCE_POST_SHADER(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, + "PostProcessingShader", ""); + + private final String mFile; + private final String mSection; + private final String mKey; + private final String mDefaultValue; + + StringSetting(String file, String section, String key, String defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + mDefaultValue = defaultValue; + } + + @Override + public boolean delete(Settings settings) + { + return settings.getSection(mFile, mSection).delete(mKey); + } + + @Override + public String getString(Settings settings) + { + return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue); + } + + @Override + public void setString(Settings settings, String newValue) + { + settings.getSection(mFile, mSection).setString(mKey, newValue); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java index 5f8ed11951..b03ecb4b22 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java @@ -1,24 +1,21 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class CheckBoxSetting extends SettingsItem { - protected BooleanSetting mSetting; - protected boolean mDefaultValue; + protected AbstractBooleanSetting mSetting; - public CheckBoxSetting(BooleanSetting setting, int titleId, int descriptionId, - boolean defaultValue) + public CheckBoxSetting(AbstractBooleanSetting setting, int titleId, int descriptionId) { super(titleId, descriptionId); mSetting = setting; - mDefaultValue = defaultValue; } public boolean isChecked(Settings settings) { - return mSetting.getBoolean(settings, mDefaultValue); + return mSetting.getBoolean(settings); } public void setChecked(Settings settings, boolean checked) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java index d6c2da5319..811f552a46 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java @@ -1,26 +1,23 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractStringSetting; 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 AbstractStringSetting mSetting; private int mRequestType; - public FilePicker(StringSetting setting, int titleId, int descriptionId, - String defaultVault, int requestType) + public FilePicker(AbstractStringSetting setting, int titleId, int descriptionId, int requestType) { super(titleId, descriptionId); mSetting = setting; - mDefaultValue = defaultVault; mRequestType = requestType; } public String getSelectedValue(Settings settings) { - return mSetting.getString(settings, mDefaultValue); + return mSetting.getString(settings); } public void setSelectedValue(Settings settings, String selection) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java index 3c736c376f..6e750957d2 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java @@ -1,24 +1,22 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractFloatSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class FloatSliderSetting extends SliderSetting { - protected FloatSetting mSetting; - protected float mDefaultValue; + protected AbstractFloatSetting mSetting; - public FloatSliderSetting(FloatSetting setting, int titleId, int descriptionId, int max, - String units, float defaultValue) + public FloatSliderSetting(AbstractFloatSetting setting, int titleId, int descriptionId, int max, + String units) { super(titleId, descriptionId, max, units); mSetting = setting; - mDefaultValue = defaultValue; } public int getSelectedValue(Settings settings) { - return Math.round(mSetting.getFloat(settings, mDefaultValue)); + return Math.round(mSetting.getFloat(settings)); } public void setSelectedValue(Settings settings, float selection) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java index eab1d4b54a..c731286205 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java @@ -1,24 +1,22 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class IntSliderSetting extends SliderSetting { - private IntSetting mSetting; - private int mDefaultValue; + private AbstractIntSetting mSetting; - public IntSliderSetting(IntSetting setting, int titleId, int descriptionId, int max, - String units, int defaultValue) + public IntSliderSetting(AbstractIntSetting setting, int titleId, int descriptionId, int max, + String units) { super(titleId, descriptionId, max, units); mSetting = setting; - mDefaultValue = defaultValue; } public int getSelectedValue(Settings settings) { - return mSetting.getInt(settings, mDefaultValue); + return mSetting.getInt(settings); } public void setSelectedValue(Settings settings, int selection) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java index 9e5b9f08eb..1cf37aa0f1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java @@ -1,20 +1,20 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class InvertedCheckBoxSetting extends CheckBoxSetting { - public InvertedCheckBoxSetting(BooleanSetting setting, int titleId, - int descriptionId, boolean defaultValue) + public InvertedCheckBoxSetting(AbstractBooleanSetting setting, int titleId, + int descriptionId) { - super(setting, titleId, descriptionId, !defaultValue); + super(setting, titleId, descriptionId); } @Override public boolean isChecked(Settings settings) { - return !mSetting.getBoolean(settings, mDefaultValue); + return !mSetting.getBoolean(settings); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java index 6bd9fccdda..0f046b40e8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java @@ -1,17 +1,16 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.LegacySetting; +import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; 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) + public LogCheckBoxSetting(String key, int titleId, int descriptionId) { - super(new LegacySetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key), titleId, - descriptionId, defaultValue); + super(new LegacyBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key, false), + titleId, descriptionId); mKey = key; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java index 14b5eaf459..a0294d4478 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java @@ -1,20 +1,20 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractFloatSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class PercentSliderSetting extends FloatSliderSetting { - public PercentSliderSetting(FloatSetting setting, int titleId, int descriptionId, int max, - String units, float defaultValue) + public PercentSliderSetting(AbstractFloatSetting setting, int titleId, int descriptionId, int max, + String units) { - super(setting, titleId, descriptionId, max, units, defaultValue / 100); + super(setting, titleId, descriptionId, max, units); } @Override public int getSelectedValue(Settings settings) { - return Math.round(mSetting.getFloat(settings, mDefaultValue) * 100); + return Math.round(mSetting.getFloat(settings) * 100); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java index 8dac68e536..f42343002d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java @@ -1,33 +1,31 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; 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 AbstractIntSetting mSetting; private int mChoicesId; private int mValuesId; private MenuTag menuTag; - public SingleChoiceSetting(IntSetting setting, int titleId, int descriptionId, int choicesId, - int valuesId, int defaultValue, MenuTag menuTag) + public SingleChoiceSetting(AbstractIntSetting setting, int titleId, int descriptionId, + int choicesId, int valuesId, MenuTag menuTag) { super(titleId, descriptionId); mSetting = setting; - mDefaultValue = defaultValue; mValuesId = valuesId; mChoicesId = choicesId; this.menuTag = menuTag; } - public SingleChoiceSetting(IntSetting setting, int titleId, int descriptionId, int choicesId, - int valuesId, int defaultValue) + public SingleChoiceSetting(AbstractIntSetting setting, int titleId, int descriptionId, + int choicesId, int valuesId) { - this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } public int getChoicesId() @@ -42,7 +40,7 @@ public final class SingleChoiceSetting extends SettingsItem public int getSelectedValue(Settings settings) { - return mSetting.getInt(settings, mDefaultValue); + return mSetting.getInt(settings); } public MenuTag getMenuTag() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java index bc1cf1ab65..d39e463d26 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java @@ -1,13 +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.AbstractIntSetting; 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 AbstractIntSetting mSetting; private int mChoicesId; private int mValuesId; @@ -15,13 +14,12 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem private int mDescriptionValuesId; private MenuTag menuTag; - public SingleChoiceSettingDynamicDescriptions(IntSetting setting, int titleId, int descriptionId, - int choicesId, int valuesId, int descriptionChoicesId, int descriptionValuesId, - int defaultValue, MenuTag menuTag) + public SingleChoiceSettingDynamicDescriptions(AbstractIntSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId, int descriptionChoicesId, + int descriptionValuesId, MenuTag menuTag) { super(titleId, descriptionId); mSetting = setting; - mDefaultValue = defaultValue; mValuesId = valuesId; mChoicesId = choicesId; mDescriptionChoicesId = descriptionChoicesId; @@ -29,12 +27,12 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem this.menuTag = menuTag; } - public SingleChoiceSettingDynamicDescriptions(IntSetting setting, int titleId, int descriptionId, - int choicesId, int valuesId, int descriptionChoicesId, int descriptionValuesId, - int defaultValue) + public SingleChoiceSettingDynamicDescriptions(AbstractIntSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId, int descriptionChoicesId, + int descriptionValuesId) { this(setting, titleId, descriptionId, choicesId, valuesId, descriptionChoicesId, - descriptionValuesId, defaultValue, null); + descriptionValuesId, null); } public int getChoicesId() @@ -59,7 +57,7 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem public int getSelectedValue(Settings settings) { - return mSetting.getInt(settings, mDefaultValue); + return mSetting.getInt(settings); } public MenuTag getMenuTag() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java index 97ce6d00a2..d1279aa4fd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java @@ -1,52 +1,48 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.DolphinApplication; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractStringSetting; 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 AbstractStringSetting mSetting; private String[] mChoicesId; private String[] mValuesId; private MenuTag mMenuTag; - public StringSingleChoiceSetting(StringSetting setting, int titleId, - int descriptionId, String[] choicesId, String[] valuesId, String defaultValue, - MenuTag menuTag) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, String[] choicesId, String[] valuesId, MenuTag menuTag) { super(titleId, descriptionId); mSetting = setting; mChoicesId = choicesId; mValuesId = valuesId; - mDefaultValue = defaultValue; mMenuTag = menuTag; } - public StringSingleChoiceSetting(StringSetting setting, int titleId, - int descriptionId, String[] choicesId, String[] valuesId, String defaultValue) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, String[] choicesId, String[] valuesId) { - this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } - public StringSingleChoiceSetting(StringSetting setting, int titleId, - int descriptionId, int choicesId, int valuesId, String defaultValue, MenuTag menuTag) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId, MenuTag menuTag) { super(titleId, descriptionId); mSetting = setting; mChoicesId = DolphinApplication.getAppContext().getResources().getStringArray(choicesId); mValuesId = DolphinApplication.getAppContext().getResources().getStringArray(valuesId); - mDefaultValue = defaultValue; mMenuTag = menuTag; } - public StringSingleChoiceSetting(StringSetting setting, int titleId, - int descriptionId, int choicesId, int valuesId, String defaultValue) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId) { - this(setting, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } public String[] getChoicesId() @@ -74,7 +70,7 @@ public class StringSingleChoiceSetting extends SettingsItem public String getSelectedValue(Settings settings) { - return mSetting.getString(settings, mDefaultValue); + return mSetting.getString(settings); } public int getSelectValueIndex(Settings settings) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index da8d00a895..5ba48985a0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -13,9 +13,9 @@ 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.LegacyBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; +import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker; import org.dolphinemu.dolphinemu.features.settings.model.view.FloatSliderSetting; @@ -319,12 +319,12 @@ public final class SettingsAdapter extends RecyclerView.Adapter entry : SettingsFragmentPresenter.LOG_TYPE_NAMES.entrySet()) { - new LegacySetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey()) - .setBoolean(settings, value); + new LegacyBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey(), + false).setBoolean(settings, value); } mView.onSettingChanged(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index 79da4a5515..e014c85260 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -5,10 +5,15 @@ import android.text.TextUtils; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting; import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; -import org.dolphinemu.dolphinemu.features.settings.model.LegacySetting; -import org.dolphinemu.dolphinemu.features.settings.model.Setting; +import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.LegacyIntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.LegacyStringSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; +import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.ConfirmRunnable; import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker; @@ -224,24 +229,24 @@ public final class SettingsFragmentPresenter private void addGeneralSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(Setting.MAIN_CPU_THREAD, R.string.dual_core, - R.string.dual_core_description, true)); - sl.add(new CheckBoxSetting(Setting.MAIN_OVERRIDE_REGION_SETTINGS, - R.string.override_region_settings, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_AUTO_DISC_CHANGE, R.string.auto_disc_change, 0, false)); - sl.add(new PercentSliderSetting(Setting.MAIN_EMULATION_SPEED, R.string.speed_limit, 0, 200, "%", - 100)); - sl.add(new CheckBoxSetting(Setting.MAIN_ANALYTICS_ENABLED, R.string.analytics, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_ENABLE_SAVESTATES, R.string.enable_save_states, - R.string.enable_save_states_description, false)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_CPU_THREAD, R.string.dual_core, + R.string.dual_core_description)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_OVERRIDE_REGION_SETTINGS, + R.string.override_region_settings, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_AUTO_DISC_CHANGE, R.string.auto_disc_change, 0)); + sl.add(new PercentSliderSetting(FloatSetting.MAIN_EMULATION_SPEED, R.string.speed_limit, 0, 200, + "%")); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_ANALYTICS_ENABLED, R.string.analytics, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_ENABLE_SAVESTATES, R.string.enable_save_states, + R.string.enable_save_states_description)); } private void addInterfaceSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(Setting.MAIN_USE_PANIC_HANDLERS, R.string.panic_handlers, - R.string.panic_handlers_description, true)); - sl.add(new CheckBoxSetting(Setting.MAIN_OSD_MESSAGES, R.string.osd_messages, - R.string.osd_messages_description, true)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_USE_PANIC_HANDLERS, R.string.panic_handlers, + R.string.panic_handlers_description)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_OSD_MESSAGES, R.string.osd_messages, + R.string.osd_messages_description)); } private void addAudioSettings(ArrayList sl) @@ -250,18 +255,18 @@ public final class SettingsFragmentPresenter final int DSP_LLE_RECOMPILER = 1; final int DSP_LLE_INTERPRETER = 2; - IntSetting dspEmulationEngine = new IntSetting() + AbstractIntSetting dspEmulationEngine = new AbstractIntSetting() { @Override - public int getInt(Settings settings, int defaultValue) + public int getInt(Settings settings) { - if (Setting.MAIN_DSP_HLE.getBoolean(settings, true)) + if (BooleanSetting.MAIN_DSP_HLE.getBoolean(settings)) { return DSP_HLE; } else { - boolean jit = Setting.MAIN_DSP_JIT.getBoolean(settings, true); + boolean jit = BooleanSetting.MAIN_DSP_JIT.getBoolean(settings); return jit ? DSP_LLE_RECOMPILER : DSP_LLE_INTERPRETER; } } @@ -272,18 +277,18 @@ public final class SettingsFragmentPresenter switch (newValue) { case DSP_HLE: - Setting.MAIN_DSP_HLE.setBoolean(settings, true); - Setting.MAIN_DSP_JIT.setBoolean(settings, true); + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, true); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, true); break; case DSP_LLE_RECOMPILER: - Setting.MAIN_DSP_HLE.setBoolean(settings, false); - Setting.MAIN_DSP_JIT.setBoolean(settings, true); + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, false); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, true); break; case DSP_LLE_INTERPRETER: - Setting.MAIN_DSP_HLE.setBoolean(settings, false); - Setting.MAIN_DSP_JIT.setBoolean(settings, false); + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, false); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, false); break; } } @@ -292,7 +297,8 @@ public final class SettingsFragmentPresenter public boolean delete(Settings settings) { // Not short circuiting - return Setting.MAIN_DSP_HLE.delete(settings) & Setting.MAIN_DSP_JIT.delete(settings); + return BooleanSetting.MAIN_DSP_HLE.delete(settings) & + BooleanSetting.MAIN_DSP_JIT.delete(settings); } }; @@ -311,28 +317,27 @@ public final class SettingsFragmentPresenter dspEngineValues = R.array.dspEngineValuesGeneric; } sl.add(new SingleChoiceSetting(dspEmulationEngine, R.string.dsp_emulation_engine, 0, - dspEngineEntries, dspEngineValues, 0)); - sl.add(new CheckBoxSetting(Setting.MAIN_AUDIO_STRETCH, R.string.audio_stretch, - R.string.audio_stretch_description, false)); - sl.add(new IntSliderSetting(Setting.MAIN_AUDIO_VOLUME, R.string.audio_volume, 0, 100, "%", - 100)); + dspEngineEntries, dspEngineValues)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_AUDIO_STRETCH, R.string.audio_stretch, + R.string.audio_stretch_description)); + sl.add(new IntSliderSetting(IntSetting.MAIN_AUDIO_VOLUME, R.string.audio_volume, 0, 100, "%")); } private void addPathsSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(Setting.MAIN_RECURSIVE_ISO_PATHS, R.string.search_subfolders, 0, - false)); - sl.add(new FilePicker(Setting.MAIN_DEFAULT_ISO, R.string.default_ISO, 0, "", + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_RECURSIVE_ISO_PATHS, R.string.search_subfolders, + 0)); + sl.add(new FilePicker(StringSetting.MAIN_DEFAULT_ISO, R.string.default_ISO, 0, MainPresenter.REQUEST_GAME_FILE)); - sl.add(new FilePicker(Setting.MAIN_FS_PATH, R.string.wii_NAND_root, 0, getDefaultNANDRootPath(), + sl.add(new FilePicker(StringSetting.MAIN_FS_PATH, R.string.wii_NAND_root, 0, MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(Setting.MAIN_DUMP_PATH, R.string.dump_path, 0, getDefaultDumpPath(), + sl.add(new FilePicker(StringSetting.MAIN_DUMP_PATH, R.string.dump_path, 0, MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(Setting.MAIN_LOAD_PATH, R.string.load_path, 0, getDefaultLoadPath(), + sl.add(new FilePicker(StringSetting.MAIN_LOAD_PATH, R.string.load_path, 0, MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(Setting.MAIN_RESOURCEPACK_PATH, R.string.resource_pack_path, 0, - getDefaultResourcePackPath(), MainPresenter.REQUEST_DIRECTORY)); - sl.add(new FilePicker(Setting.MAIN_SD_PATH, R.string.SD_card_path, 0, getDefaultSDPath(), + sl.add(new FilePicker(StringSetting.MAIN_RESOURCEPACK_PATH, R.string.resource_pack_path, 0, + MainPresenter.REQUEST_DIRECTORY)); + sl.add(new FilePicker(StringSetting.MAIN_SD_PATH, R.string.SD_card_path, 0, MainPresenter.REQUEST_SD_FILE)); sl.add(new ConfirmRunnable(R.string.reset_paths, 0, R.string.reset_paths_confirmation, 0, mView.getAdapter()::resetPaths)); @@ -340,24 +345,24 @@ public final class SettingsFragmentPresenter private void addGameCubeSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(Setting.MAIN_GC_LANGUAGE, R.string.gamecube_system_language, 0, - R.array.gameCubeSystemLanguageEntries, R.array.gameCubeSystemLanguageValues, 0)); - sl.add(new SingleChoiceSetting(Setting.MAIN_SLOT_A, R.string.slot_a_device, 0, - R.array.slotDeviceEntries, R.array.slotDeviceValues, 8)); - sl.add(new SingleChoiceSetting(Setting.MAIN_SLOT_B, R.string.slot_b_device, 0, - R.array.slotDeviceEntries, R.array.slotDeviceValues, 255)); + sl.add(new SingleChoiceSetting(IntSetting.MAIN_GC_LANGUAGE, R.string.gamecube_system_language, + 0, R.array.gameCubeSystemLanguageEntries, R.array.gameCubeSystemLanguageValues)); + sl.add(new SingleChoiceSetting(IntSetting.MAIN_SLOT_A, R.string.slot_a_device, 0, + R.array.slotDeviceEntries, R.array.slotDeviceValues)); + sl.add(new SingleChoiceSetting(IntSetting.MAIN_SLOT_B, R.string.slot_b_device, 0, + R.array.slotDeviceEntries, R.array.slotDeviceValues)); } private void addWiiSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(Setting.MAIN_WII_SD_CARD, R.string.insert_sd_card, - R.string.insert_sd_card_description, true)); - sl.add(new CheckBoxSetting(Setting.MAIN_ALLOW_SD_WRITES, R.string.wii_sd_card_allow_writes, 0, - true)); - sl.add(new CheckBoxSetting(Setting.MAIN_WIIMOTE_CONTINUOUS_SCANNING, R.string.wiimote_scanning, - R.string.wiimote_scanning_description, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_WIIMOTE_ENABLE_SPEAKER, R.string.wiimote_speaker, - R.string.wiimote_speaker_description, false)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_WII_SD_CARD, R.string.insert_sd_card, + R.string.insert_sd_card_description)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_ALLOW_SD_WRITES, + R.string.wii_sd_card_allow_writes, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_WIIMOTE_CONTINUOUS_SCANNING, + R.string.wiimote_scanning, R.string.wiimote_scanning_description)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_WIIMOTE_ENABLE_SPEAKER, R.string.wiimote_speaker, + R.string.wiimote_speaker_description)); } private void addAdvancedSettings(ArrayList sl) @@ -383,32 +388,32 @@ public final class SettingsFragmentPresenter emuCoresEntries = R.array.emuCoresEntriesGeneric; emuCoresValues = R.array.emuCoresValuesGeneric; } - sl.add(new SingleChoiceSetting(Setting.MAIN_CPU_CORE, R.string.cpu_core, 0, emuCoresEntries, - emuCoresValues, defaultCpuCore)); - sl.add(new CheckBoxSetting(Setting.MAIN_OVERCLOCK_ENABLE, R.string.overclock_enable, - R.string.overclock_enable_description, false)); - sl.add(new PercentSliderSetting(Setting.MAIN_OVERCLOCK, R.string.overclock_title, - R.string.overclock_title_description, 400, "%", 100)); + sl.add(new SingleChoiceSetting(IntSetting.MAIN_CPU_CORE, R.string.cpu_core, 0, emuCoresEntries, + emuCoresValues)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_OVERCLOCK_ENABLE, R.string.overclock_enable, + R.string.overclock_enable_description)); + sl.add(new PercentSliderSetting(FloatSetting.MAIN_OVERCLOCK, R.string.overclock_title, + R.string.overclock_title_description, 400, "%")); } private void addGcPadSettings(ArrayList sl) { for (int i = 0; i < 4; i++) { - LegacySetting gcPadSetting; + LegacyIntSetting gcPadSetting; if (mGameID.equals("")) { - gcPadSetting = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCPAD_TYPE + i); + gcPadSetting = new LegacyIntSetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_TYPE + i, 0); } else { - gcPadSetting = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_GCPAD_G_TYPE + i); + gcPadSetting = new LegacyIntSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_GCPAD_G_TYPE + i, 0); } // TODO: This controller_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. sl.add(new SingleChoiceSetting(gcPadSetting, R.string.controller_0 + i, 0, - R.array.gcpadTypeEntries, R.array.gcpadTypeValues, 0, MenuTag.getGCPadMenuTag(i))); + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(i))); } } @@ -416,20 +421,20 @@ public final class SettingsFragmentPresenter { for (int i = 0; i < 4; i++) { - LegacySetting wiimoteSetting; + LegacyIntSetting wiimoteSetting; if (mGameID.equals("")) { - wiimoteSetting = new LegacySetting(Settings.FILE_WIIMOTE, - Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE); + wiimoteSetting = new LegacyIntSetting(Settings.FILE_WIIMOTE, + Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE, 0); } else { - wiimoteSetting = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_G_TYPE + i); + wiimoteSetting = new LegacyIntSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_G_TYPE + i, 0); } // TODO: This wiimote_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. sl.add(new SingleChoiceSetting(wiimoteSetting, R.string.wiimote_4 + i, 0, - R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, MenuTag.getWiimoteMenuTag(i + 4))); } } @@ -437,18 +442,18 @@ public final class SettingsFragmentPresenter private void addGraphicsSettings(ArrayList sl) { sl.add(new HeaderSetting(R.string.graphics_general, 0)); - sl.add(new StringSingleChoiceSetting(Setting.MAIN_GFX_BACKEND, R.string.video_backend, 0, - R.array.videoBackendEntries, R.array.videoBackendValues, "OGL")); - sl.add(new CheckBoxSetting(Setting.GFX_SHOW_FPS, R.string.show_fps, - R.string.show_fps_description, false)); - sl.add(new SingleChoiceSettingDynamicDescriptions(Setting.GFX_SHADER_COMPILATION_MODE, + sl.add(new StringSingleChoiceSetting(StringSetting.MAIN_GFX_BACKEND, R.string.video_backend, 0, + R.array.videoBackendEntries, R.array.videoBackendValues)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_SHOW_FPS, R.string.show_fps, + R.string.show_fps_description)); + sl.add(new SingleChoiceSettingDynamicDescriptions(IntSetting.GFX_SHADER_COMPILATION_MODE, R.string.shader_compilation_mode, 0, R.array.shaderCompilationModeEntries, R.array.shaderCompilationModeValues, R.array.shaderCompilationDescriptionEntries, - R.array.shaderCompilationDescriptionValues, 0)); - sl.add(new CheckBoxSetting(Setting.GFX_WAIT_FOR_SHADERS_BEFORE_STARTING, - R.string.wait_for_shaders, R.string.wait_for_shaders_description, false)); - sl.add(new SingleChoiceSetting(Setting.GFX_ASPECT_RATIO, R.string.aspect_ratio, 0, - R.array.aspectRatioEntries, R.array.aspectRatioValues, 0)); + R.array.shaderCompilationDescriptionValues)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_WAIT_FOR_SHADERS_BEFORE_STARTING, + R.string.wait_for_shaders, R.string.wait_for_shaders_description)); + sl.add(new SingleChoiceSetting(IntSetting.GFX_ASPECT_RATIO, R.string.aspect_ratio, 0, + R.array.aspectRatioEntries, R.array.aspectRatioValues)); sl.add(new HeaderSetting(R.string.graphics_enhancements_and_hacks, 0)); sl.add(new SubmenuSetting(R.string.enhancements_submenu, MenuTag.ENHANCEMENTS)); @@ -457,44 +462,43 @@ public final class SettingsFragmentPresenter private void addEnhanceSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(Setting.GFX_EFB_SCALE, R.string.internal_resolution, + sl.add(new SingleChoiceSetting(IntSetting.GFX_EFB_SCALE, R.string.internal_resolution, R.string.internal_resolution_description, R.array.internalResolutionEntries, - R.array.internalResolutionValues, 1)); - sl.add(new SingleChoiceSetting(Setting.GFX_MSAA, R.string.FSAA, R.string.FSAA_description, - R.array.FSAAEntries, R.array.FSAAValues, 1)); - sl.add(new SingleChoiceSetting(Setting.GFX_ENHANCE_MAX_ANISOTROPY, + R.array.internalResolutionValues)); + sl.add(new SingleChoiceSetting(IntSetting.GFX_MSAA, R.string.FSAA, R.string.FSAA_description, + R.array.FSAAEntries, R.array.FSAAValues)); + sl.add(new SingleChoiceSetting(IntSetting.GFX_ENHANCE_MAX_ANISOTROPY, R.string.anisotropic_filtering, R.string.anisotropic_filtering_description, - R.array.anisotropicFilteringEntries, R.array.anisotropicFilteringValues, 0)); + R.array.anisotropicFilteringEntries, R.array.anisotropicFilteringValues)); - int stereoModeValue = Setting.GFX_STEREO_MODE.getInt(mSettings, 0); + int stereoModeValue = IntSetting.GFX_STEREO_MODE.getInt(mSettings); final int anaglyphMode = 3; String subDir = stereoModeValue == anaglyphMode ? "Anaglyph" : null; String[] shaderListEntries = getShaderList(subDir); String[] shaderListValues = new String[shaderListEntries.length]; System.arraycopy(shaderListEntries, 0, shaderListValues, 0, shaderListEntries.length); shaderListValues[0] = ""; - sl.add(new StringSingleChoiceSetting(Setting.GFX_ENHANCE_POST_SHADER, - R.string.post_processing_shader, 0, shaderListEntries, shaderListValues, "")); + sl.add(new StringSingleChoiceSetting(StringSetting.GFX_ENHANCE_POST_SHADER, + R.string.post_processing_shader, 0, shaderListEntries, shaderListValues)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_COPY_EFB_SCALED, R.string.scaled_efb_copy, - R.string.scaled_efb_copy_description, true)); - sl.add(new CheckBoxSetting(Setting.GFX_ENABLE_PIXEL_LIGHTING, R.string.per_pixel_lighting, - R.string.per_pixel_lighting_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_FORCE_FILTERING, - R.string.force_texture_filtering, R.string.force_texture_filtering_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_FORCE_TRUE_COLOR, R.string.force_24bit_color, - R.string.force_24bit_color_description, true)); - sl.add(new CheckBoxSetting(Setting.GFX_DISABLE_FOG, R.string.disable_fog, - R.string.disable_fog_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_DISABLE_COPY_FILTER, - R.string.disable_copy_filter, R.string.disable_copy_filter_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION, - R.string.arbitrary_mipmap_detection, R.string.arbitrary_mipmap_detection_description, - true)); - sl.add(new CheckBoxSetting(Setting.GFX_WIDESCREEN_HACK, R.string.wide_screen_hack, - R.string.wide_screen_hack_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_BACKEND_MULTITHREADING, R.string.backend_multithreading, - R.string.backend_multithreading_description, false)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_COPY_EFB_SCALED, R.string.scaled_efb_copy, + R.string.scaled_efb_copy_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENABLE_PIXEL_LIGHTING, + R.string.per_pixel_lighting, R.string.per_pixel_lighting_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENHANCE_FORCE_FILTERING, + R.string.force_texture_filtering, R.string.force_texture_filtering_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENHANCE_FORCE_TRUE_COLOR, + R.string.force_24bit_color, R.string.force_24bit_color_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_DISABLE_FOG, R.string.disable_fog, + R.string.disable_fog_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENHANCE_DISABLE_COPY_FILTER, + R.string.disable_copy_filter, R.string.disable_copy_filter_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION, + R.string.arbitrary_mipmap_detection, R.string.arbitrary_mipmap_detection_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_WIDESCREEN_HACK, R.string.wide_screen_hack, + R.string.wide_screen_hack_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_BACKEND_MULTITHREADING, + R.string.backend_multithreading, R.string.backend_multithreading_description)); /* Check if we support stereo @@ -554,41 +558,41 @@ public final class SettingsFragmentPresenter private void addHackSettings(ArrayList sl) { sl.add(new HeaderSetting(R.string.embedded_frame_buffer, 0)); - sl.add(new InvertedCheckBoxSetting(Setting.GFX_HACK_EFB_ACCESS_ENABLE, R.string.skip_efb_access, - R.string.skip_efb_access_description, false)); - sl.add(new InvertedCheckBoxSetting(Setting.GFX_HACK_EFB_EMULATE_FORMAT_CHANGES, - R.string.ignore_format_changes, R.string.ignore_format_changes_description, true)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_EFB_COPY_TO_RAM, R.string.efb_copy_method, - R.string.efb_copy_method_description, true)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_DEFER_EFB_COPIES, R.string.defer_efb_copies, - R.string.defer_efb_copies_description, true)); + sl.add(new InvertedCheckBoxSetting(BooleanSetting.GFX_HACK_EFB_ACCESS_ENABLE, + R.string.skip_efb_access, R.string.skip_efb_access_description)); + sl.add(new InvertedCheckBoxSetting(BooleanSetting.GFX_HACK_EFB_EMULATE_FORMAT_CHANGES, + R.string.ignore_format_changes, R.string.ignore_format_changes_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_SKIP_EFB_COPY_TO_RAM, + R.string.efb_copy_method, R.string.efb_copy_method_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_DEFER_EFB_COPIES, R.string.defer_efb_copies, + R.string.defer_efb_copies_description)); sl.add(new HeaderSetting(R.string.texture_cache, 0)); - sl.add(new SingleChoiceSetting(Setting.GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, + sl.add(new SingleChoiceSetting(IntSetting.GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, R.string.texture_cache_accuracy, R.string.texture_cache_accuracy_description, - R.array.textureCacheAccuracyEntries, R.array.textureCacheAccuracyValues, 128)); - sl.add(new CheckBoxSetting(Setting.GFX_ENABLE_GPU_TEXTURE_DECODING, - R.string.gpu_texture_decoding, R.string.gpu_texture_decoding_description, false)); + R.array.textureCacheAccuracyEntries, R.array.textureCacheAccuracyValues)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_ENABLE_GPU_TEXTURE_DECODING, + R.string.gpu_texture_decoding, R.string.gpu_texture_decoding_description)); sl.add(new HeaderSetting(R.string.external_frame_buffer, 0)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_XFB_COPY_TO_RAM, R.string.xfb_copy_method, - R.string.xfb_copy_method_description, true)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_IMMEDIATE_XFB, R.string.immediate_xfb, - R.string.immediate_xfb_description, false)); - sl.add(new CheckBoxSetting(Setting.GFX_HACK_SKIP_DUPLICATE_XFBS, R.string.skip_duplicate_xfbs, - R.string.skip_duplicate_xfbs_description, true)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_SKIP_XFB_COPY_TO_RAM, + R.string.xfb_copy_method, R.string.xfb_copy_method_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_IMMEDIATE_XFB, R.string.immediate_xfb, + R.string.immediate_xfb_description)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_HACK_SKIP_DUPLICATE_XFBS, + R.string.skip_duplicate_xfbs, R.string.skip_duplicate_xfbs_description)); sl.add(new HeaderSetting(R.string.other, 0)); - sl.add(new CheckBoxSetting(Setting.GFX_FAST_DEPTH_CALC, R.string.fast_depth_calculation, - R.string.fast_depth_calculation_description, true)); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_FAST_DEPTH_CALC, R.string.fast_depth_calculation, + R.string.fast_depth_calculation_description)); } private void addLogConfigurationSettings(ArrayList sl) { - sl.add(new CheckBoxSetting(Setting.LOGGER_WRITE_TO_FILE, R.string.enable_logging, - R.string.enable_logging_description, false)); - sl.add(new SingleChoiceSetting(Setting.LOGGER_VERBOSITY, R.string.log_verbosity, 0, - getLogVerbosityEntries(), getLogVerbosityValues(), 1)); + sl.add(new CheckBoxSetting(BooleanSetting.LOGGER_WRITE_TO_FILE, R.string.enable_logging, + R.string.enable_logging_description)); + sl.add(new SingleChoiceSetting(IntSetting.LOGGER_VERBOSITY, R.string.log_verbosity, 0, + getLogVerbosityEntries(), getLogVerbosityValues())); sl.add(new ConfirmRunnable(R.string.log_enable_all, 0, R.string.log_enable_all_confirmation, 0, () -> mView.getAdapter().setAllLogTypes(true))); sl.add(new ConfirmRunnable(R.string.log_disable_all, 0, R.string.log_disable_all_confirmation, @@ -598,7 +602,7 @@ public final class SettingsFragmentPresenter for (Map.Entry entry : LOG_TYPE_NAMES.entrySet()) { // TitleID is handled by special case in CheckBoxSettingViewHolder. - sl.add(new LogCheckBoxSetting(entry.getKey(), 0, 0, false)); + sl.add(new LogCheckBoxSetting(entry.getKey(), 0, 0)); } } @@ -607,36 +611,36 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(R.string.debug_warning, 0)); sl.add(new HeaderSetting(R.string.debug_jit_header, 0)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_OFF, R.string.debug_jitoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_OFF, R.string.debug_jitloadstoreoff, 0, - false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_FLOATING_OFF, - R.string.debug_jitloadstorefloatingoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_LOAD_STORE_PAIRED_OFF, - R.string.debug_jitloadstorepairedoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_FLOATING_POINT_OFF, - R.string.debug_jitfloatingpointoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_INTEGER_OFF, R.string.debug_jitintegeroff, 0, - false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_PAIRED_OFF, R.string.debug_jitpairedoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_SYSTEM_REGISTERS_OFF, - R.string.debug_jitsystemregistersoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_BRANCH_OFF, R.string.debug_jitbranchoff, 0, false)); - sl.add(new CheckBoxSetting(Setting.MAIN_JIT_REGISTER_CACHE_OFF, - R.string.debug_jitregistercacheoff, 0, false)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_OFF, R.string.debug_jitoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_LOAD_STORE_OFF, + R.string.debug_jitloadstoreoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_LOAD_STORE_FLOATING_OFF, + R.string.debug_jitloadstorefloatingoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_LOAD_STORE_PAIRED_OFF, + R.string.debug_jitloadstorepairedoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_FLOATING_POINT_OFF, + R.string.debug_jitfloatingpointoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_INTEGER_OFF, R.string.debug_jitintegeroff, + 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_PAIRED_OFF, R.string.debug_jitpairedoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_SYSTEM_REGISTERS_OFF, + R.string.debug_jitsystemregistersoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_BRANCH_OFF, R.string.debug_jitbranchoff, 0)); + sl.add(new CheckBoxSetting(BooleanSetting.MAIN_JIT_REGISTER_CACHE_OFF, + R.string.debug_jitregistercacheoff, 0)); } private void addStereoSettings(ArrayList sl) { - sl.add(new SingleChoiceSetting(Setting.GFX_STEREO_MODE, R.string.stereoscopy_mode, 0, - R.array.stereoscopyEntries, R.array.stereoscopyValues, 0)); - sl.add(new IntSliderSetting(Setting.GFX_STEREO_DEPTH, R.string.stereoscopy_depth, - R.string.stereoscopy_depth_description, 100, "%", 20)); - sl.add(new IntSliderSetting(Setting.GFX_STEREO_CONVERGENCE_PERCENTAGE, + sl.add(new SingleChoiceSetting(IntSetting.GFX_STEREO_MODE, R.string.stereoscopy_mode, 0, + R.array.stereoscopyEntries, R.array.stereoscopyValues)); + sl.add(new IntSliderSetting(IntSetting.GFX_STEREO_DEPTH, R.string.stereoscopy_depth, + R.string.stereoscopy_depth_description, 100, "%")); + sl.add(new IntSliderSetting(IntSetting.GFX_STEREO_CONVERGENCE_PERCENTAGE, R.string.stereoscopy_convergence, R.string.stereoscopy_convergence_description, 200, - "%", 0)); - sl.add(new CheckBoxSetting(Setting.GFX_STEREO_SWAP_EYES, R.string.stereoscopy_swap_eyes, - R.string.stereoscopy_swap_eyes_description, false)); + "%")); + sl.add(new CheckBoxSetting(BooleanSetting.GFX_STEREO_SWAP_EYES, R.string.stereoscopy_swap_eyes, + R.string.stereoscopy_swap_eyes_description)); } private void addGcPadSubSettings(ArrayList sl, int gcPadNumber, int gcPadType) @@ -702,15 +706,15 @@ public final class SettingsFragmentPresenter } else // Adapter { - LegacySetting rumble = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCADAPTER_RUMBLE + gcPadNumber); - LegacySetting bongo = new LegacySetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCADAPTER_BONGOS + gcPadNumber); + LegacyBooleanSetting rumble = new LegacyBooleanSetting(Settings.FILE_DOLPHIN, + Settings.SECTION_INI_CORE, SettingsFile.KEY_GCADAPTER_RUMBLE + gcPadNumber, false); + LegacyBooleanSetting bongo = new LegacyBooleanSetting(Settings.FILE_DOLPHIN, + Settings.SECTION_INI_CORE, SettingsFile.KEY_GCADAPTER_BONGOS + gcPadNumber, false); sl.add(new CheckBoxSetting(rumble, R.string.gc_adapter_rumble, - R.string.gc_adapter_rumble_description, false)); + R.string.gc_adapter_rumble_description)); sl.add(new CheckBoxSetting(bongo, R.string.gc_adapter_bongos, - R.string.gc_adapter_bongos_description, false)); + R.string.gc_adapter_bongos_description)); } } @@ -720,22 +724,23 @@ public final class SettingsFragmentPresenter // But game game specific extension settings are saved in their own profile. These profiles // do not have any way to specify the controller that is loaded outside of knowing the filename // of the profile that was loaded. - LegacySetting extension; + LegacyStringSetting extension; if (mGameID.isEmpty()) { - extension = new LegacySetting(Settings.FILE_WIIMOTE, - Settings.SECTION_WIIMOTE + (wiimoteNumber - 3), SettingsFile.KEY_WIIMOTE_EXTENSION); + extension = new LegacyStringSetting(Settings.FILE_WIIMOTE, + Settings.SECTION_WIIMOTE + (wiimoteNumber - 3), SettingsFile.KEY_WIIMOTE_EXTENSION, + getExtensionValue(wiimoteNumber - 3)); } else { mSettings.loadWiimoteProfile(mGameID, wiimoteNumber - 4); - extension = new LegacySetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_EXTENSION + (wiimoteNumber - 4)); + extension = new LegacyStringSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_EXTENSION + (wiimoteNumber - 4), + getExtensionValue(wiimoteNumber - 4)); } sl.add(new StringSingleChoiceSetting(extension, R.string.wiimote_extensions, 0, R.array.wiimoteExtensionsEntries, R.array.wiimoteExtensionsValues, - getExtensionValue(wiimoteNumber - 3), MenuTag.getWiimoteExtensionMenuTag(wiimoteNumber))); sl.add(new HeaderSetting(R.string.generic_buttons, 0)); @@ -1166,31 +1171,6 @@ public final class SettingsFragmentPresenter return section.getString(SettingsFile.KEY_WIIMOTE_EXTENSION, "None"); } - public static String getDefaultNANDRootPath() - { - return DirectoryInitialization.getUserDirectory() + "/Wii"; - } - - public static String getDefaultDumpPath() - { - return DirectoryInitialization.getUserDirectory() + "/Dump"; - } - - public static String getDefaultLoadPath() - { - return DirectoryInitialization.getUserDirectory() + "/Load"; - } - - public static String getDefaultResourcePackPath() - { - return DirectoryInitialization.getUserDirectory() + "/ResourcePacks"; - } - - public static String getDefaultSDPath() - { - return DirectoryInitialization.getUserDirectory() + "/Wii/sd.raw"; - } - private static int getLogVerbosityEntries() { // Value obtained from LOG_LEVELS in Common/Logging/Log.h diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java index eeff9cda14..2328f5c0dc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java @@ -16,7 +16,7 @@ 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.BooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class MenuFragment extends Fragment implements View.OnClickListener @@ -84,7 +84,7 @@ public final class MenuFragment extends Fragment implements View.OnClickListener updatePauseUnpauseVisibility(); Settings settings = ((EmulationActivity) getActivity()).getSettings(); - if (Setting.MAIN_ENABLE_SAVESTATES.getBoolean(settings, false)) + if (BooleanSetting.MAIN_ENABLE_SAVESTATES.getBoolean(settings)) { options.findViewById(R.id.menu_quicksave).setVisibility(View.VISIBLE); options.findViewById(R.id.menu_quickload).setVisibility(View.VISIBLE); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java index 7ee178c9b7..87285f5eb3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java @@ -4,7 +4,7 @@ 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.BooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import java.io.File; @@ -83,7 +83,7 @@ public class GameFileCache { Settings settings = new Settings(); settings.loadSettings(null); - boolean recursiveScan = Setting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(settings, false); + boolean recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(settings); removeNonExistentGameFolders(context); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java index bebe91e064..2728bc980a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java @@ -20,7 +20,7 @@ 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.IntSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; @@ -273,7 +273,7 @@ public final class MainActivity extends AppCompatActivity implements MainView Settings settings = new Settings(); settings.loadSettings(null); - Setting.MAIN_LAST_PLATFORM_TAB.setInt(settings, tab.getPosition()); + IntSetting.MAIN_LAST_PLATFORM_TAB.setInt(settings, tab.getPosition()); // Context is set to null to avoid toasts settings.saveSettings(null, null); @@ -282,7 +282,7 @@ public final class MainActivity extends AppCompatActivity implements MainView Settings settings = new Settings(); settings.loadSettings(null); - mViewPager.setCurrentItem(Setting.MAIN_LAST_PLATFORM_TAB.getInt(settings, 0)); + mViewPager.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getInt(settings)); showGames(); GameFileCacheService.startLoad(this); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java index 59e44c7087..8848db4ad7 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java @@ -10,7 +10,7 @@ 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.BooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class Analytics @@ -26,7 +26,7 @@ public class Analytics { Settings settings = new Settings(); settings.loadSettings(null); - if (!Setting.MAIN_ANALYTICS_PERMISSION_ASKED.getBoolean(settings, false)) + if (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.getBoolean(settings)) { showMessage(context, settings); } @@ -51,8 +51,8 @@ public class Analytics private static void firstAnalyticsAdd(Settings settings, boolean enabled) { - Setting.MAIN_ANALYTICS_ENABLED.setBoolean(settings, enabled); - Setting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true); + BooleanSetting.MAIN_ANALYTICS_ENABLED.setBoolean(settings, enabled); + BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.setBoolean(settings, true); // Context is set to null to avoid toasts settings.saveSettings(null, null); diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 0732987a9d..4c7345b8dd 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -241,6 +241,9 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetCacheDire JNIEnv* env, jobject obj, jstring jDirectory); JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_DefaultCPUCore(JNIEnv* env, jobject obj); +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDefaultGraphicsBackendName(JNIEnv* env, + jobject obj); JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetMaxLogLevel(JNIEnv* env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv* env, @@ -425,6 +428,12 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_DefaultCPUCo return static_cast(PowerPC::DefaultCPUCore()); } +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDefaultGraphicsBackendName(JNIEnv* env, jobject obj) +{ + return ToJString(env, VideoBackendBase::GetDefaultBackendName()); +} + JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetMaxLogLevel(JNIEnv* env, jobject obj) { From a538301891312b756828e220e735110d9484a411 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 22 Jul 2020 15:28:26 +0200 Subject: [PATCH 3/8] Android: Hook up global settings to the new config system --- .../settings/model/AdHocBooleanSetting.java | 57 ++++++ .../settings/model/BooleanSetting.java | 28 ++- .../features/settings/model/FloatSetting.java | 28 ++- .../features/settings/model/IntSetting.java | 28 ++- .../features/settings/model/NativeConfig.java | 36 ++++ .../features/settings/model/Settings.java | 17 +- .../settings/model/StringSetting.java | 28 ++- .../model/view/LogCheckBoxSetting.java | 4 +- .../features/settings/ui/SettingsAdapter.java | 4 +- Source/Android/jni/CMakeLists.txt | 1 + Source/Android/jni/NativeConfig.cpp | 163 ++++++++++++++++++ 11 files changed, 373 insertions(+), 21 deletions(-) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java create mode 100644 Source/Android/jni/NativeConfig.cpp diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java new file mode 100644 index 0000000000..b7a06d1419 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java @@ -0,0 +1,57 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class AdHocBooleanSetting extends AbstractLegacySetting implements AbstractBooleanSetting +{ + private final boolean mDefaultValue; + + public AdHocBooleanSetting(String file, String section, String key, boolean defaultValue) + { + super(file, section, key); + mDefaultValue = defaultValue; + + if (!NativeConfig.isSettingSaveable(file, section, key)) + { + throw new IllegalArgumentException("File/section/key is unknown or legacy"); + } + } + + @Override + public boolean delete(Settings settings) + { + if (!settings.isGameSpecific()) + { + return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } + } + + @Override + public boolean getBoolean(Settings settings) + { + if (!settings.isGameSpecific()) + { + return NativeConfig.getBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + } + } + + @Override + public void setBoolean(Settings settings, boolean newValue) + { + if (!settings.isGameSpecific()) + { + NativeConfig.setBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + } + else + { + settings.getSection(mFile, mSection).setBoolean(mKey, newValue); + } + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 0d3f853120..fedfd1144c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -110,18 +110,40 @@ public enum BooleanSetting implements AbstractBooleanSetting @Override public boolean delete(Settings settings) { - return settings.getSection(mFile, mSection).delete(mKey); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } } @Override public boolean getBoolean(Settings settings) { - return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.getBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + } } @Override public void setBoolean(Settings settings, boolean newValue) { - settings.getSection(mFile, mSection).setBoolean(mKey, newValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + NativeConfig.setBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + } + else + { + settings.getSection(mFile, mSection).setBoolean(mKey, newValue); + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java index 2844074da3..c76adcb25d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -23,18 +23,40 @@ public enum FloatSetting implements AbstractFloatSetting @Override public boolean delete(Settings settings) { - return settings.getSection(mFile, mSection).delete(mKey); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } } @Override public float getFloat(Settings settings) { - return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.getFloat(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue); + } } @Override public void setFloat(Settings settings, float newValue) { - settings.getSection(mFile, mSection).setFloat(mKey, newValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + NativeConfig.setFloat(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + } + else + { + settings.getSection(mFile, mSection).setFloat(mKey, newValue); + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index 09ba84f118..c7b89a79d9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -50,18 +50,40 @@ public enum IntSetting implements AbstractIntSetting @Override public boolean delete(Settings settings) { - return settings.getSection(mFile, mSection).delete(mKey); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } } @Override public int getInt(Settings settings) { - return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.getInt(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); + } } @Override public void setInt(Settings settings, int newValue) { - settings.getSection(mFile, mSection).setInt(mKey, newValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + NativeConfig.setInt(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + } + else + { + settings.getSection(mFile, mSection).setInt(mKey, newValue); + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java new file mode 100644 index 0000000000..153e245d94 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java @@ -0,0 +1,36 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public class NativeConfig +{ + public static final int LAYER_BASE_OR_CURRENT = 0; + public static final int LAYER_LOCAL_GAME = 1; + + public static native boolean isSettingSaveable(String file, String section, String key); + + public static native void save(int layer); + + public static native boolean deleteKey(int layer, String file, String section, String key); + + public static native String getString(int layer, String file, String section, String key, + String defaultValue); + + public static native boolean getBoolean(int layer, String file, String section, String key, + boolean defaultValue); + + public static native int getInt(int layer, String file, String section, String key, + int defaultValue); + + public static native float getFloat(int layer, String file, String section, String key, + float defaultValue); + + public static native void setString(int layer, String file, String section, String key, + String value); + + public static native void setBoolean(int layer, String file, String section, String key, + boolean value); + + public static native void setInt(int layer, String file, String section, String key, int value); + + public static native void setFloat(int layer, String file, String section, String key, + float value); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index 94dce9fcd0..5a63a3b654 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -59,7 +59,7 @@ public class Settings private IniFile getGameSpecificFile() { - if (TextUtils.isEmpty(gameId) || mIniFiles.size() != 1) + if (!isGameSpecific() || mIniFiles.size() != 1) throw new IllegalStateException(); return mIniFiles.get(GAME_SETTINGS_PLACEHOLDER_FILE_NAME); @@ -67,7 +67,7 @@ public class Settings public IniFile.Section getSection(String fileName, String sectionName) { - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { return mIniFiles.get(fileName).getOrCreateSection(sectionName); } @@ -78,6 +78,11 @@ public class Settings } } + public boolean isGameSpecific() + { + return !TextUtils.isEmpty(gameId); + } + public boolean isEmpty() { return mIniFiles.isEmpty(); @@ -87,7 +92,7 @@ public class Settings { mIniFiles = new HashMap<>(); - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { loadDolphinSettings(view); } @@ -129,7 +134,7 @@ public class Settings public void saveSettings(SettingsActivityView view, Context context) { - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { if (context != null) Toast.makeText(context, "Saved settings to INI files", Toast.LENGTH_SHORT).show(); @@ -139,6 +144,8 @@ public class Settings SettingsFile.saveFile(entry.getKey(), entry.getValue(), view); } + NativeConfig.save(NativeConfig.LAYER_BASE_OR_CURRENT); + // Notify the native code of the changes NativeLibrary.ReloadConfig(); NativeLibrary.ReloadWiimoteConfig(); @@ -190,7 +197,7 @@ public class Settings // possible to know which lines were added intentionally by the user and which lines were added // unintentionally, which is why we have to delete the whole file in order to fix everything. - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) return false; return getSection(Settings.FILE_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName"); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java index 627be71eda..14bf34221c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -36,18 +36,40 @@ public enum StringSetting implements AbstractStringSetting @Override public boolean delete(Settings settings) { - return settings.getSection(mFile, mSection).delete(mKey); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } } @Override public String getString(Settings settings) { - return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + return NativeConfig.getString(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue); + } } @Override public void setString(Settings settings, String newValue) { - settings.getSection(mFile, mSection).setString(mKey, newValue); + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + { + NativeConfig.setString(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + } + else + { + settings.getSection(mFile, mSection).setString(mKey, newValue); + } } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java index 0f046b40e8..f20be482af 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java @@ -1,6 +1,6 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AdHocBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class LogCheckBoxSetting extends CheckBoxSetting @@ -9,7 +9,7 @@ public class LogCheckBoxSetting extends CheckBoxSetting public LogCheckBoxSetting(String key, int titleId, int descriptionId) { - super(new LegacyBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key, false), + super(new AdHocBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key, false), titleId, descriptionId); mKey = key; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index 5ba48985a0..01ecfd3ffc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.dialogs.MotionAlertDialog; -import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AdHocBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.CheckBoxSetting; @@ -335,7 +335,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter entry : SettingsFragmentPresenter.LOG_TYPE_NAMES.entrySet()) { - new LegacyBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey(), + new AdHocBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey(), false).setBoolean(settings, value); } diff --git a/Source/Android/jni/CMakeLists.txt b/Source/Android/jni/CMakeLists.txt index 4e806c455b..e11e8dde76 100644 --- a/Source/Android/jni/CMakeLists.txt +++ b/Source/Android/jni/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(main SHARED GameList/GameFileCache.cpp IniFile.cpp MainAndroid.cpp + NativeConfig.cpp ) target_link_libraries(main diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/NativeConfig.cpp new file mode 100644 index 0000000000..f499885b7d --- /dev/null +++ b/Source/Android/jni/NativeConfig.cpp @@ -0,0 +1,163 @@ +// Copyright 2020 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include +#include + +#include + +#include "Common/Assert.h" +#include "Common/Config/Config.h" +#include "Core/ConfigLoaders/IsSettingSaveable.h" +#include "jni/AndroidCommon/AndroidCommon.h" + +constexpr jint LAYER_BASE_OR_CURRENT = 0; +constexpr jint LAYER_LOCAL_GAME = 1; + +static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, jstring key) +{ + const std::string decoded_file = GetJString(env, file); + + Config::System system; + if (decoded_file == "Dolphin") + { + system = Config::System::Main; + } + else if (decoded_file == "GFX") + { + system = Config::System::GFX; + } + else if (decoded_file == "Logger") + { + system = Config::System::Logger; + } + else + { + ASSERT(false); + return {}; + } + + return Config::Location{system, GetJString(env, section), GetJString(env, key)}; +} + +static std::shared_ptr GetLayer(jint layer, const Config::Location& location) +{ + switch (layer) + { + case LAYER_BASE_OR_CURRENT: + if (GetActiveLayerForConfig(location) == Config::LayerType::Base) + return Config::GetLayer(Config::LayerType::Base); + else + return Config::GetLayer(Config::LayerType::CurrentRun); + + case LAYER_LOCAL_GAME: + return Config::GetLayer(Config::LayerType::LocalGame); + + default: + ASSERT(false); + return nullptr; + } +} + +template +static T Get(jint layer, const Config::Location& location, T default_value) +{ + return GetLayer(layer, location)->Get(location).value_or(default_value); +} + +template +static void Set(jint layer, const Config::Location& location, T value) +{ + GetLayer(layer, location)->Set(location, value); + Config::InvokeConfigChangedCallbacks(); +} + +#ifdef __cplusplus +extern "C" { +#endif + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isSettingSaveable( + JNIEnv* env, jclass obj, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(ConfigLoaders::IsSettingSaveable(location)); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save( + JNIEnv* env, jclass obj, jint layer) +{ + return GetLayer(layer, {})->Save(); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(GetLayer(layer, location)->DeleteKey(location)); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getString( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, + jstring default_value) +{ + const Config::Location location = GetLocation(env, file, section, key); + return ToJString(env, Get(layer, location, GetJString(env, default_value))); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getBoolean( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, + jboolean default_value) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(Get(layer, location, static_cast(default_value))); +} + +JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getInt( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, + jint default_value) +{ + return Get(layer, GetLocation(env, file, section, key), default_value); +} + +JNIEXPORT jfloat JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getFloat( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, + jfloat default_value) +{ + return Get(layer, GetLocation(env, file, section, key), default_value); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setString( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jstring value) +{ + return Set(layer, GetLocation(env, file, section, key), GetJString(env, value)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setBoolean( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jboolean value) +{ + return Set(layer, GetLocation(env, file, section, key), static_cast(value)); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setInt( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jint value) +{ + return Set(layer, GetLocation(env, file, section, key), value); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setFloat( + JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jfloat value) +{ + return Set(layer, GetLocation(env, file, section, key), value); +} + +#ifdef __cplusplus +} +#endif From e24d50e881128f944fa76f15c7d3fd6f6c43e0d5 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 22 Jul 2020 16:28:08 +0200 Subject: [PATCH 4/8] Android: Hook up game settings to the new config system --- .../activities/EmulationActivity.java | 7 ++++ .../dolphinemu/adapters/GameAdapter.java | 7 ++-- .../dolphinemu/adapters/GameRowPresenter.java | 6 +-- .../dialogs/GamePropertiesDialog.java | 24 +++++++----- .../settings/model/AdHocBooleanSetting.java | 37 +++++-------------- .../settings/model/BooleanSetting.java | 12 +++--- .../features/settings/model/FloatSetting.java | 13 +++---- .../features/settings/model/IntSetting.java | 13 +++---- .../features/settings/model/NativeConfig.java | 4 ++ .../features/settings/model/Settings.java | 36 ++++++++++++++---- .../settings/model/StringSetting.java | 12 +++--- .../settings/ui/SettingsActivity.java | 27 +++++++++++--- .../ui/SettingsActivityPresenter.java | 16 +++++++- .../dolphinemu/model/GameFileCache.java | 9 +++-- .../dolphinemu/ui/main/MainActivity.java | 22 ++++++----- .../dolphinemu/ui/main/TvMainActivity.java | 2 +- .../dolphinemu/utils/Analytics.java | 6 +++ Source/Android/jni/NativeConfig.cpp | 21 +++++++++++ 18 files changed, 178 insertions(+), 96 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index dd66031531..145bf36119 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -363,6 +363,13 @@ public final class EmulationActivity extends AppCompatActivity super.onStop(); } + @Override + protected void onDestroy() + { + super.onDestroy(); + mSettings.close(); + } + @Override public void onBackPressed() { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java index 9fa73b3da1..ff2db6b6a5 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java @@ -156,11 +156,12 @@ public final class GameAdapter extends RecyclerView.Adapter impl return true; } - GamePropertiesDialog fragment = - GamePropertiesDialog - .newInstance(holder.gameFile.getPath(), gameId, holder.gameFile.getPlatform()); + GamePropertiesDialog fragment = GamePropertiesDialog.newInstance(holder.gameFile.getPath(), + gameId, holder.gameFile.getRevision(), holder.gameFile.getPlatform()); + ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction() .add(fragment, GamePropertiesDialog.TAG).commit(); + return true; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java index 44a57337e3..6790f331b2 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java @@ -100,9 +100,9 @@ public final class GameRowPresenter extends Presenter return true; } - GamePropertiesDialog fragment = - GamePropertiesDialog.newInstance(holder.gameFile.getPath(), gameId, - holder.gameFile.getPlatform()); + GamePropertiesDialog fragment = GamePropertiesDialog.newInstance(holder.gameFile.getPath(), + gameId, holder.gameFile.getRevision(), holder.gameFile.getPlatform()); + ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction() .add(fragment, GamePropertiesDialog.TAG).commit(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java index b60713fb8b..15521e6043 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GamePropertiesDialog.java @@ -24,15 +24,18 @@ public class GamePropertiesDialog extends DialogFragment public static final String TAG = "GamePropertiesDialog"; public static final String ARG_PATH = "path"; public static final String ARG_GAMEID = "game_id"; + public static final String ARG_REVISION = "revision"; public static final String ARG_PLATFORM = "platform"; - public static GamePropertiesDialog newInstance(String path, String gameId, int platform) + public static GamePropertiesDialog newInstance(String path, String gameId, int revision, + int platform) { GamePropertiesDialog fragment = new GamePropertiesDialog(); Bundle arguments = new Bundle(); arguments.putString(ARG_PATH, path); arguments.putString(ARG_GAMEID, gameId); + arguments.putInt(ARG_REVISION, revision); arguments.putInt(ARG_PLATFORM, platform); fragment.setArguments(arguments); @@ -48,6 +51,7 @@ public class GamePropertiesDialog extends DialogFragment String path = requireArguments().getString(ARG_PATH); String gameId = requireArguments().getString(ARG_GAMEID); + int revision = requireArguments().getInt(ARG_REVISION); int platform = requireArguments().getInt(ARG_PLATFORM); builder.setTitle(requireContext() @@ -63,26 +67,28 @@ public class GamePropertiesDialog extends DialogFragment .getSupportFragmentManager(), "game_details"); break; case 1: - Settings settings = new Settings(); - settings.loadSettings(null); - StringSetting.MAIN_DEFAULT_ISO.setString(settings, path); - settings.saveSettings(null, getContext()); + try (Settings settings = new Settings()) + { + settings.loadSettings(null); + StringSetting.MAIN_DEFAULT_ISO.setString(settings, path); + settings.saveSettings(null, getContext()); + } break; case 2: - SettingsActivity.launch(getContext(), MenuTag.CONFIG, gameId); + SettingsActivity.launch(getContext(), MenuTag.CONFIG, gameId, revision); break; case 3: - SettingsActivity.launch(getContext(), MenuTag.GRAPHICS, gameId); + SettingsActivity.launch(getContext(), MenuTag.GRAPHICS, gameId, revision); break; case 4: - SettingsActivity.launch(getContext(), MenuTag.GCPAD_TYPE, gameId); + SettingsActivity.launch(getContext(), MenuTag.GCPAD_TYPE, gameId, revision); break; case 5: // Clear option for GC, Wii controls for else if (platform == Platform.GAMECUBE.toInt()) clearGameSettings(gameId); else - SettingsActivity.launch(getActivity(), MenuTag.WIIMOTE, gameId); + SettingsActivity.launch(getActivity(), MenuTag.WIIMOTE, gameId, revision); break; case 6: clearGameSettings(gameId); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java index b7a06d1419..ed14e064fe 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java @@ -1,12 +1,17 @@ package org.dolphinemu.dolphinemu.features.settings.model; -public class AdHocBooleanSetting extends AbstractLegacySetting implements AbstractBooleanSetting +public class AdHocBooleanSetting implements AbstractBooleanSetting { + private final String mFile; + private final String mSection; + private final String mKey; private final boolean mDefaultValue; public AdHocBooleanSetting(String file, String section, String key, boolean defaultValue) { - super(file, section, key); + mFile = file; + mSection = section; + mKey = key; mDefaultValue = defaultValue; if (!NativeConfig.isSettingSaveable(file, section, key)) @@ -18,40 +23,18 @@ public class AdHocBooleanSetting extends AbstractLegacySetting implements Abstra @Override public boolean delete(Settings settings) { - if (!settings.isGameSpecific()) - { - return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); - } - else - { - return settings.getSection(mFile, mSection).delete(mKey); - } + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); } @Override public boolean getBoolean(Settings settings) { - if (!settings.isGameSpecific()) - { - return NativeConfig.getBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, - mDefaultValue); - } - else - { - return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); - } + return NativeConfig.getBoolean(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); } @Override public void setBoolean(Settings settings, boolean newValue) { - if (!settings.isGameSpecific()) - { - NativeConfig.setBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); - } - else - { - settings.getSection(mFile, mSection).setBoolean(mKey, newValue); - } + NativeConfig.setBoolean(settings.getActiveLayer(), mFile, mSection, mKey, newValue); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index fedfd1144c..3a5335cd9b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -110,9 +110,9 @@ public enum BooleanSetting implements AbstractBooleanSetting @Override public boolean delete(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); } else { @@ -123,9 +123,9 @@ public enum BooleanSetting implements AbstractBooleanSetting @Override public boolean getBoolean(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.getBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + return NativeConfig.getBoolean(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); } else @@ -137,9 +137,9 @@ public enum BooleanSetting implements AbstractBooleanSetting @Override public void setBoolean(Settings settings, boolean newValue) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - NativeConfig.setBoolean(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + NativeConfig.setBoolean(settings.getActiveLayer(), mFile, mSection, mKey, newValue); } else { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java index c76adcb25d..a2d50962ce 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -23,9 +23,9 @@ public enum FloatSetting implements AbstractFloatSetting @Override public boolean delete(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); } else { @@ -36,10 +36,9 @@ public enum FloatSetting implements AbstractFloatSetting @Override public float getFloat(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.getFloat(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, - mDefaultValue); + return NativeConfig.getFloat(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); } else { @@ -50,9 +49,9 @@ public enum FloatSetting implements AbstractFloatSetting @Override public void setFloat(Settings settings, float newValue) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - NativeConfig.setFloat(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + NativeConfig.setFloat(settings.getActiveLayer(), mFile, mSection, mKey, newValue); } else { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index c7b89a79d9..12d0a5fb1f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -50,9 +50,9 @@ public enum IntSetting implements AbstractIntSetting @Override public boolean delete(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); } else { @@ -63,10 +63,9 @@ public enum IntSetting implements AbstractIntSetting @Override public int getInt(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.getInt(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, - mDefaultValue); + return NativeConfig.getInt(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); } else { @@ -77,9 +76,9 @@ public enum IntSetting implements AbstractIntSetting @Override public void setInt(Settings settings, int newValue) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - NativeConfig.setInt(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + NativeConfig.setInt(settings.getActiveLayer(), mFile, mSection, mKey, newValue); } else { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java index 153e245d94..78545bbace 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java @@ -7,6 +7,10 @@ public class NativeConfig public static native boolean isSettingSaveable(String file, String section, String key); + public static native void loadGameInis(String gameId, int revision); + + public static native void unloadGameInis(); + public static native void save(int layer); public static native boolean deleteKey(int layer, String file, String section, String key); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index 5a63a3b654..6e414dca8a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -10,10 +10,11 @@ import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile; import org.dolphinemu.dolphinemu.services.GameFileCacheService; import org.dolphinemu.dolphinemu.utils.IniFile; +import java.io.Closeable; import java.util.HashMap; import java.util.Map; -public class Settings +public class Settings implements Closeable { public static final String FILE_DOLPHIN = "Dolphin"; public static final String FILE_GFX = "GFX"; @@ -48,7 +49,8 @@ public class Settings public static final String GAME_SETTINGS_PLACEHOLDER_FILE_NAME = ""; - private String gameId; + private String mGameId; + private int mRevision; private static final String[] configFiles = new String[]{FILE_DOLPHIN, FILE_GFX, FILE_LOGGER, FILE_WIIMOTE}; @@ -80,7 +82,12 @@ public class Settings public boolean isGameSpecific() { - return !TextUtils.isEmpty(gameId); + return !TextUtils.isEmpty(mGameId); + } + + public int getActiveLayer() + { + return isGameSpecific() ? NativeConfig.LAYER_LOCAL_GAME : NativeConfig.LAYER_BASE_OR_CURRENT; } public boolean isEmpty() @@ -98,7 +105,8 @@ public class Settings } else { - loadCustomGameSettings(gameId, view); + NativeConfig.loadGameInis(mGameId, mRevision); + loadCustomGameSettings(mGameId, view); } mLoadedRecursiveIsoPathsValue = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this); @@ -126,9 +134,10 @@ public class Settings SettingsFile.readWiimoteProfile(gameId, getGameSpecificFile(), padId); } - public void loadSettings(String gameId, SettingsActivityView view) + public void loadSettings(String gameId, int revision, SettingsActivityView view) { - this.gameId = gameId; + mGameId = gameId; + mRevision = revision; loadSettings(view); } @@ -163,9 +172,11 @@ public class Settings // custom game settings if (context != null) - Toast.makeText(context, "Saved settings for " + gameId, Toast.LENGTH_SHORT).show(); + Toast.makeText(context, "Saved settings for " + mGameId, Toast.LENGTH_SHORT).show(); - SettingsFile.saveCustomGameSettings(gameId, getGameSpecificFile()); + SettingsFile.saveCustomGameSettings(mGameId, getGameSpecificFile()); + + NativeConfig.save(NativeConfig.LAYER_LOCAL_GAME); } } @@ -202,4 +213,13 @@ public class Settings return getSection(Settings.FILE_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName"); } + + @Override + public void close() + { + if (isGameSpecific()) + { + NativeConfig.unloadGameInis(); + } + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java index 14bf34221c..5862a452bd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -36,9 +36,9 @@ public enum StringSetting implements AbstractStringSetting @Override public boolean delete(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.deleteKey(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey); + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); } else { @@ -49,9 +49,9 @@ public enum StringSetting implements AbstractStringSetting @Override public String getString(Settings settings) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - return NativeConfig.getString(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, + return NativeConfig.getString(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); } else @@ -63,9 +63,9 @@ public enum StringSetting implements AbstractStringSetting @Override public void setString(Settings settings, String newValue) { - if (NativeConfig.isSettingSaveable(mFile, mSection, mKey) && !settings.isGameSpecific()) + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) { - NativeConfig.setString(NativeConfig.LAYER_BASE_OR_CURRENT, mFile, mSection, mKey, newValue); + NativeConfig.setString(settings.getActiveLayer(), mFile, mSection, mKey, newValue); } else { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index 07e2340be9..e043b36f24 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java @@ -26,16 +26,27 @@ public final class SettingsActivity extends AppCompatActivity implements Setting { private static final String ARG_MENU_TAG = "menu_tag"; private static final String ARG_GAME_ID = "game_id"; + private static final String ARG_REVISION = "revision"; private static final String FRAGMENT_TAG = "settings"; private SettingsActivityPresenter mPresenter; private ProgressDialog dialog; - public static void launch(Context context, MenuTag menuTag, String gameId) + public static void launch(Context context, MenuTag menuTag, String gameId, int revision) { Intent settings = new Intent(context, SettingsActivity.class); settings.putExtra(ARG_MENU_TAG, menuTag); settings.putExtra(ARG_GAME_ID, gameId); + settings.putExtra(ARG_REVISION, revision); + context.startActivity(settings); + } + + public static void launch(Context context, MenuTag menuTag) + { + Intent settings = new Intent(context, SettingsActivity.class); + settings.putExtra(ARG_MENU_TAG, menuTag); + settings.putExtra(ARG_GAME_ID, ""); + settings.putExtra(ARG_REVISION, 0); context.startActivity(settings); } @@ -57,10 +68,11 @@ public final class SettingsActivity extends AppCompatActivity implements Setting Intent launcher = getIntent(); String gameID = launcher.getStringExtra(ARG_GAME_ID); + int revision = launcher.getIntExtra(ARG_REVISION, 0); MenuTag menuTag = (MenuTag) launcher.getSerializableExtra(ARG_MENU_TAG); mPresenter = new SettingsActivityPresenter(this, getSettings()); - mPresenter.onCreate(savedInstanceState, menuTag, gameID, getApplicationContext()); + mPresenter.onCreate(savedInstanceState, menuTag, gameID, revision, getApplicationContext()); } @Override @@ -95,17 +107,22 @@ public final class SettingsActivity extends AppCompatActivity implements Setting /** * If this is called, the user has left the settings screen (potentially through the - * home button) and will expect their changes to be persisted. So we kick off an - * IntentService which will do so on a background thread. + * home button) and will expect their changes to be persisted. */ @Override protected void onStop() { super.onStop(); - mPresenter.onStop(isFinishing()); } + @Override + protected void onDestroy() + { + super.onDestroy(); + mPresenter.onDestroy(); + } + @Override public void showSettingsFragment(MenuTag menuTag, Bundle extras, boolean addToStack, String gameID) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java index 6f24bbfc28..c954bfe516 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java @@ -24,6 +24,7 @@ public final class SettingsActivityPresenter private MenuTag menuTag; private String gameId; + private int revision; private Context context; SettingsActivityPresenter(SettingsActivityView view, Settings settings) @@ -32,15 +33,26 @@ public final class SettingsActivityPresenter mSettings = settings; } - public void onCreate(Bundle savedInstanceState, MenuTag menuTag, String gameId, Context context) + public void onCreate(Bundle savedInstanceState, MenuTag menuTag, String gameId, int revision, + Context context) { this.menuTag = menuTag; this.gameId = gameId; + this.revision = revision; this.context = context; mShouldSave = savedInstanceState != null && savedInstanceState.getBoolean(KEY_SHOULD_SAVE); } + public void onDestroy() + { + if (mSettings != null) + { + mSettings.close(); + mSettings = null; + } + } + public void onStart() { prepareDolphinDirectoriesIfNeeded(); @@ -52,7 +64,7 @@ public final class SettingsActivityPresenter { if (!TextUtils.isEmpty(gameId)) { - mSettings.loadSettings(gameId, mView); + mSettings.loadSettings(gameId, revision, mView); if (mSettings.gameIniContainsJunk()) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java index 87285f5eb3..5672553711 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java @@ -81,9 +81,12 @@ public class GameFileCache */ public boolean scanLibrary(Context context) { - Settings settings = new Settings(); - settings.loadSettings(null); - boolean recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(settings); + boolean recursiveScan; + try (Settings settings = new Settings()) + { + settings.loadSettings(null); + recursiveScan = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(settings); + } removeNonExistentGameFolders(context); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java index 2728bc980a..dbe5439669 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java @@ -143,7 +143,7 @@ public final class MainActivity extends AppCompatActivity implements MainView @Override public void launchSettingsActivity(MenuTag menuTag) { - SettingsActivity.launch(this, menuTag, ""); + SettingsActivity.launch(this, menuTag); } @Override @@ -270,19 +270,23 @@ public final class MainActivity extends AppCompatActivity implements MainView { super.onTabSelected(tab); - Settings settings = new Settings(); - settings.loadSettings(null); + try (Settings settings = new Settings()) + { + settings.loadSettings(null); - IntSetting.MAIN_LAST_PLATFORM_TAB.setInt(settings, tab.getPosition()); + IntSetting.MAIN_LAST_PLATFORM_TAB.setInt(settings, tab.getPosition()); - // Context is set to null to avoid toasts - settings.saveSettings(null, null); + // Context is set to null to avoid toasts + settings.saveSettings(null, null); + } } }); - Settings settings = new Settings(); - settings.loadSettings(null); - mViewPager.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getInt(settings)); + try (Settings settings = new Settings()) + { + settings.loadSettings(null); + mViewPager.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getInt(settings)); + } showGames(); GameFileCacheService.startLoad(this); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java index cf75b07c40..ac2ae2d2be 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java @@ -145,7 +145,7 @@ public final class TvMainActivity extends FragmentActivity implements MainView @Override public void launchSettingsActivity(MenuTag menuTag) { - SettingsActivity.launch(this, menuTag, ""); + SettingsActivity.launch(this, menuTag); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java index 8848db4ad7..062f694219 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Analytics.java @@ -30,6 +30,10 @@ public class Analytics { showMessage(context, settings); } + else + { + settings.close(); + } }); } @@ -56,6 +60,8 @@ public class Analytics // Context is set to null to avoid toasts settings.saveSettings(null, null); + + settings.close(); } public static void sendReport(String endpoint, byte[] data) diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/NativeConfig.cpp index f499885b7d..54c927a97e 100644 --- a/Source/Android/jni/NativeConfig.cpp +++ b/Source/Android/jni/NativeConfig.cpp @@ -9,6 +9,7 @@ #include "Common/Assert.h" #include "Common/Config/Config.h" +#include "Core/ConfigLoaders/GameConfigLoader.h" #include "Core/ConfigLoaders/IsSettingSaveable.h" #include "jni/AndroidCommon/AndroidCommon.h" @@ -85,6 +86,26 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isSettingSav return static_cast(ConfigLoaders::IsSettingSaveable(location)); } +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_loadGameInis(JNIEnv* env, + jclass obj, + jstring jGameId, + jint jRevision) +{ + const std::string game_id = GetJString(env, jGameId); + const u16 revision = static_cast(jRevision); + Config::AddLayer(ConfigLoaders::GenerateGlobalGameConfigLoader(game_id, revision)); + Config::AddLayer(ConfigLoaders::GenerateLocalGameConfigLoader(game_id, revision)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_unloadGameInis(JNIEnv* env, + jclass obj) +{ + Config::RemoveLayer(Config::LayerType::GlobalGame); + Config::RemoveLayer(Config::LayerType::LocalGame); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save( JNIEnv* env, jclass obj, jint layer) { From 736505f020a8e1b637a7a84a294b30bde558ebde Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 22 Jul 2020 17:51:02 +0200 Subject: [PATCH 5/8] Android: Show overridden game settings in bold --- .../features/settings/model/AbstractLegacySetting.java | 6 ++++++ .../features/settings/model/AbstractSetting.java | 2 ++ .../features/settings/model/AdHocBooleanSetting.java | 6 ++++++ .../features/settings/model/BooleanSetting.java | 9 +++++++++ .../features/settings/model/FloatSetting.java | 9 +++++++++ .../dolphinemu/features/settings/model/IntSetting.java | 9 +++++++++ .../features/settings/model/NativeConfig.java | 2 ++ .../features/settings/model/StringSetting.java | 9 +++++++++ .../features/settings/model/view/CheckBoxSetting.java | 7 +++++++ .../features/settings/model/view/ConfirmRunnable.java | 8 ++++++++ .../features/settings/model/view/FilePicker.java | 7 +++++++ .../settings/model/view/FloatSliderSetting.java | 7 +++++++ .../features/settings/model/view/HeaderSetting.java | 8 ++++++++ .../settings/model/view/InputBindingSetting.java | 7 +++++++ .../features/settings/model/view/IntSliderSetting.java | 7 +++++++ .../settings/model/view/InvertedCheckBoxSetting.java | 7 +++++++ .../settings/model/view/PercentSliderSetting.java | 7 +++++++ .../settings/model/view/RumbleBindingSetting.java | 7 +++++++ .../features/settings/model/view/SettingsItem.java | 10 ++++++++++ .../settings/model/view/SingleChoiceSetting.java | 7 +++++++ .../view/SingleChoiceSettingDynamicDescriptions.java | 7 +++++++ .../settings/model/view/StringSingleChoiceSetting.java | 7 +++++++ .../features/settings/model/view/SubmenuSetting.java | 7 +++++++ .../settings/ui/SettingsFragmentPresenter.java | 7 +++++++ .../ui/viewholder/CheckBoxSettingViewHolder.java | 4 ++++ .../settings/ui/viewholder/FilePickerViewHolder.java | 4 ++++ .../ui/viewholder/InputBindingSettingViewHolder.java | 4 ++++ .../ui/viewholder/RumbleBindingViewHolder.java | 4 ++++ .../settings/ui/viewholder/SettingViewHolder.java | 8 ++++++++ .../settings/ui/viewholder/SingleChoiceViewHolder.java | 4 ++++ .../settings/ui/viewholder/SliderViewHolder.java | 4 ++++ Source/Android/jni/NativeConfig.cpp | 9 +++++++++ 32 files changed, 210 insertions(+) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java index c10dd237a8..bd766ab58a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java @@ -13,6 +13,12 @@ public class AbstractLegacySetting implements AbstractSetting mKey = key; } + @Override + public boolean isOverridden(Settings settings) + { + return settings.isGameSpecific() && settings.getSection(mFile, mSection).exists(mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java index e24565410b..732c348d98 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java @@ -2,5 +2,7 @@ package org.dolphinemu.dolphinemu.features.settings.model; public interface AbstractSetting { + boolean isOverridden(Settings settings); + boolean delete(Settings settings); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java index ed14e064fe..99db56bf65 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java @@ -20,6 +20,12 @@ public class AdHocBooleanSetting implements AbstractBooleanSetting } } + @Override + public boolean isOverridden(Settings settings) + { + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 3a5335cd9b..2cad72a672 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -107,6 +107,15 @@ public enum BooleanSetting implements AbstractBooleanSetting mDefaultValue = defaultValue; } + @Override + public boolean isOverridden(Settings settings) + { + if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + return settings.getSection(mFile, mSection).exists(mKey); + else + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java index a2d50962ce..c71c2cd1c4 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -20,6 +20,15 @@ public enum FloatSetting implements AbstractFloatSetting mDefaultValue = defaultValue; } + @Override + public boolean isOverridden(Settings settings) + { + if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + return settings.getSection(mFile, mSection).exists(mKey); + else + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index 12d0a5fb1f..df8e00997b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -47,6 +47,15 @@ public enum IntSetting implements AbstractIntSetting mDefaultValue = defaultValue; } + @Override + public boolean isOverridden(Settings settings) + { + if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + return settings.getSection(mFile, mSection).exists(mKey); + else + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java index 78545bbace..51c29f833b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java @@ -13,6 +13,8 @@ public class NativeConfig public static native void save(int layer); + public static native boolean isOverridden(String file, String section, String key); + public static native boolean deleteKey(int layer, String file, String section, String key); public static native String getString(int layer, String file, String section, String key, diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java index 5862a452bd..bfc71bf3df 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -33,6 +33,15 @@ public enum StringSetting implements AbstractStringSetting mDefaultValue = defaultValue; } + @Override + public boolean isOverridden(Settings settings) + { + if (settings.isGameSpecific() && !NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + return settings.getSection(mFile, mSection).exists(mKey); + else + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java index b03ecb4b22..891d5e5346 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class CheckBoxSetting extends SettingsItem @@ -28,4 +29,10 @@ public class CheckBoxSetting extends SettingsItem { return TYPE_CHECKBOX; } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java index b1a17ca96a..f0a1dee5eb 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/ConfirmRunnable.java @@ -1,5 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; + public final class ConfirmRunnable extends SettingsItem { private int mAlertText; @@ -35,4 +37,10 @@ public final class ConfirmRunnable extends SettingsItem { return TYPE_CONFIRM_RUNNABLE; } + + @Override + public AbstractSetting getSetting() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java index 811f552a46..35e974a818 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FilePicker.java @@ -1,5 +1,6 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.AbstractStringSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; @@ -35,4 +36,10 @@ public final class FilePicker extends SettingsItem { return TYPE_FILE_PICKER; } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java index 6e750957d2..7d9df45056 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/FloatSliderSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractFloatSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class FloatSliderSetting extends SliderSetting @@ -23,4 +24,10 @@ public class FloatSliderSetting extends SliderSetting { mSetting.setFloat(settings, selection); } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java index c793f9dac8..3e9a35d694 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/HeaderSetting.java @@ -1,5 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; + public final class HeaderSetting extends SettingsItem { public HeaderSetting(int titleId, int descriptionId) @@ -12,4 +14,10 @@ public final class HeaderSetting extends SettingsItem { return SettingsItem.TYPE_HEADER; } + + @Override + public AbstractSetting getSetting() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java index 706a6ef21d..a31348facb 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java @@ -6,6 +6,7 @@ import android.view.InputDevice; import android.view.KeyEvent; import org.dolphinemu.dolphinemu.DolphinApplication; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public class InputBindingSetting extends SettingsItem @@ -93,4 +94,10 @@ public class InputBindingSetting extends SettingsItem { return mGameId; } + + @Override + public AbstractSetting getSetting() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java index c731286205..9c54346bba 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/IntSliderSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class IntSliderSetting extends SliderSetting @@ -23,4 +24,10 @@ public final class IntSliderSetting extends SliderSetting { mSetting.setInt(settings, selection); } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java index 1cf37aa0f1..c2dc519fbf 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InvertedCheckBoxSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class InvertedCheckBoxSetting extends CheckBoxSetting @@ -22,4 +23,10 @@ public final class InvertedCheckBoxSetting extends CheckBoxSetting { mSetting.setBoolean(settings, !checked); } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java index a0294d4478..e0dbbc29d3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/PercentSliderSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractFloatSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; public final class PercentSliderSetting extends FloatSliderSetting @@ -22,4 +23,10 @@ public final class PercentSliderSetting extends FloatSliderSetting { mSetting.setFloat(settings, selection / 100); } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java index fa0bfb95c5..90e87305a9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java @@ -6,6 +6,7 @@ import android.view.KeyEvent; import org.dolphinemu.dolphinemu.DolphinApplication; import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.utils.Rumble; @@ -55,4 +56,10 @@ public class RumbleBindingSetting extends InputBindingSetting { return TYPE_RUMBLE_BINDING; } + + @Override + public AbstractSetting getSetting() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java index a301f5ec19..f455066a94 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java @@ -1,5 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; +import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; /** @@ -57,4 +59,12 @@ public abstract class SettingsItem * @return An integer (ideally, one of the constants defined in this file) */ public abstract int getType(); + + protected abstract AbstractSetting getSetting(); + + public boolean isOverridden(Settings settings) + { + AbstractSetting setting = getSetting(); + return setting != null && setting.isOverridden(settings); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java index f42343002d..121e83aae0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; @@ -58,4 +59,10 @@ public final class SingleChoiceSetting extends SettingsItem { return TYPE_SINGLE_CHOICE; } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java index d39e463d26..96320aee0e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSettingDynamicDescriptions.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.features.settings.model.AbstractIntSetting; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; @@ -75,4 +76,10 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem { return TYPE_SINGLE_CHOICE_DYNAMIC_DESCRIPTIONS; } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java index d1279aa4fd..e7badc8688 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/StringSingleChoiceSetting.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; import org.dolphinemu.dolphinemu.DolphinApplication; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.AbstractStringSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; @@ -102,6 +103,12 @@ public class StringSingleChoiceSetting extends SettingsItem { return TYPE_STRING_SINGLE_CHOICE; } + + @Override + public AbstractSetting getSetting() + { + return mSetting; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java index 598c0fc9cb..5add7ae5fe 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SubmenuSetting.java @@ -1,5 +1,6 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; public final class SubmenuSetting extends SettingsItem @@ -22,4 +23,10 @@ public final class SubmenuSetting extends SettingsItem { return TYPE_SUBMENU; } + + @Override + public AbstractSetting getSetting() + { + return null; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index e014c85260..d2fa34cee2 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -293,6 +293,13 @@ public final class SettingsFragmentPresenter } } + @Override + public boolean isOverridden(Settings settings) + { + return BooleanSetting.MAIN_DSP_HLE.isOverridden(settings) || + BooleanSetting.MAIN_DSP_JIT.isOverridden(settings); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java index afecec4ebd..2b3c7fe38c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java @@ -59,6 +59,8 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder } mCheckbox.setChecked(mItem.isChecked(getAdapter().getSettings())); + + setStyle(mTextSettingName, mItem); } @Override @@ -67,5 +69,7 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder mCheckbox.toggle(); getAdapter().onBooleanClick(mItem, getAdapterPosition(), mCheckbox.isChecked()); + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java index e887fe4afb..88e5700d51 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java @@ -45,6 +45,8 @@ public final class FilePickerViewHolder extends SettingViewHolder { mTextSettingDescription.setText(mFilePicker.getSelectedValue(getAdapter().getSettings())); } + + setStyle(mTextSettingName, mItem); } @Override @@ -58,5 +60,7 @@ public final class FilePickerViewHolder extends SettingViewHolder { getAdapter().onFilePickerFileClick(mItem); } + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java index 8fcc63d941..5cccd85c49 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java @@ -44,11 +44,15 @@ public final class InputBindingSettingViewHolder extends SettingViewHolder mTextSettingName.setText(mItem.getNameId()); mTextSettingDescription .setText(sharedPreferences.getString(mItem.getKey() + mItem.getGameId(), "")); + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { getAdapter().onInputBindingClick(mItem, getAdapterPosition()); + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java index a5b8d9c944..5f08cc685f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java @@ -44,11 +44,15 @@ public class RumbleBindingViewHolder extends SettingViewHolder mTextSettingName.setText(item.getNameId()); mTextSettingDescription .setText(sharedPreferences.getString(mItem.getKey() + mItem.getGameId(), "")); + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { getAdapter().onInputBindingClick(mItem, getAdapterPosition()); + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java index 5fc91a6136..839e6fa2e1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java @@ -1,6 +1,8 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; +import android.graphics.Typeface; import android.view.View; +import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; @@ -28,6 +30,12 @@ public abstract class SettingViewHolder extends RecyclerView.ViewHolder return mAdapter; } + protected void setStyle(TextView textView, SettingsItem settingsItem) + { + boolean overridden = settingsItem.isOverridden(mAdapter.getSettings()); + textView.setTypeface(null, overridden ? Typeface.BOLD : Typeface.NORMAL); + } + /** * Gets handles to all this ViewHolder's child views using their XML-defined identifiers. * diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java index f0f85a0755..154b858093 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java @@ -80,6 +80,8 @@ public final class SingleChoiceViewHolder extends SettingViewHolder } } } + + setStyle(mTextSettingName, mItem); } @Override @@ -99,5 +101,7 @@ public final class SingleChoiceViewHolder extends SettingViewHolder getAdapter().onSingleChoiceDynamicDescriptionsClick( (SingleChoiceSettingDynamicDescriptions) mItem, position); } + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java index ef359edb72..bde659b07c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java @@ -49,12 +49,16 @@ public final class SliderViewHolder extends SettingViewHolder .getString(R.string.slider_setting_value, mItem.getSelectedValue(getAdapter().getSettings()), mItem.getUnits())); } + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { getAdapter().onSliderClick(mItem, getAdapterPosition()); + + setStyle(mTextSettingName, mItem); } } diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/NativeConfig.cpp index 54c927a97e..3a3a5289c3 100644 --- a/Source/Android/jni/NativeConfig.cpp +++ b/Source/Android/jni/NativeConfig.cpp @@ -112,6 +112,15 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_Na return GetLayer(layer, {})->Save(); } +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isOverridden( + JNIEnv* env, jclass obj, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + const bool result = Config::GetActiveLayerForConfig(location) != Config::LayerType::Base; + return static_cast(result); +} + JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey( JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key) From 9c19309a03b3c4096e8648c99ef48935c03c075c Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 22 Jul 2020 21:59:30 +0200 Subject: [PATCH 6/8] Android: Allow editing settings during emulation --- .../activities/EmulationActivity.java | 15 +++++++++- .../settings/model/AbstractLegacySetting.java | 6 ++++ .../settings/model/AbstractSetting.java | 2 ++ .../settings/model/AdHocBooleanSetting.java | 6 ++++ .../settings/model/BooleanSetting.java | 27 ++++++++++++++++++ .../features/settings/model/FloatSetting.java | 6 ++++ .../features/settings/model/IntSetting.java | 26 +++++++++++++++++ .../features/settings/model/Settings.java | 15 ++++++++-- .../settings/model/StringSetting.java | 23 +++++++++++++++ .../settings/model/view/SettingsItem.java | 10 +++++++ .../ui/SettingsFragmentPresenter.java | 7 +++++ .../viewholder/CheckBoxSettingViewHolder.java | 6 ++++ .../ui/viewholder/FilePickerViewHolder.java | 6 ++++ .../InputBindingSettingViewHolder.java | 6 ++++ .../viewholder/RumbleBindingViewHolder.java | 6 ++++ .../ui/viewholder/SettingViewHolder.java | 14 ++++++++++ .../ui/viewholder/SingleChoiceViewHolder.java | 6 ++++ .../ui/viewholder/SliderViewHolder.java | 6 ++++ .../dolphinemu/fragments/MenuFragment.java | 28 +++++++++++++------ .../main/res/layout/fragment_ingame_menu.xml | 10 +++++++ .../app/src/main/res/values/strings.xml | 1 + 21 files changed, 219 insertions(+), 13 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index 145bf36119..6c70839b40 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -34,6 +34,8 @@ import androidx.fragment.app.FragmentManager; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; 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.fragments.EmulationFragment; import org.dolphinemu.dolphinemu.fragments.MenuFragment; @@ -101,7 +103,8 @@ public final class EmulationActivity extends AppCompatActivity MENU_ACTION_LOAD_SLOT6, MENU_ACTION_EXIT, MENU_ACTION_CHANGE_DISC, MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_SENSITIVITY, MENU_ACTION_CHOOSE_DOUBLETAP, MENU_ACTION_SCREEN_ORIENTATION, MENU_ACTION_MOTION_CONTROLS, MENU_ACTION_PAUSE_EMULATION, - MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS}) + MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS, MENU_ACTION_SETTINGS_CORE, + MENU_ACTION_SETTINGS_GRAPHICS}) public @interface MenuAction { } @@ -140,6 +143,8 @@ public final class EmulationActivity extends AppCompatActivity public static final int MENU_ACTION_PAUSE_EMULATION = 31; public static final int MENU_ACTION_UNPAUSE_EMULATION = 32; public static final int MENU_ACTION_OVERLAY_CONTROLS = 33; + public static final int MENU_ACTION_SETTINGS_CORE = 34; + public static final int MENU_ACTION_SETTINGS_GRAPHICS = 35; private static SparseIntArray buttonsActionsMap = new SparseIntArray(); @@ -648,6 +653,14 @@ public final class EmulationActivity extends AppCompatActivity showMotionControlsOptions(); return; + case MENU_ACTION_SETTINGS_CORE: + SettingsActivity.launch(this, MenuTag.CONFIG); + return; + + case MENU_ACTION_SETTINGS_GRAPHICS: + SettingsActivity.launch(this, MenuTag.GRAPHICS); + return; + case MENU_ACTION_EXIT: mEmulationFragment.stopEmulation(); finish(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java index bd766ab58a..2075a668f0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java @@ -19,6 +19,12 @@ public class AbstractLegacySetting implements AbstractSetting return settings.isGameSpecific() && settings.getSection(mFile, mSection).exists(mKey); } + @Override + public boolean isRuntimeEditable() + { + return false; + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java index 732c348d98..e9ed2443d0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java @@ -4,5 +4,7 @@ public interface AbstractSetting { boolean isOverridden(Settings settings); + boolean isRuntimeEditable(); + boolean delete(Settings settings); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java index 99db56bf65..9eecf8407f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java @@ -26,6 +26,12 @@ public class AdHocBooleanSetting implements AbstractBooleanSetting return NativeConfig.isOverridden(mFile, mSection, mKey); } + @Override + public boolean isRuntimeEditable() + { + return true; + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index 2cad72a672..29269e40d3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -1,5 +1,9 @@ package org.dolphinemu.dolphinemu.features.settings.model; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public enum BooleanSetting implements AbstractBooleanSetting { // These entries have the same names and order as in C++, just for consistency. @@ -94,6 +98,17 @@ public enum BooleanSetting implements AbstractBooleanSetting MAIN_JIT_REGISTER_CACHE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG, "JitRegisterCacheOff", false); + private static final BooleanSetting[] NOT_RUNTIME_EDITABLE_ARRAY = new BooleanSetting[]{ + MAIN_DSP_HLE, + MAIN_CPU_THREAD, + MAIN_OVERRIDE_REGION_SETTINGS, + MAIN_WII_SD_CARD, // Can actually be changed, but specific code is required + MAIN_DSP_JIT + }; + + private static final Set NOT_RUNTIME_EDITABLE = + new HashSet<>(Arrays.asList(NOT_RUNTIME_EDITABLE_ARRAY)); + private final String mFile; private final String mSection; private final String mKey; @@ -116,6 +131,18 @@ public enum BooleanSetting implements AbstractBooleanSetting return NativeConfig.isOverridden(mFile, mSection, mKey); } + @Override + public boolean isRuntimeEditable() + { + for (BooleanSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java index c71c2cd1c4..8dc2e2841f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -29,6 +29,12 @@ public enum FloatSetting implements AbstractFloatSetting return NativeConfig.isOverridden(mFile, mSection, mKey); } + @Override + public boolean isRuntimeEditable() + { + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index df8e00997b..7fc265d38f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -2,6 +2,10 @@ package org.dolphinemu.dolphinemu.features.settings.model; import org.dolphinemu.dolphinemu.NativeLibrary; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public enum IntSetting implements AbstractIntSetting { // These entries have the same names and order as in C++, just for consistency. @@ -34,6 +38,16 @@ public enum IntSetting implements AbstractIntSetting LOGGER_VERBOSITY(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "Verbosity", 1); + private static final IntSetting[] NOT_RUNTIME_EDITABLE_ARRAY = new IntSetting[]{ + MAIN_CPU_CORE, + MAIN_GC_LANGUAGE, + MAIN_SLOT_A, // Can actually be changed, but specific code is required + MAIN_SLOT_B, // Can actually be changed, but specific code is required + }; + + private static final Set NOT_RUNTIME_EDITABLE = + new HashSet<>(Arrays.asList(NOT_RUNTIME_EDITABLE_ARRAY)); + private final String mFile; private final String mSection; private final String mKey; @@ -56,6 +70,18 @@ public enum IntSetting implements AbstractIntSetting return NativeConfig.isOverridden(mFile, mSection, mKey); } + @Override + public boolean isRuntimeEditable() + { + for (IntSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index 6e414dca8a..5d650371c4 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -105,6 +105,10 @@ public class Settings implements Closeable } else { + // Loading game INIs while the core is running will mess with the game INIs loaded by the core + if (NativeLibrary.IsRunning()) + throw new IllegalStateException("Attempted to load game INI while emulating"); + NativeConfig.loadGameInis(mGameId, mRevision); loadCustomGameSettings(mGameId, view); } @@ -155,9 +159,14 @@ public class Settings implements Closeable NativeConfig.save(NativeConfig.LAYER_BASE_OR_CURRENT); - // Notify the native code of the changes - NativeLibrary.ReloadConfig(); - NativeLibrary.ReloadWiimoteConfig(); + if (!NativeLibrary.IsRunning()) + { + // Notify the native code of the changes to legacy settings + NativeLibrary.ReloadConfig(); + NativeLibrary.ReloadWiimoteConfig(); + } + + // LogManager does use the new config system, but doesn't pick up on changes automatically NativeLibrary.ReloadLoggerConfig(); NativeLibrary.UpdateGCAdapterScanThread(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java index bfc71bf3df..272e2b02cd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -2,6 +2,10 @@ package org.dolphinemu.dolphinemu.features.settings.model; import org.dolphinemu.dolphinemu.NativeLibrary; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public enum StringSetting implements AbstractStringSetting { // These entries have the same names and order as in C++, just for consistency. @@ -20,6 +24,13 @@ public enum StringSetting implements AbstractStringSetting GFX_ENHANCE_POST_SHADER(Settings.FILE_GFX, Settings.SECTION_GFX_ENHANCEMENTS, "PostProcessingShader", ""); + private static final StringSetting[] NOT_RUNTIME_EDITABLE_ARRAY = new StringSetting[]{ + MAIN_GFX_BACKEND, + }; + + private static final Set NOT_RUNTIME_EDITABLE = + new HashSet<>(Arrays.asList(NOT_RUNTIME_EDITABLE_ARRAY)); + private final String mFile; private final String mSection; private final String mKey; @@ -42,6 +53,18 @@ public enum StringSetting implements AbstractStringSetting return NativeConfig.isOverridden(mFile, mSection, mKey); } + @Override + public boolean isRuntimeEditable() + { + for (StringSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java index f455066a94..2e154d69d3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java @@ -1,5 +1,6 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; @@ -67,4 +68,13 @@ public abstract class SettingsItem AbstractSetting setting = getSetting(); return setting != null && setting.isOverridden(settings); } + + public boolean isEditable() + { + if (!NativeLibrary.IsRunning()) + return true; + + AbstractSetting setting = getSetting(); + return setting != null && setting.isRuntimeEditable(); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index d2fa34cee2..ceb8cc577e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -300,6 +300,13 @@ public final class SettingsFragmentPresenter BooleanSetting.MAIN_DSP_JIT.isOverridden(settings); } + @Override + public boolean isRuntimeEditable() + { + return BooleanSetting.MAIN_DSP_HLE.isRuntimeEditable() && + BooleanSetting.MAIN_DSP_JIT.isRuntimeEditable(); + } + @Override public boolean delete(Settings settings) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java index 2b3c7fe38c..07206a04fa 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java @@ -66,6 +66,12 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + mCheckbox.toggle(); getAdapter().onBooleanClick(mItem, getAdapterPosition(), mCheckbox.isChecked()); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java index 88e5700d51..67266d8c64 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/FilePickerViewHolder.java @@ -52,6 +52,12 @@ public final class FilePickerViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + if (mFilePicker.getRequestType() == MainPresenter.REQUEST_DIRECTORY) { getAdapter().onFilePickerDirectoryClick(mItem); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java index 5cccd85c49..7dda7b3630 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java @@ -51,6 +51,12 @@ public final class InputBindingSettingViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + getAdapter().onInputBindingClick(mItem, getAdapterPosition()); setStyle(mTextSettingName, mItem); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java index 5f08cc685f..3968e0c078 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/RumbleBindingViewHolder.java @@ -51,6 +51,12 @@ public class RumbleBindingViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + getAdapter().onInputBindingClick(mItem, getAdapterPosition()); setStyle(mTextSettingName, mItem); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java index 839e6fa2e1..c23a3a270b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SettingViewHolder.java @@ -1,11 +1,16 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; + +import android.graphics.Paint; import android.graphics.Typeface; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import androidx.recyclerview.widget.RecyclerView; +import org.dolphinemu.dolphinemu.DolphinApplication; +import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; @@ -34,6 +39,15 @@ public abstract class SettingViewHolder extends RecyclerView.ViewHolder { boolean overridden = settingsItem.isOverridden(mAdapter.getSettings()); textView.setTypeface(null, overridden ? Typeface.BOLD : Typeface.NORMAL); + + if (!settingsItem.isEditable()) + textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } + + protected static void showNotRuntimeEditableError() + { + Toast.makeText(DolphinApplication.getAppContext(), R.string.setting_not_runtime_editable, + Toast.LENGTH_SHORT).show(); } /** diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java index 154b858093..a8f869cba9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SingleChoiceViewHolder.java @@ -87,6 +87,12 @@ public final class SingleChoiceViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + int position = getAdapterPosition(); if (mItem instanceof SingleChoiceSetting) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java index bde659b07c..6a7d9a0fa3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/SliderViewHolder.java @@ -56,6 +56,12 @@ public final class SliderViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + getAdapter().onSliderClick(mItem, getAdapterPosition()); setStyle(mTextSettingName, mItem); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java index 2328f5c0dc..f468240c4d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java @@ -50,6 +50,9 @@ public final class MenuFragment extends Fragment implements View.OnClickListener .append(R.id.menu_screen_orientation, EmulationActivity.MENU_ACTION_SCREEN_ORIENTATION); buttonsActionsMap.append(R.id.menu_change_disc, EmulationActivity.MENU_ACTION_CHANGE_DISC); buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT); + buttonsActionsMap.append(R.id.menu_settings_core, EmulationActivity.MENU_ACTION_SETTINGS_CORE); + buttonsActionsMap.append(R.id.menu_settings_graphics, + EmulationActivity.MENU_ACTION_SETTINGS_GRAPHICS); } public static MenuFragment newInstance(String title) @@ -83,15 +86,6 @@ public final class MenuFragment extends Fragment implements View.OnClickListener updatePauseUnpauseVisibility(); - Settings settings = ((EmulationActivity) getActivity()).getSettings(); - if (BooleanSetting.MAIN_ENABLE_SAVESTATES.getBoolean(settings)) - { - options.findViewById(R.id.menu_quicksave).setVisibility(View.VISIBLE); - options.findViewById(R.id.menu_quickload).setVisibility(View.VISIBLE); - options.findViewById(R.id.menu_emulation_save_root).setVisibility(View.VISIBLE); - options.findViewById(R.id.menu_emulation_load_root).setVisibility(View.VISIBLE); - } - PackageManager packageManager = requireActivity().getPackageManager(); if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) @@ -146,6 +140,22 @@ public final class MenuFragment extends Fragment implements View.OnClickListener return rootView; } + @Override + public void onResume() + { + super.onResume(); + + LinearLayout options = requireView().findViewById(R.id.layout_options); + + Settings settings = ((EmulationActivity) requireActivity()).getSettings(); + boolean savestatesEnabled = BooleanSetting.MAIN_ENABLE_SAVESTATES.getBoolean(settings); + int savestateVisibility = savestatesEnabled ? View.VISIBLE : View.GONE; + options.findViewById(R.id.menu_quicksave).setVisibility(savestateVisibility); + options.findViewById(R.id.menu_quickload).setVisibility(savestateVisibility); + options.findViewById(R.id.menu_emulation_save_root).setVisibility(savestateVisibility); + options.findViewById(R.id.menu_emulation_load_root).setVisibility(savestateVisibility); + } + private void updatePauseUnpauseVisibility() { boolean paused = EmulationActivity.getHasUserPausedEmulation(); diff --git a/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml b/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml index 54295f0eac..e97ae923d7 100644 --- a/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml +++ b/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml @@ -30,6 +30,16 @@ android:layout_height="wrap_content" android:orientation="vertical"> +