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 2e5430d9ee..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(); @@ -363,6 +368,13 @@ public final class EmulationActivity extends AppCompatActivity super.onStop(); } + @Override + protected void onDestroy() + { + super.onDestroy(); + mSettings.close(); + } + @Override public void onBackPressed() { @@ -641,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(); @@ -855,7 +875,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 +909,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/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 ec50ac2854..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 @@ -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.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.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; @@ -26,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); @@ -50,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() @@ -65,30 +67,28 @@ 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(); + 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/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..2075a668f0 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractLegacySetting.java @@ -0,0 +1,33 @@ +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 isOverridden(Settings settings) + { + return settings.isGameSpecific() && settings.getSection(mFile, mSection).exists(mKey); + } + + @Override + public boolean isRuntimeEditable() + { + return false; + } + + @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/AbstractSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java new file mode 100644 index 0000000000..e9ed2443d0 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AbstractSetting.java @@ -0,0 +1,10 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +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/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/AdHocBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java new file mode 100644 index 0000000000..9eecf8407f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/AdHocBooleanSetting.java @@ -0,0 +1,52 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +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) + { + mFile = file; + mSection = section; + mKey = key; + mDefaultValue = defaultValue; + + if (!NativeConfig.isSettingSaveable(file, section, key)) + { + throw new IllegalArgumentException("File/section/key is unknown or legacy"); + } + } + + @Override + public boolean isOverridden(Settings settings) + { + return NativeConfig.isOverridden(mFile, mSection, mKey); + } + + @Override + public boolean isRuntimeEditable() + { + return true; + } + + @Override + public boolean delete(Settings settings) + { + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); + } + + @Override + public boolean getBoolean(Settings settings) + { + return NativeConfig.getBoolean(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); + } + + @Override + public void setBoolean(Settings settings, boolean 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 new file mode 100644 index 0000000000..29269e40d3 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -0,0 +1,185 @@ +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. + + 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 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; + private final boolean mDefaultValue; + + BooleanSetting(String file, String section, String key, boolean defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + 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 isRuntimeEditable() + { + for (BooleanSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + + @Override + public boolean delete(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } + } + + @Override + public boolean getBoolean(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.getBoolean(settings.getActiveLayer(), mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); + } + } + + @Override + public void setBoolean(Settings settings, boolean newValue) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + NativeConfig.setBoolean(settings.getActiveLayer(), 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 new file mode 100644 index 0000000000..8dc2e2841f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/FloatSetting.java @@ -0,0 +1,76 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +public enum FloatSetting implements AbstractFloatSetting +{ + // These entries have the same names and order as in C++, just for consistency. + + 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 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 isRuntimeEditable() + { + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + + @Override + public boolean delete(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } + } + + @Override + public float getFloat(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.getFloat(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getFloat(mKey, mDefaultValue); + } + } + + @Override + public void setFloat(Settings settings, float newValue) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + NativeConfig.setFloat(settings.getActiveLayer(), 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 new file mode 100644 index 0000000000..7fc265d38f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -0,0 +1,123 @@ +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. + + 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 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; + private final int mDefaultValue; + + IntSetting(String file, String section, String key, int defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + 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 isRuntimeEditable() + { + for (IntSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + + @Override + public boolean delete(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } + } + + @Override + public int getInt(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.getInt(settings.getActiveLayer(), mFile, mSection, mKey, mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); + } + } + + @Override + public void setInt(Settings settings, int newValue) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + NativeConfig.setInt(settings.getActiveLayer(), 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/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/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/NativeConfig.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java new file mode 100644 index 0000000000..51c29f833b --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/NativeConfig.java @@ -0,0 +1,42 @@ +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 loadGameInis(String gameId, int revision); + + public static native void unloadGameInis(); + + 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, + 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 c676d68a34..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 @@ -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,18 @@ 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.io.Closeable; import java.util.HashMap; import java.util.Map; -import java.util.Set; -public class Settings +public class Settings implements Closeable { + 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,25 +45,23 @@ 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 String mGameId; + private int mRevision; - 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) + if (!isGameSpecific() || mIniFiles.size() != 1) throw new IllegalStateException(); return mIniFiles.get(GAME_SETTINGS_PLACEHOLDER_FILE_NAME); @@ -65,7 +69,7 @@ public class Settings public IniFile.Section getSection(String fileName, String sectionName) { - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { return mIniFiles.get(fileName).getOrCreateSection(sectionName); } @@ -76,6 +80,16 @@ public class Settings } } + public boolean isGameSpecific() + { + return !TextUtils.isEmpty(mGameId); + } + + public int getActiveLayer() + { + return isGameSpecific() ? NativeConfig.LAYER_LOCAL_GAME : NativeConfig.LAYER_BASE_OR_CURRENT; + } + public boolean isEmpty() { return mIniFiles.isEmpty(); @@ -85,14 +99,21 @@ public class Settings { mIniFiles = new HashMap<>(); - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { loadDolphinSettings(view); } else { - loadCustomGameSettings(gameId, view); + // 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); } + + mLoadedRecursiveIsoPathsValue = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this); } private void loadDolphinSettings(SettingsActivityView view) @@ -117,69 +138,54 @@ 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); } - public void saveSettings(SettingsActivityView view, Context context, Set modifiedSettings) + public void saveSettings(SettingsActivityView view, Context context) { - if (TextUtils.isEmpty(gameId)) + if (!isGameSpecific()) { - 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)) + NativeConfig.save(NativeConfig.LAYER_BASE_OR_CURRENT); + + if (!NativeLibrary.IsRunning()) { - 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 to legacy settings + NativeLibrary.ReloadConfig(); + NativeLibrary.ReloadWiimoteConfig(); } - // Notify the native code of the changes - NativeLibrary.ReloadConfig(); - NativeLibrary.ReloadWiimoteConfig(); + // LogManager does use the new config system, but doesn't pick up on changes automatically NativeLibrary.ReloadLoggerConfig(); NativeLibrary.UpdateGCAdapterScanThread(); - if (modifiedSettings.contains(SettingsFile.KEY_RECURSIVE_ISO_PATHS)) + if (mLoadedRecursiveIsoPathsValue != BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this)) { // Refresh game library GameFileCacheService.startRescan(context); } - - modifiedSettings.clear(); } else { // custom game settings - view.showToastMessage("Saved settings for " + gameId); - SettingsFile.saveCustomGameSettings(gameId, getGameSpecificFile()); + + if (context != null) + Toast.makeText(context, "Saved settings for " + mGameId, Toast.LENGTH_SHORT).show(); + + SettingsFile.saveCustomGameSettings(mGameId, getGameSpecificFile()); + + NativeConfig.save(NativeConfig.LAYER_LOCAL_GAME); } } @@ -211,9 +217,18 @@ 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(SettingsFile.FILE_NAME_DOLPHIN, SECTION_INI_INTERFACE).exists("ThemeName"); + 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 new file mode 100644 index 0000000000..272e2b02cd --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/StringSetting.java @@ -0,0 +1,107 @@ +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. + + 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 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; + private final String mDefaultValue; + + StringSetting(String file, String section, String key, String defaultValue) + { + mFile = file; + mSection = section; + mKey = key; + 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 isRuntimeEditable() + { + for (StringSetting setting : NOT_RUNTIME_EDITABLE) + { + if (setting == this) + return false; + } + + return NativeConfig.isSettingSaveable(mFile, mSection, mKey); + } + + @Override + public boolean delete(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.deleteKey(settings.getActiveLayer(), mFile, mSection, mKey); + } + else + { + return settings.getSection(mFile, mSection).delete(mKey); + } + } + + @Override + public String getString(Settings settings) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + return NativeConfig.getString(settings.getActiveLayer(), mFile, mSection, mKey, + mDefaultValue); + } + else + { + return settings.getSection(mFile, mSection).getString(mKey, mDefaultValue); + } + } + + @Override + public void setString(Settings settings, String newValue) + { + if (NativeConfig.isSettingSaveable(mFile, mSection, mKey)) + { + NativeConfig.setString(settings.getActiveLayer(), 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/CheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/CheckBoxSetting.java index 8e03ac038c..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,26 +1,27 @@ 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 { - protected boolean mDefaultValue; + protected AbstractBooleanSetting mSetting; - public CheckBoxSetting(String file, String section, String key, int titleId, int descriptionId, - boolean defaultValue) + public CheckBoxSetting(AbstractBooleanSetting setting, int titleId, int descriptionId) { - super(file, section, key, titleId, descriptionId); - mDefaultValue = defaultValue; + super(titleId, descriptionId); + mSetting = setting; } public boolean isChecked(Settings settings) { - return settings.getSection(getFile(), getSection()).getBoolean(getKey(), mDefaultValue); + return mSetting.getBoolean(settings); } public void setChecked(Settings settings, boolean checked) { - settings.getSection(getFile(), getSection()).setBoolean(getKey(), checked); + mSetting.setBoolean(settings, checked); } @Override @@ -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 4950778b64..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; @@ -9,7 +11,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; @@ -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 8a6890d019..a198556574 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,34 @@ 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; +import androidx.annotation.Nullable; + public final class FilePicker extends SettingsItem { - private String mDefaultValue; + private AbstractStringSetting mSetting; private int mRequestType; + private String mDefaultPathRelativeToUserDirectory; - public FilePicker(String file, String section, String key, int titleId, int descriptionId, - String defaultVault, int requestType) + public FilePicker(AbstractStringSetting setting, int titleId, int descriptionId, int requestType, + @Nullable String defaultPathRelativeToUserDirectory) { - super(file, section, key, titleId, descriptionId); - mDefaultValue = defaultVault; + super(titleId, descriptionId); + mSetting = setting; mRequestType = requestType; + mDefaultPathRelativeToUserDirectory = defaultPathRelativeToUserDirectory; } public String getSelectedValue(Settings settings) { - return settings.getSection(getFile(), getSection()).getString(getKey(), mDefaultValue); + return mSetting.getString(settings); } public void setSelectedValue(Settings settings, String selection) { - settings.getSection(getFile(), getSection()).setString(getKey(), selection); + mSetting.setString(settings, selection); } public int getRequestType() @@ -30,9 +36,21 @@ public final class FilePicker extends SettingsItem return mRequestType; } + @Nullable + public String getDefaultPathRelativeToUserDirectory() + { + return mDefaultPathRelativeToUserDirectory; + } + @Override public int getType() { 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 06c27989de..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,26 +1,33 @@ 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 { - protected float mDefaultValue; + protected AbstractFloatSetting mSetting; - public FloatSliderSetting(String file, String section, String key, int titleId, int descriptionId, - int max, String units, float defaultValue) + public FloatSliderSetting(AbstractFloatSetting setting, int titleId, int descriptionId, int max, + String units) { - super(file, section, key, titleId, descriptionId, max, units); - mDefaultValue = defaultValue; + super(titleId, descriptionId, max, units); + mSetting = setting; } public int getSelectedValue(Settings settings) { - float value = settings.getSection(getFile(), getSection()).getFloat(getKey(), mDefaultValue); - return Math.round(value); + return Math.round(mSetting.getFloat(settings)); } public void setSelectedValue(Settings settings, float selection) { - settings.getSection(getFile(), getSection()).setFloat(getKey(), selection); + 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 7948d5e67a..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,10 +1,12 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; +import org.dolphinemu.dolphinemu.features.settings.model.AbstractSetting; + 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 @@ -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 d1941ab5d0..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,21 +6,34 @@ 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 { - 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 +73,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 +92,12 @@ public class InputBindingSetting extends SettingsItem public String getGameId() { - return gameId; + 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 3455c1dd4a..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,25 +1,33 @@ 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 { - private int mDefaultValue; + private AbstractIntSetting mSetting; - public IntSliderSetting(String file, String section, String key, int titleId, int descriptionId, - int max, String units, int defaultValue) + public IntSliderSetting(AbstractIntSetting setting, int titleId, int descriptionId, int max, + String units) { - super(file, section, key, titleId, descriptionId, max, units); - mDefaultValue = defaultValue; + super(titleId, descriptionId, max, units); + mSetting = setting; } public int getSelectedValue(Settings settings) { - return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue); + return mSetting.getInt(settings); } public void setSelectedValue(Settings settings, int selection) { - settings.getSection(getFile(), getSection()).setInt(getKey(), selection); + 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 8381843e43..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,24 +1,32 @@ 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 { - public InvertedCheckBoxSetting(String file, String section, String key, int titleId, - int descriptionId, boolean defaultValue) + public InvertedCheckBoxSetting(AbstractBooleanSetting setting, int titleId, + int descriptionId) { - super(file, section, key, titleId, descriptionId, !defaultValue); + super(setting, titleId, descriptionId); } @Override public boolean isChecked(Settings settings) { - return !settings.getSection(getFile(), getSection()).getBoolean(getKey(), mDefaultValue); + return !mSetting.getBoolean(settings); } @Override public void setChecked(Settings settings, boolean checked) { - settings.getSection(getFile(), getSection()).setBoolean(getKey(), !checked); + 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/LogCheckBoxSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java new file mode 100644 index 0000000000..f20be482af --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/LogCheckBoxSetting.java @@ -0,0 +1,21 @@ +package org.dolphinemu.dolphinemu.features.settings.model.view; + +import org.dolphinemu.dolphinemu.features.settings.model.AdHocBooleanSetting; +import org.dolphinemu.dolphinemu.features.settings.model.Settings; + +public class LogCheckBoxSetting extends CheckBoxSetting +{ + String mKey; + + public LogCheckBoxSetting(String key, int titleId, int descriptionId) + { + super(new AdHocBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, key, false), + titleId, descriptionId); + 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..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,25 +1,32 @@ 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 { - public PercentSliderSetting(String file, String section, String key, int titleId, - int descriptionId, int max, String units, float defaultValue) + public PercentSliderSetting(AbstractFloatSetting setting, int titleId, int descriptionId, int max, + String units) { - super(file, section, key, titleId, descriptionId, max, units, defaultValue / 100); + super(setting, titleId, descriptionId, max, units); } @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) * 100); } @Override public void setSelectedValue(Settings settings, float selection) { - settings.getSection(getFile(), getSection()).setFloat(getKey(), selection / 100); + 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 0a50a33f31..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,8 @@ 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; /** @@ -21,56 +24,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. */ @@ -91,4 +60,21 @@ 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); + } + + 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/model/view/SingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SingleChoiceSetting.java index f3a0b3cf7b..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,30 +1,32 @@ 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; public final class SingleChoiceSetting extends SettingsItem { - private int mDefaultValue; + private AbstractIntSetting mSetting; 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(AbstractIntSetting setting, int titleId, int descriptionId, + int choicesId, int valuesId, MenuTag menuTag) { - super(file, section, key, titleId, descriptionId); + super(titleId, descriptionId); + mSetting = setting; 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(AbstractIntSetting setting, int titleId, int descriptionId, + int choicesId, int valuesId) { - this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } public int getChoicesId() @@ -39,7 +41,7 @@ public final class SingleChoiceSetting extends SettingsItem public int getSelectedValue(Settings settings) { - return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue); + return mSetting.getInt(settings); } public MenuTag getMenuTag() @@ -49,7 +51,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 @@ -57,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 a3135569b7..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,11 +1,13 @@ 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; public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem { - private int mDefaultValue; + private AbstractIntSetting mSetting; private int mChoicesId; private int mValuesId; @@ -13,25 +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(AbstractIntSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId, int descriptionChoicesId, + int descriptionValuesId, MenuTag menuTag) { - super(file, section, key, titleId, descriptionId); + super(titleId, descriptionId); + mSetting = setting; 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(AbstractIntSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId, int descriptionChoicesId, + int descriptionValuesId) { - this(file, section, key, titleId, descriptionId, choicesId, valuesId, descriptionChoicesId, - descriptionValuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, descriptionChoicesId, + descriptionValuesId, null); } public int getChoicesId() @@ -56,7 +58,7 @@ public final class SingleChoiceSettingDynamicDescriptions extends SettingsItem public int getSelectedValue(Settings settings) { - return settings.getSection(getFile(), getSection()).getInt(getKey(), mDefaultValue); + return mSetting.getInt(settings); } public MenuTag getMenuTag() @@ -66,7 +68,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 @@ -74,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/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..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,48 +1,49 @@ 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; public class StringSingleChoiceSetting extends SettingsItem { - private String mDefaultValue; + private AbstractStringSetting mSetting; private String[] mChoicesId; private String[] mValuesId; private MenuTag mMenuTag; - public StringSingleChoiceSetting(String file, String section, String key, 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(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, - int descriptionId, String[] choicesId, String[] valuesId, String defaultValue) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, String[] choicesId, String[] valuesId) { - this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } - public StringSingleChoiceSetting(String file, String section, String key, 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(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, - int descriptionId, int choicesId, int valuesId, String defaultValue) + public StringSingleChoiceSetting(AbstractStringSetting setting, int titleId, + int descriptionId, int choicesId, int valuesId) { - this(file, section, key, titleId, descriptionId, choicesId, valuesId, defaultValue, null); + this(setting, titleId, descriptionId, choicesId, valuesId, null); } public String[] getChoicesId() @@ -70,7 +71,7 @@ public class StringSingleChoiceSetting extends SettingsItem public String getSelectedValue(Settings settings) { - return settings.getSection(getFile(), getSection()).getString(getKey(), mDefaultValue); + return mSetting.getString(settings); } public int getSelectValueIndex(Settings settings) @@ -94,7 +95,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 @@ -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 fd6f9dd346..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,14 +1,15 @@ 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 { 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; } @@ -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/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index e4575b9b14..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) @@ -224,9 +241,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..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 @@ -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"; @@ -27,25 +24,35 @@ public final class SettingsActivityPresenter private MenuTag menuTag; private String gameId; + private int revision; private Context context; - private final Set modifiedSettings = new HashSet<>(); - SettingsActivityPresenter(SettingsActivityView view, Settings settings) { mView = view; 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(); @@ -57,7 +64,7 @@ public final class SettingsActivityPresenter { if (!TextUtils.isEmpty(gameId)) { - mSettings.loadSettings(gameId, mView); + mSettings.loadSettings(gameId, revision, mView); if (mSettings.gameIniContainsJunk()) { @@ -98,7 +105,7 @@ public final class SettingsActivityPresenter public void clearSettings() { mSettings.clearSettings(); - onSettingChanged(null); + onSettingChanged(); } public void onStop(boolean finishing) @@ -112,7 +119,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 +134,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..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,9 @@ import androidx.recyclerview.widget.RecyclerView; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.dialogs.MotionAlertDialog; +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; import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker; import org.dolphinemu.dolphinemu.features.settings.model.view.FloatSliderSetting; @@ -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 AdHocBooleanSetting(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_LOGS, entry.getKey(), + false).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, - 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(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_INTERFACE, - SettingsFile.KEY_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, - 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) { + final int DSP_HLE = 0; + final int DSP_LLE_RECOMPILER = 1; + final int DSP_LLE_INTERPRETER = 2; + + AbstractIntSetting dspEmulationEngine = new AbstractIntSetting() + { + @Override + public int getInt(Settings settings) + { + if (BooleanSetting.MAIN_DSP_HLE.getBoolean(settings)) + { + return DSP_HLE; + } + else + { + boolean jit = BooleanSetting.MAIN_DSP_JIT.getBoolean(settings); + return jit ? DSP_LLE_RECOMPILER : DSP_LLE_INTERPRETER; + } + } + + @Override + public void setInt(Settings settings, int newValue) + { + switch (newValue) + { + case DSP_HLE: + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, true); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, true); + break; + + case DSP_LLE_RECOMPILER: + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, false); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, true); + break; + + case DSP_LLE_INTERPRETER: + BooleanSetting.MAIN_DSP_HLE.setBoolean(settings, false); + BooleanSetting.MAIN_DSP_JIT.setBoolean(settings, false); + break; + } + } + + @Override + public boolean isOverridden(Settings settings) + { + return BooleanSetting.MAIN_DSP_HLE.isOverridden(settings) || + 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) + { + // Not short circuiting + return BooleanSetting.MAIN_DSP_HLE.delete(settings) & + BooleanSetting.MAIN_DSP_JIT.delete(settings); + } + }; + // TODO: Exclude values from arrays instead of having multiple arrays. int defaultCpuCore = NativeLibrary.DefaultCPUCore(); int dspEngineEntries; @@ -262,70 +330,53 @@ 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, - 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 SingleChoiceSetting(dspEmulationEngine, R.string.dsp_emulation_engine, 0, + 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(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, "", - 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(), - 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(), - 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(), - 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, - 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(), - MainPresenter.REQUEST_SD_FILE)); + 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, null)); + sl.add(new FilePicker(StringSetting.MAIN_FS_PATH, R.string.wii_NAND_root, 0, + MainPresenter.REQUEST_DIRECTORY, "/Wii")); + sl.add(new FilePicker(StringSetting.MAIN_DUMP_PATH, R.string.dump_path, 0, + MainPresenter.REQUEST_DIRECTORY, "/Dump")); + sl.add(new FilePicker(StringSetting.MAIN_LOAD_PATH, R.string.load_path, 0, + MainPresenter.REQUEST_DIRECTORY, "/Load")); + sl.add(new FilePicker(StringSetting.MAIN_RESOURCEPACK_PATH, R.string.resource_pack_path, 0, + MainPresenter.REQUEST_DIRECTORY, "/ResourcePacks")); + sl.add(new FilePicker(StringSetting.MAIN_SD_PATH, R.string.SD_card_path, 0, + MainPresenter.REQUEST_SD_FILE, "/Wii/sd.raw")); sl.add(new ConfirmRunnable(R.string.reset_paths, 0, R.string.reset_paths_confirmation, 0, mView.getAdapter()::resetPaths)); } 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, - 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(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(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_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, - 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, - 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) @@ -351,35 +402,32 @@ 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, - 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, - 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++) { + LegacyIntSetting 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 LegacyIntSetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_TYPE + i, 0); } 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 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, MenuTag.getGCPadMenuTag(i))); } } @@ -387,104 +435,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. + LegacyIntSetting 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 LegacyIntSetting(Settings.FILE_WIIMOTE, + Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE, 0); } 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 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, + 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, - 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 HeaderSetting(R.string.graphics_general, 0)); + 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(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)); + 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(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(IntSetting.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)); + 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)); - int stereoModeValue = - mSettings.getSection(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY) - .getInt(SettingsFile.KEY_STEREO_MODE, 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(SettingsFile.FILE_NAME_GFX, - Settings.SECTION_GFX_ENHANCEMENTS, SettingsFile.KEY_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(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_HACKS, - SettingsFile.KEY_SCALED_EFB, 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, - 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, - true)); - sl.add(new CheckBoxSetting(SettingsFile.FILE_NAME_GFX, Settings.SECTION_GFX_SETTINGS, - SettingsFile.KEY_WIDE_SCREEN_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, - 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 @@ -497,8 +525,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,185 +571,164 @@ 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, - 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, - 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, - R.string.defer_efb_copies_description, true)); + sl.add(new HeaderSetting(R.string.embedded_frame_buffer, 0)); + 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(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(IntSetting.GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, + R.string.texture_cache_accuracy, R.string.texture_cache_accuracy_description, + 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(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, - 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, - 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, - R.string.skip_duplicate_xfbs_description, true)); + sl.add(new HeaderSetting(R.string.external_frame_buffer, 0)); + 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(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, - R.string.fast_depth_calculation_description, true)); + sl.add(new HeaderSetting(R.string.other, 0)); + 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(SettingsFile.FILE_NAME_LOGGER, Settings.SECTION_LOGGER_OPTIONS, - SettingsFile.KEY_ENABLE_LOGGING, 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 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, 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)); } } 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, - 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, - false)); + sl.add(new HeaderSetting(R.string.debug_jit_header, 0)); + 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(SettingsFile.FILE_NAME_GFX, Settings.SECTION_STEREOSCOPY, - SettingsFile.KEY_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, - 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, - R.string.stereoscopy_swap_eyes_description, false)); + 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, + "%")); + 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) { 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, - 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, - R.string.gc_adapter_bongos_description, false)); + 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)); + sl.add(new CheckBoxSetting(bongo, R.string.gc_adapter_bongos, + R.string.gc_adapter_bongos_description)); } } @@ -732,110 +738,111 @@ 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. + LegacyStringSetting extension; if (mGameID.isEmpty()) { - sl.add(new StringSingleChoiceSetting(SettingsFile.FILE_NAME_WIIMOTE, + extension = new LegacyStringSetting(Settings.FILE_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))); + getExtensionValue(wiimoteNumber - 3)); } else { mSettings.loadWiimoteProfile(mGameID, wiimoteNumber - 4); - sl.add(new StringSingleChoiceSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, + extension = new LegacyStringSetting(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))); + getExtensionValue(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, + 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 +853,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 +1174,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 @@ -1178,31 +1185,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/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..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 @@ -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 { @@ -58,13 +59,23 @@ public final class CheckBoxSettingViewHolder extends SettingViewHolder } mCheckbox.setChecked(mItem.isChecked(getAdapter().getSettings())); + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + 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..39b17d587a 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 @@ -1,5 +1,6 @@ package org.dolphinemu.dolphinemu.features.settings.ui.viewholder; +import android.text.TextUtils; import android.view.View; import android.widget.TextView; @@ -8,6 +9,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.FilePicker; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; import org.dolphinemu.dolphinemu.ui.main.MainPresenter; +import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; public final class FilePickerViewHolder extends SettingViewHolder { @@ -43,13 +45,32 @@ public final class FilePickerViewHolder extends SettingViewHolder } else { - mTextSettingDescription.setText(mFilePicker.getSelectedValue(getAdapter().getSettings())); + String path = mFilePicker.getSelectedValue(getAdapter().getSettings()); + + if (TextUtils.isEmpty(path)) + { + String defaultPathRelative = mFilePicker.getDefaultPathRelativeToUserDirectory(); + if (defaultPathRelative != null) + { + path = DirectoryInitialization.getUserDirectory() + defaultPathRelative; + } + } + + mTextSettingDescription.setText(path); } + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + if (mFilePicker.getRequestType() == MainPresenter.REQUEST_DIRECTORY) { getAdapter().onFilePickerDirectoryClick(mItem); @@ -58,5 +79,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..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 @@ -44,11 +44,21 @@ 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) { + 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 a5b8d9c944..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 @@ -44,11 +44,21 @@ 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) { + 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 5fc91a6136..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,9 +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; @@ -28,6 +35,21 @@ 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); + + 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(); + } + /** * 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..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 @@ -80,11 +80,19 @@ public final class SingleChoiceViewHolder extends SettingViewHolder } } } + + setStyle(mTextSettingName, mItem); } @Override public void onClick(View clicked) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + int position = getAdapterPosition(); if (mItem instanceof SingleChoiceSetting) { @@ -99,5 +107,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..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 @@ -49,12 +49,22 @@ 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) { + if (!mItem.isEditable()) + { + showNotRuntimeEditableError(); + return; + } + getAdapter().onSliderClick(mItem, getAdapterPosition()); + + setStyle(mTextSettingName, mItem); } } 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..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 @@ -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.BooleanSetting; 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 { @@ -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,18 +86,6 @@ 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) - { - 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)) @@ -149,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/java/org/dolphinemu/dolphinemu/model/GameFileCache.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFileCache.java index 281fc65349..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 @@ -4,9 +4,8 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; 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,12 @@ 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); + 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/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java index f4878168ca..3db1a0c8f4 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 @@ -716,8 +716,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 eeef714b16..a36a5dfe34 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.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; -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. @@ -155,7 +152,7 @@ public final class MainActivity extends AppCompatActivity implements MainView @Override public void launchSettingsActivity(MenuTag menuTag) { - SettingsActivity.launch(this, menuTag, ""); + SettingsActivity.launch(this, menuTag); } @Override @@ -282,18 +279,23 @@ 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); + try (Settings settings = new Settings()) + { + settings.loadSettings(null); + + IntSetting.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)); + 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 69087ace1c..4f3146ef05 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 @@ -153,7 +153,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 f38d4e9e05..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 @@ -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.BooleanSetting; 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,48 @@ 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 (!BooleanSetting.MAIN_ANALYTICS_PERMISSION_ASKED.getBoolean(settings)) + { + showMessage(context, settings); + } + else + { + settings.close(); + } + }); } - 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) + { + 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); + + settings.close(); + } + 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/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"> +