From 3a7a8d9c2c43ebf5bc2f4280a9360f3594f0b15f Mon Sep 17 00:00:00 2001 From: FearlessTobi Date: Fri, 3 Apr 2020 03:41:18 +0200 Subject: [PATCH] Android: Refactor the settings managemnt 1. Create Settings class the encaupslate the loading/saving of all settings 2. Decouple the logic of saving the settings into 3 different config files from the UI code. --- .../settings/model/BooleanSetting.java | 4 +- .../features/settings/model/FloatSetting.java | 4 +- .../features/settings/model/IntSetting.java | 4 +- .../features/settings/model/Setting.java | 12 +- .../features/settings/model/Settings.java | 106 ++++++++ .../settings/model/StringSetting.java | 4 +- .../settings/model/view/CheckBoxSetting.java | 10 +- .../settings/model/view/DateTimeSetting.java | 6 +- .../settings/model/view/HeaderSetting.java | 2 +- .../model/view/InputBindingSetting.java | 38 ++- .../settings/model/view/SettingsItem.java | 11 +- .../model/view/SingleChoiceSetting.java | 6 +- .../settings/model/view/SliderSetting.java | 8 +- .../settings/model/view/SubmenuSetting.java | 2 +- .../settings/ui/SettingsActivity.java | 12 +- .../ui/SettingsActivityPresenter.java | 33 +-- .../settings/ui/SettingsActivityView.java | 13 +- .../features/settings/ui/SettingsAdapter.java | 2 +- .../settings/ui/SettingsFragment.java | 14 +- .../ui/SettingsFragmentPresenter.java | 230 +++++++----------- .../settings/ui/SettingsFragmentView.java | 7 +- .../features/settings/utils/SettingsFile.java | 55 +---- 22 files changed, 277 insertions(+), 306 deletions(-) create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java index ee9ff6ef1..932dcf1d3 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java @@ -3,8 +3,8 @@ package org.citra.citra_emu.features.settings.model; public final class BooleanSetting extends Setting { private boolean mValue; - public BooleanSetting(String key, String section, int file, boolean value) { - super(key, section, file); + public BooleanSetting(String key, String section, boolean value) { + super(key, section); mValue = value; } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java index 241e71647..275f0ecea 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java @@ -3,8 +3,8 @@ package org.citra.citra_emu.features.settings.model; public final class FloatSetting extends Setting { private float mValue; - public FloatSetting(String key, String section, int file, float value) { - super(key, section, file); + public FloatSetting(String key, String section, float value) { + super(key, section); mValue = value; } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java index 28801fecc..f712e5bfa 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java @@ -3,8 +3,8 @@ package org.citra.citra_emu.features.settings.model; public final class IntSetting extends Setting { private int mValue; - public IntSetting(String key, String section, int file, int value) { - super(key, section, file); + public IntSetting(String key, String section, int value) { + super(key, section); mValue = value; } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java index 4a454b6f9..b762847c9 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java @@ -9,19 +9,16 @@ package org.citra.citra_emu.features.settings.model; public abstract class Setting { private String mKey; private String mSection; - private int mFile; /** * Base constructor. * * @param key Everything to the left of the = in a line from the ini file. * @param section The corresponding recent section header; e.g. [Core] or [Enhancements] without the brackets. - * @param file The ini file the Setting is stored in. */ - public Setting(String key, String section, int file) { + public Setting(String key, String section) { mKey = key; mSection = section; - mFile = file; } /** @@ -38,13 +35,6 @@ public abstract class Setting { return mSection; } - /** - * @return The ini file the Setting is stored in. - */ - public int getFile() { - return mFile; - } - /** * @return A representation of this Setting's backing value converted to a String (e.g. for serialization). */ diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java new file mode 100644 index 000000000..0a9fa0868 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java @@ -0,0 +1,106 @@ +package org.citra.citra_emu.features.settings.model; + +import android.text.TextUtils; + +import org.citra.citra_emu.features.settings.ui.SettingsActivityView; +import org.citra.citra_emu.features.settings.utils.SettingsFile; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class Settings { + public static final String SECTION_CORE = "Core"; + public static final String SECTION_SYSTEM = "System"; + public static final String SECTION_CONTROLS = "Controls"; + public static final String SECTION_RENDERER = "Renderer"; + public static final String SECTION_AUDIO = "Audio"; + + private String gameId; + + private static final Map> configFileSectionsMap = new HashMap<>(); + + static { + configFileSectionsMap.put(SettingsFile.FILE_NAME_CONFIG, Arrays.asList(SECTION_CORE, SECTION_SYSTEM, SECTION_CONTROLS, SECTION_RENDERER, SECTION_AUDIO)); + } + + /** + * A HashMap that constructs a new SettingSection instead of returning null + * when getting a key not already in the map + */ + public static final class SettingsSectionMap extends HashMap { + @Override + public SettingSection get(Object key) { + if (!(key instanceof String)) { + return null; + } + + String stringKey = (String) key; + + if (!super.containsKey(stringKey)) { + SettingSection section = new SettingSection(stringKey); + super.put(stringKey, section); + return section; + } + return super.get(key); + } + } + + private HashMap sections = new Settings.SettingsSectionMap(); + + public SettingSection getSection(String sectionName) { + return sections.get(sectionName); + } + + public boolean isEmpty() { + return sections.isEmpty(); + } + + public HashMap getSections() { + return sections; + } + + public void loadSettings(SettingsActivityView view) { + sections = new Settings.SettingsSectionMap(); + if (TextUtils.isEmpty(gameId)) { + for (Map.Entry> entry : configFileSectionsMap.entrySet()) { + String fileName = entry.getKey(); + sections.putAll(SettingsFile.readFile(fileName, view)); + } + } else { + // custom game settings + sections.putAll(SettingsFile.readFile("../GameSettings/" + gameId, view)); + } + } + + public void loadSettings(String gameId, SettingsActivityView view) { + this.gameId = gameId; + loadSettings(view); + } + + public void saveSettings(SettingsActivityView view) { + if (TextUtils.isEmpty(gameId)) { + view.showToastMessage("Saved settings to INI files", false); + + for (Map.Entry> entry : configFileSectionsMap.entrySet()) { + String fileName = entry.getKey(); + List sectionNames = entry.getValue(); + TreeMap iniSections = new TreeMap<>(); + for (String section : sectionNames) { + iniSections.put(section, sections.get(section)); + } + + SettingsFile.saveFile(fileName, iniSections, view); + } + } else { + // custom game settings + view.showToastMessage("Saved settings for " + gameId, false); + + TreeMap iniSections = new TreeMap<>(sections); + SettingsFile.saveFile("../GameSettings/" + gameId, iniSections, view); + } + + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java index e88e8c762..b906b7010 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java @@ -3,8 +3,8 @@ package org.citra.citra_emu.features.settings.model; public final class StringSetting extends Setting { private String mValue; - public StringSetting(String key, String section, int file, String value) { - super(key, section, file); + public StringSetting(String key, String section, String value) { + super(key, section); mValue = value; } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java index 442692a41..daff80917 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java @@ -9,16 +9,16 @@ public final class CheckBoxSetting extends SettingsItem { private boolean mShowPerformanceWarning; private SettingsFragmentView mView; - public CheckBoxSetting(String key, String section, int file, int titleId, int descriptionId, + public CheckBoxSetting(String key, String section, int titleId, int descriptionId, boolean defaultValue, Setting setting) { - super(key, section, file, setting, titleId, descriptionId); + super(key, section, setting, titleId, descriptionId); mDefaultValue = defaultValue; mShowPerformanceWarning = false; } - public CheckBoxSetting(String key, String section, int file, int titleId, int descriptionId, + public CheckBoxSetting(String key, String section, int titleId, int descriptionId, boolean defaultValue, Setting setting, boolean show_performance_warning, SettingsFragmentView view) { - super(key, section, file, setting, titleId, descriptionId); + super(key, section, setting, titleId, descriptionId); mDefaultValue = defaultValue; mView = view; mShowPerformanceWarning = show_performance_warning; @@ -47,7 +47,7 @@ public final class CheckBoxSetting extends SettingsItem { } if (getSetting() == null) { - IntSetting setting = new IntSetting(getKey(), getSection(), getFile(), checked ? 1 : 0); + IntSetting setting = new IntSetting(getKey(), getSection(), checked ? 1 : 0); setSetting(setting); return setting; } else { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java index a4cd72eb8..afc3352cc 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java @@ -6,9 +6,9 @@ import org.citra.citra_emu.features.settings.model.StringSetting; public final class DateTimeSetting extends SettingsItem { private String mDefaultValue; - public DateTimeSetting(String key, String section, int file, int titleId, int descriptionId, + public DateTimeSetting(String key, String section, int titleId, int descriptionId, String defaultValue, Setting setting) { - super(key, section, file, setting, titleId, descriptionId); + super(key, section, setting, titleId, descriptionId); mDefaultValue = defaultValue; } @@ -23,7 +23,7 @@ public final class DateTimeSetting extends SettingsItem { public StringSetting setSelectedValue(String datetime) { if (getSetting() == null) { - StringSetting setting = new StringSetting(getKey(), getSection(), getFile(), datetime); + StringSetting setting = new StringSetting(getKey(), getSection(), datetime); setSetting(setting); return setting; } else { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java index 420ec8d51..bac8876cd 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java @@ -4,7 +4,7 @@ import org.citra.citra_emu.features.settings.model.Setting; public final class HeaderSetting extends SettingsItem { public HeaderSetting(String key, Setting setting, int titleId, int descriptionId) { - super(key, null, 0, setting, titleId, descriptionId); + super(key, null, setting, titleId, descriptionId); } @Override diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java index 878ffae98..4270d095e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java @@ -16,8 +16,8 @@ import org.citra.citra_emu.features.settings.utils.SettingsFile; public final class InputBindingSetting extends SettingsItem { private static final String INPUT_MAPPING_PREFIX = "InputMapping"; - public InputBindingSetting(String key, String section, int file, int titleId, Setting setting) { - super(key, section, file, setting, titleId, 0); + public InputBindingSetting(String key, String section, int titleId, Setting setting) { + super(key, section, setting, titleId, 0); } public String getValue() { @@ -32,8 +32,7 @@ public final class InputBindingSetting extends SettingsItem { /** * Returns true if this key is for the 3DS Circle Pad */ - private boolean IsCirclePad() - { + private boolean IsCirclePad() { switch (getKey()) { case SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL: case SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL: @@ -45,8 +44,7 @@ public final class InputBindingSetting extends SettingsItem { /** * Returns true if this key is for a horizontal axis for a 3DS analog stick or D-pad */ - public boolean IsHorizontalOrientation() - { + public boolean IsHorizontalOrientation() { switch (getKey()) { case SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL: case SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL: @@ -59,8 +57,7 @@ public final class InputBindingSetting extends SettingsItem { /** * Returns true if this key is for the 3DS C-Stick */ - private boolean IsCStick() - { + private boolean IsCStick() { switch (getKey()) { case SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL: case SettingsFile.KEY_CSTICK_AXIS_VERTICAL: @@ -72,8 +69,7 @@ public final class InputBindingSetting extends SettingsItem { /** * Returns true if this key is for the 3DS D-Pad */ - private boolean IsDPad() - { + private boolean IsDPad() { switch (getKey()) { case SettingsFile.KEY_DPAD_AXIS_HORIZONTAL: case SettingsFile.KEY_DPAD_AXIS_VERTICAL: @@ -100,16 +96,14 @@ public final class InputBindingSetting extends SettingsItem { /** * Returns true if a gamepad axis can be used to map this key. */ - public boolean IsAxisMappingSupported() - { + public boolean IsAxisMappingSupported() { return IsCirclePad() || IsCStick() || IsDPad() || IsTrigger(); } /** * Returns true if a gamepad button can be used to map this key. */ - private boolean IsButtonMappingSupported() - { + private boolean IsButtonMappingSupported() { return !IsAxisMappingSupported() || IsTrigger(); } @@ -306,8 +300,7 @@ public final class InputBindingSetting extends SettingsItem { * * @param keyEvent KeyEvent of this key press. */ - public void onKeyInput(KeyEvent keyEvent) - { + public void onKeyInput(KeyEvent keyEvent) { if (!IsButtonMappingSupported()) { Toast.makeText(CitraApplication.getAppContext(), R.string.input_message_analog_only, Toast.LENGTH_LONG).show(); return; @@ -329,12 +322,11 @@ public final class InputBindingSetting extends SettingsItem { * @param axisDir Either '-' or '+' (currently unused) */ public void onMotionInput(InputDevice device, InputDevice.MotionRange motionRange, - char axisDir) - { + char axisDir) { if (!IsAxisMappingSupported()) { - Toast.makeText(CitraApplication.getAppContext(), R.string.input_message_button_only, Toast.LENGTH_LONG).show(); - return; - } + Toast.makeText(CitraApplication.getAppContext(), R.string.input_message_button_only, Toast.LENGTH_LONG).show(); + return; + } SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); SharedPreferences.Editor editor = preferences.edit(); @@ -344,7 +336,7 @@ public final class InputBindingSetting extends SettingsItem { button = NativeLibrary.ButtonType.STICK_LEFT; } else if (IsCStick()) { button = NativeLibrary.ButtonType.STICK_C; - } else if (IsDPad()){ + } else if (IsDPad()) { button = NativeLibrary.ButtonType.DPAD; } else { button = getButtonCode(); @@ -366,7 +358,7 @@ public final class InputBindingSetting extends SettingsItem { SharedPreferences.Editor editor = preferences.edit(); if (getSetting() == null) { - StringSetting setting = new StringSetting(getKey(), getSection(), getFile(), ""); + StringSetting setting = new StringSetting(getKey(), getSection(), ""); setSetting(setting); editor.putString(setting.getKey(), ui); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java index a6e8933a8..15c302a52 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java @@ -21,7 +21,6 @@ public abstract class SettingsItem { private String mKey; private String mSection; - private int mFile; private Setting mSetting; @@ -38,11 +37,10 @@ public abstract class SettingsItem { * @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 key, String section, int file, Setting setting, int nameId, + public SettingsItem(String key, String section, Setting setting, int nameId, int descriptionId) { mKey = key; mSection = section; - mFile = file; mSetting = setting; mNameId = nameId; mDescriptionId = descriptionId; @@ -62,13 +60,6 @@ public abstract class SettingsItem { return mSection; } - /** - * @return The file the backing Setting is saved to. - */ - public int getFile() { - return mFile; - } - /** * @return The backing Setting, possibly null. */ diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java index 4e8103de7..ee9d225d6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java @@ -9,9 +9,9 @@ public final class SingleChoiceSetting extends SettingsItem { private int mChoicesId; private int mValuesId; - public SingleChoiceSetting(String key, String section, int file, int titleId, int descriptionId, + public SingleChoiceSetting(String key, String section, int titleId, int descriptionId, int choicesId, int valuesId, int defaultValue, Setting setting) { - super(key, section, file, setting, titleId, descriptionId); + super(key, section, setting, titleId, descriptionId); mValuesId = valuesId; mChoicesId = choicesId; mDefaultValue = defaultValue; @@ -43,7 +43,7 @@ public final class SingleChoiceSetting extends SettingsItem { */ public IntSetting setSelectedValue(int selection) { if (getSetting() == null) { - IntSetting setting = new IntSetting(getKey(), getSection(), getFile(), selection); + IntSetting setting = new IntSetting(getKey(), getSection(), selection); setSetting(setting); return setting; } else { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java index cf6b544a3..d5cd7ef74 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java @@ -13,9 +13,9 @@ public final class SliderSetting extends SettingsItem { private String mUnits; - public SliderSetting(String key, String section, int file, int titleId, int descriptionId, + public SliderSetting(String key, String section, int titleId, int descriptionId, int min, int max, String units, int defaultValue, Setting setting) { - super(key, section, file, setting, titleId, descriptionId); + super(key, section, setting, titleId, descriptionId); mMin = min; mMax = max; mUnits = units; @@ -70,7 +70,7 @@ public final class SliderSetting extends SettingsItem { */ public IntSetting setSelectedValue(int selection) { if (getSetting() == null) { - IntSetting setting = new IntSetting(getKey(), getSection(), getFile(), selection); + IntSetting setting = new IntSetting(getKey(), getSection(), selection); setSetting(setting); return setting; } else { @@ -89,7 +89,7 @@ public final class SliderSetting extends SettingsItem { */ public FloatSetting setSelectedValue(float selection) { if (getSetting() == null) { - FloatSetting setting = new FloatSetting(getKey(), getSection(), getFile(), selection); + FloatSetting setting = new FloatSetting(getKey(), getSection(), selection); setSetting(setting); return setting; } else { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java index 902909e7c..9d44a923f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java @@ -6,7 +6,7 @@ public final class SubmenuSetting extends SettingsItem { private String mMenuKey; public SubmenuSetting(String key, Setting setting, int titleId, int descriptionId, String menuKey) { - super(key, null, 0, setting, titleId, descriptionId); + super(key, null, setting, titleId, descriptionId); mMenuKey = menuKey; } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java index 1d2a2eaff..d2d9248ab 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java @@ -18,13 +18,9 @@ import android.view.MenuItem; import android.widget.Toast; import org.citra.citra_emu.R; -import org.citra.citra_emu.features.settings.model.SettingSection; import org.citra.citra_emu.utils.DirectoryInitialization; import org.citra.citra_emu.utils.DirectoryStateReceiver; -import java.util.ArrayList; -import java.util.HashMap; - public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView { private static final String ARG_FILE_NAME = "file_name"; private static final String ARG_GAME_ID = "game_id"; @@ -182,17 +178,17 @@ public final class SettingsActivity extends AppCompatActivity implements Setting } @Override - public HashMap getSettings(int file) { - return mPresenter.getSettings(file); + public org.citra.citra_emu.features.settings.model.Settings getSettings() { + return mPresenter.getSettings(); } @Override - public void setSettings(ArrayList> settings) { + public void setSettings(org.citra.citra_emu.features.settings.model.Settings settings) { mPresenter.setSettings(settings); } @Override - public void onSettingsFileLoaded(ArrayList> settings) { + public void onSettingsFileLoaded(org.citra.citra_emu.features.settings.model.Settings settings) { SettingsFragmentView fragment = getFragment(); if (fragment != null) { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java index 7fd8c145c..390bac63e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java @@ -5,7 +5,7 @@ import android.os.Bundle; import android.text.TextUtils; import org.citra.citra_emu.NativeLibrary; -import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.utils.DirectoryInitialization; import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState; import org.citra.citra_emu.utils.DirectoryStateReceiver; @@ -13,15 +13,13 @@ import org.citra.citra_emu.utils.Log; import org.citra.citra_emu.features.settings.utils.SettingsFile; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; public final class SettingsActivityPresenter { private static final String KEY_SHOULD_SAVE = "should_save"; private SettingsActivityView mView; - private ArrayList> mSettings = new ArrayList<>(); + private Settings mSettings = new Settings(); private int mStackCount; @@ -52,9 +50,9 @@ public final class SettingsActivityPresenter { void loadSettingsUI() { if (mSettings.isEmpty()) { if (!TextUtils.isEmpty(gameId)) { - mSettings.add(SettingsFile.SETTINGS_CITRA, SettingsFile.readFile("../GameSettings/" + gameId, mView)); + mSettings.loadSettings(gameId, mView); } else { - mSettings.add(SettingsFile.SETTINGS_CITRA, SettingsFile.readFile(SettingsFile.FILE_NAME_CONFIG, mView)); + mSettings.loadSettings(mView); } } @@ -93,12 +91,12 @@ public final class SettingsActivityPresenter { } } - public void setSettings(ArrayList> settings) { + public void setSettings(Settings settings) { mSettings = settings; } - public HashMap getSettings(int file) { - return mSettings.get(file); + public Settings getSettings() { + return mSettings; } public void onStop(boolean finishing) { @@ -108,20 +106,11 @@ public final class SettingsActivityPresenter { } if (mSettings != null && finishing && mShouldSave) { - if (!TextUtils.isEmpty(gameId)) { - Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); - // Needed workaround for now due to an odd bug in how it handles saving two different settings sections to the same file. It won't save GFX settings if it follows the normal saving pattern - if (menuTag.equals("Dolphin")) { - SettingsFile.saveFile("../GameSettings/" + gameId, mSettings.get(SettingsFile.SETTINGS_CITRA), mView); - } - mView.showToastMessage("Saved settings for " + gameId, false); - } else { - Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); - SettingsFile.saveFile(SettingsFile.FILE_NAME_CONFIG, mSettings.get(SettingsFile.SETTINGS_CITRA), mView); - mView.showToastMessage("Saved settings", false); - } - NativeLibrary.ReloadSettings(); + Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); + mSettings.saveSettings(mView); } + + NativeLibrary.ReloadSettings(); } public void addToStack() { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java index f9818e360..bfcc3d49c 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java @@ -2,12 +2,8 @@ package org.citra.citra_emu.features.settings.ui; import android.content.IntentFilter; -import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.utils.DirectoryStateReceiver; - -import java.util.ArrayList; -import java.util.HashMap; - /** * Abstraction for the Activity that manages SettingsFragments. */ @@ -25,10 +21,9 @@ public interface SettingsActivityView { * loaded from disk, so that each Fragment doesn't need to perform its own * read operation. * - * @param file The settings file to load. * @return A possibly null HashMap of Settings. */ - HashMap getSettings(int file); + Settings getSettings(); /** * Used to provide the Activity with Settings HashMaps if a Fragment already @@ -37,14 +32,14 @@ public interface SettingsActivityView { * * @param settings The ArrayList of all the Settings HashMaps. */ - void setSettings(ArrayList> settings); + void setSettings(Settings settings); /** * Called when an asynchronous load operation completes. * * @param settings The (possibly null) result of the ini load operation. */ - void onSettingsFileLoaded(ArrayList> settings); + void onSettingsFileLoaded(Settings settings); /** * Called when an asynchronous load operation fails. diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java index b4112e9f0..e2616bdd1 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java @@ -258,7 +258,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter { - StringSetting setting = new StringSetting(item.getKey(), item.getSection(), item.getFile(), item.getValue()); + StringSetting setting = new StringSetting(item.getKey(), item.getSection(), item.getValue()); notifyItemChanged(position); mView.putSetting(setting); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java index e485ea8f7..e77f0dd0a 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java @@ -2,23 +2,23 @@ package org.citra.citra_emu.features.settings.ui; import android.content.Context; import android.os.Bundle; + import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.citra.citra_emu.R; import org.citra.citra_emu.features.settings.model.Setting; -import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.features.settings.model.view.SettingsItem; import org.citra.citra_emu.ui.DividerItemDecoration; -import org.citra.citra_emu.features.settings.utils.SettingsFile; import java.util.ArrayList; -import java.util.HashMap; public final class SettingsFragment extends Fragment implements SettingsFragmentView { private static final String ARGUMENT_MENU_TAG = "menu_tag"; @@ -79,9 +79,7 @@ public final class SettingsFragment extends Fragment implements SettingsFragment SettingsActivityView activity = (SettingsActivityView) getActivity(); - ArrayList> settings = new ArrayList<>(); - settings.add(SettingsFile.SETTINGS_CITRA, activity.getSettings(SettingsFile.SETTINGS_CITRA)); - mPresenter.onViewCreated(settings); + mPresenter.onViewCreated(activity.getSettings()); } @Override @@ -95,12 +93,12 @@ public final class SettingsFragment extends Fragment implements SettingsFragment } @Override - public void onSettingsFileLoaded(ArrayList> settings) { + public void onSettingsFileLoaded(Settings settings) { mPresenter.setSettings(settings); } @Override - public void passSettingsToActivity(ArrayList> settings) { + public void passSettingsToActivity(Settings settings) { if (mActivity != null) { mActivity.setSettings(settings); } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java index a25fdd802..0253b35bb 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import org.citra.citra_emu.R; import org.citra.citra_emu.features.settings.model.Setting; import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.features.settings.model.view.CheckBoxSetting; import org.citra.citra_emu.features.settings.model.view.DateTimeSetting; import org.citra.citra_emu.features.settings.model.view.HeaderSetting; @@ -24,7 +25,7 @@ public final class SettingsFragmentPresenter { private String mMenuTag; private String mGameID; - private ArrayList> mSettings; + private Settings mSettings; private ArrayList mSettingsList; public SettingsFragmentPresenter(SettingsFragmentView view) { @@ -36,7 +37,7 @@ public final class SettingsFragmentPresenter { mMenuTag = menuTag; } - public void onViewCreated(ArrayList> settings) { + public void onViewCreated(Settings settings) { setSettings(settings); } @@ -52,14 +53,14 @@ public final class SettingsFragmentPresenter { } public void putSetting(Setting setting) { - mSettings.get(setting.getFile()).get(setting.getSection()).putSetting(setting); + mSettings.getSection(setting.getSection()).putSetting(setting); } public void loadDefaultSettings() { loadSettingsList(); } - public void setSettings(ArrayList> settings) { + public void setSettings(Settings settings) { if (mSettingsList == null && settings != null) { mSettings = settings; @@ -80,19 +81,19 @@ public final class SettingsFragmentPresenter { case SettingsFile.FILE_NAME_CONFIG: addConfigSettings(sl); break; - case SettingsFile.SECTION_CORE: + case Settings.SECTION_CORE: addGeneralSettings(sl); break; - case SettingsFile.SECTION_SYSTEM: + case Settings.SECTION_SYSTEM: addSystemSettings(sl); break; - case SettingsFile.SECTION_CONTROLS: + case Settings.SECTION_CONTROLS: addInputSettings(sl); break; - case SettingsFile.SECTION_RENDERER: + case Settings.SECTION_RENDERER: addGraphicsSettings(sl); break; - case SettingsFile.SECTION_AUDIO: + case Settings.SECTION_AUDIO: addAudioSettings(sl); break; default: @@ -107,180 +108,125 @@ public final class SettingsFragmentPresenter { private void addConfigSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_settings); - sl.add(new SubmenuSetting(null, null, R.string.preferences_general, 0, SettingsFile.SECTION_CORE)); - sl.add(new SubmenuSetting(null, null, R.string.preferences_system, 0, SettingsFile.SECTION_SYSTEM)); - sl.add(new SubmenuSetting(null, null, R.string.preferences_controls, 0, SettingsFile.SECTION_CONTROLS)); - sl.add(new SubmenuSetting(null, null, R.string.preferences_graphics, 0, SettingsFile.SECTION_RENDERER)); - sl.add(new SubmenuSetting(null, null, R.string.preferences_audio, 0, SettingsFile.SECTION_AUDIO)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_general, 0, Settings.SECTION_CORE)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_system, 0, Settings.SECTION_SYSTEM)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_controls, 0, Settings.SECTION_CONTROLS)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_graphics, 0, Settings.SECTION_RENDERER)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_audio, 0, Settings.SECTION_AUDIO)); } private void addGeneralSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_general); - Setting useCpuJit = null; - Setting frameLimitEnable = null; - Setting frameLimitValue = null; + SettingSection coreSection = mSettings.getSection(Settings.SECTION_CORE); + Setting useCpuJit = coreSection.getSetting(SettingsFile.KEY_CPU_JIT); + Setting frameLimitEnable = coreSection.getSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED); + Setting frameLimitValue = coreSection.getSetting(SettingsFile.KEY_FRAME_LIMIT); - if (!mSettings.get(SettingsFile.SETTINGS_CITRA).isEmpty()) { - useCpuJit = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CORE).getSetting(SettingsFile.KEY_CPU_JIT); - frameLimitEnable = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED); - frameLimitValue = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_FRAME_LIMIT); - - } else { - mView.passSettingsToActivity(mSettings); - } - - sl.add(new CheckBoxSetting(SettingsFile.KEY_CPU_JIT, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_CITRA, R.string.cpu_jit, R.string.cpu_jit_description, true, useCpuJit, true, mView)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.frame_limit_enable, R.string.frame_limit_enable_description, true, frameLimitEnable)); - sl.add(new SliderSetting(SettingsFile.KEY_FRAME_LIMIT, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.frame_limit_slider, R.string.frame_limit_slider_description, 0, 200, "%", 100, frameLimitValue)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_CPU_JIT, Settings.SECTION_CORE, R.string.cpu_jit, R.string.cpu_jit_description, true, useCpuJit, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED, Settings.SECTION_RENDERER, R.string.frame_limit_enable, R.string.frame_limit_enable_description, true, frameLimitEnable)); + sl.add(new SliderSetting(SettingsFile.KEY_FRAME_LIMIT, Settings.SECTION_RENDERER, R.string.frame_limit_slider, R.string.frame_limit_slider_description, 0, 200, "%", 100, frameLimitValue)); } private void addSystemSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_system); - Setting region = null; - Setting language = null; - Setting systemClock = null; - Setting dateTime = null; + SettingSection systemSection = mSettings.getSection(Settings.SECTION_SYSTEM); + Setting region = systemSection.getSetting(SettingsFile.KEY_REGION_VALUE); + Setting language = systemSection.getSetting(SettingsFile.KEY_LANGUAGE); + Setting systemClock = systemSection.getSetting(SettingsFile.KEY_INIT_CLOCK); + Setting dateTime = systemSection.getSetting(SettingsFile.KEY_INIT_TIME); - if (!mSettings.get(SettingsFile.SETTINGS_CITRA).isEmpty()) { - region = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_SYSTEM).getSetting(SettingsFile.KEY_REGION_VALUE); - language = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_SYSTEM).getSetting(SettingsFile.KEY_LANGUAGE); - systemClock = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_SYSTEM).getSetting(SettingsFile.KEY_INIT_CLOCK); - dateTime = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_SYSTEM).getSetting(SettingsFile.KEY_INIT_TIME); - } else { - mView.passSettingsToActivity(mSettings); - } - - sl.add(new SingleChoiceSetting(SettingsFile.KEY_REGION_VALUE, SettingsFile.SECTION_SYSTEM, SettingsFile.SETTINGS_CITRA, R.string.emulated_region, 0, R.array.regionNames, R.array.regionValues, -1, region)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_LANGUAGE, SettingsFile.SECTION_SYSTEM, SettingsFile.SETTINGS_CITRA, R.string.emulated_language, 0, R.array.languageNames, R.array.languageValues, 1, language)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_INIT_CLOCK, SettingsFile.SECTION_SYSTEM, SettingsFile.SETTINGS_CITRA, R.string.init_clock, R.string.init_clock_description, R.array.systemClockNames, R.array.systemClockValues, 0, systemClock)); - sl.add(new DateTimeSetting(SettingsFile.KEY_INIT_TIME, SettingsFile.SECTION_SYSTEM, SettingsFile.SETTINGS_CITRA, R.string.init_time, R.string.init_time_description, "2000-01-01 00:00:01", dateTime)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_REGION_VALUE, Settings.SECTION_SYSTEM, R.string.emulated_region, 0, R.array.regionNames, R.array.regionValues, -1, region)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_LANGUAGE, Settings.SECTION_SYSTEM, R.string.emulated_language, 0, R.array.languageNames, R.array.languageValues, 1, language)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_INIT_CLOCK, Settings.SECTION_SYSTEM, R.string.init_clock, R.string.init_clock_description, R.array.systemClockNames, R.array.systemClockValues, 0, systemClock)); + sl.add(new DateTimeSetting(SettingsFile.KEY_INIT_TIME, Settings.SECTION_SYSTEM, R.string.init_time, R.string.init_time_description, "2000-01-01 00:00:01", dateTime)); } private void addInputSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_controls); - Setting buttonA = null; - Setting buttonB = null; - Setting buttonX = null; - Setting buttonY = null; - Setting buttonSelect = null; - Setting buttonStart = null; - Setting circlepadAxisVert = null; - Setting circlepadAxisHoriz = null; - Setting cstickAxisVert = null; - Setting cstickAxisHoriz = null; - Setting dpadAxisVert = null; - Setting dpadAxisHoriz = null; - // Setting buttonUp = null; - // Setting buttonDown = null; - // Setting buttonLeft = null; - // Setting buttonRight = null; - Setting buttonL = null; - Setting buttonR = null; - Setting buttonZL = null; - Setting buttonZR = null; - - if (!mSettings.get(SettingsFile.SETTINGS_CITRA).isEmpty()) { - buttonA = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_A); - buttonB = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_B); - buttonX = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_X); - buttonY = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_Y); - buttonSelect = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_SELECT); - buttonStart = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_START); - circlepadAxisVert = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL); - circlepadAxisHoriz = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL); - cstickAxisVert = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL); - cstickAxisHoriz = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL); - dpadAxisVert = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL); - dpadAxisHoriz = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL); - // buttonUp = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_UP); - // buttonDown = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_DOWN); - // buttonLeft = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_LEFT); - // buttonRight = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_RIGHT); - buttonL = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_L); - buttonR = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_R); - buttonZL = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_ZL); - buttonZR = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_CONTROLS).getSetting(SettingsFile.KEY_BUTTON_ZR); - } else { - mView.passSettingsToActivity(mSettings); - } + SettingSection controlsSection = mSettings.getSection(Settings.SECTION_CONTROLS); + Setting buttonA = controlsSection.getSetting(SettingsFile.KEY_BUTTON_A); + Setting buttonB = controlsSection.getSetting(SettingsFile.KEY_BUTTON_B); + Setting buttonX = controlsSection.getSetting(SettingsFile.KEY_BUTTON_X); + Setting buttonY = controlsSection.getSetting(SettingsFile.KEY_BUTTON_Y); + Setting buttonSelect = controlsSection.getSetting(SettingsFile.KEY_BUTTON_SELECT); + Setting buttonStart = controlsSection.getSetting(SettingsFile.KEY_BUTTON_START); + Setting circlepadAxisVert = controlsSection.getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL); + Setting circlepadAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL); + Setting cstickAxisVert = controlsSection.getSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL); + Setting cstickAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL); + Setting dpadAxisVert = controlsSection.getSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL); + Setting dpadAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL); + // Setting buttonUp = controlsSection.getSetting(SettingsFile.KEY_BUTTON_UP); + // Setting buttonDown = controlsSection.getSetting(SettingsFile.KEY_BUTTON_DOWN); + // Setting buttonLeft = controlsSection.getSetting(SettingsFile.KEY_BUTTON_LEFT); + // Setting buttonRight = controlsSection.getSetting(SettingsFile.KEY_BUTTON_RIGHT); + Setting buttonL = controlsSection.getSetting(SettingsFile.KEY_BUTTON_L); + Setting buttonR = controlsSection.getSetting(SettingsFile.KEY_BUTTON_R); + Setting buttonZL = controlsSection.getSetting(SettingsFile.KEY_BUTTON_ZL); + Setting buttonZR = controlsSection.getSetting(SettingsFile.KEY_BUTTON_ZR); sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_A, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_a, buttonA)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_B, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_b, buttonB)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_X, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_x, buttonX)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_Y, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_y, buttonY)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_SELECT, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_select, buttonSelect)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_START, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_start, buttonStart)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_A, Settings.SECTION_CONTROLS, R.string.button_a, buttonA)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_B, Settings.SECTION_CONTROLS, R.string.button_b, buttonB)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_X, Settings.SECTION_CONTROLS, R.string.button_x, buttonX)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_Y, Settings.SECTION_CONTROLS, R.string.button_y, buttonY)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_SELECT, Settings.SECTION_CONTROLS, R.string.button_select, buttonSelect)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_START, Settings.SECTION_CONTROLS, R.string.button_start, buttonStart)); sl.add(new HeaderSetting(null, null, R.string.controller_circlepad, 0)); - sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_vertical, circlepadAxisVert)); - sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_horizontal, circlepadAxisHoriz)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, circlepadAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, circlepadAxisHoriz)); sl.add(new HeaderSetting(null, null, R.string.controller_c, 0)); - sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_vertical, cstickAxisVert)); - sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_horizontal, cstickAxisHoriz)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, cstickAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, cstickAxisHoriz)); sl.add(new HeaderSetting(null, null, R.string.controller_dpad, 0)); - sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_vertical, dpadAxisVert)); - sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.controller_axis_horizontal, dpadAxisHoriz)); + sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, dpadAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, dpadAxisHoriz)); // TODO(bunnei): Figure out what to do with these. Configuring is functional, but removing for MVP because they are confusing. - // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_UP, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.generic_up, buttonUp)); - // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_DOWN, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.generic_down, buttonDown)); - // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_LEFT, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.generic_left, buttonLeft)); - // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_RIGHT, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.generic_right, buttonRight)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_UP, Settings.SECTION_CONTROLS, R.string.generic_up, buttonUp)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_DOWN, Settings.SECTION_CONTROLS, R.string.generic_down, buttonDown)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_LEFT, Settings.SECTION_CONTROLS, R.string.generic_left, buttonLeft)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_RIGHT, Settings.SECTION_CONTROLS, R.string.generic_right, buttonRight)); sl.add(new HeaderSetting(null, null, R.string.controller_triggers, 0)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_L, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_l, buttonL)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_R, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_r, buttonR)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZL, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_zl, buttonZL)); - sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZR, SettingsFile.SECTION_CONTROLS, SettingsFile.SETTINGS_CITRA, R.string.button_zr, buttonZR)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_L, Settings.SECTION_CONTROLS, R.string.button_l, buttonL)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_R, Settings.SECTION_CONTROLS, R.string.button_r, buttonR)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZL, Settings.SECTION_CONTROLS, R.string.button_zl, buttonZL)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZR, Settings.SECTION_CONTROLS, R.string.button_zr, buttonZR)); } private void addGraphicsSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_graphics); - Setting hardwareRenderer = null; - Setting hardwareShader = null; - Setting shadersAccurateMul = null; - Setting resolutionFactor = null; - Setting vsyncEnable = null; - Setting filterMode = null; + SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); + Setting hardwareRenderer = rendererSection.getSetting(SettingsFile.KEY_HW_RENDERER); + Setting hardwareShader = rendererSection.getSetting(SettingsFile.KEY_HW_SHADER); + Setting shadersAccurateMul = rendererSection.getSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL); + Setting resolutionFactor = rendererSection.getSetting(SettingsFile.KEY_RESOLUTION_FACTOR); + Setting vsyncEnable = rendererSection.getSetting(SettingsFile.KEY_USE_VSYNC); + Setting filterMode = rendererSection.getSetting(SettingsFile.KEY_FILTER_MODE); - if (!mSettings.get(SettingsFile.SETTINGS_CITRA).isEmpty()) { - hardwareRenderer = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_HW_RENDERER); - hardwareShader = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_HW_SHADER); - shadersAccurateMul = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL); - resolutionFactor = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_RESOLUTION_FACTOR); - vsyncEnable = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_USE_VSYNC); - filterMode = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_RENDERER).getSetting(SettingsFile.KEY_FILTER_MODE); - } else { - mView.passSettingsToActivity(mSettings); - } - - sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_RENDERER, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.hw_renderer, R.string.hw_renderer_description, true, hardwareRenderer, true, mView)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_SHADER, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.hw_shaders, R.string.hw_shaders_description, true, hardwareShader, true, mView)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.shaders_accurate_mul, R.string.shaders_accurate_mul_description, false, shadersAccurateMul)); - sl.add(new SliderSetting(SettingsFile.KEY_RESOLUTION_FACTOR, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.internal_resolution, R.string.internal_resolution_description, 1, 4, "x", 1, resolutionFactor)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_VSYNC, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.vsync, R.string.vsync_description, true, vsyncEnable)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_FILTER_MODE, SettingsFile.SECTION_RENDERER, SettingsFile.SETTINGS_CITRA, R.string.linear_filtering, R.string.linear_filtering_description, true, filterMode)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_RENDERER, Settings.SECTION_RENDERER, R.string.hw_renderer, R.string.hw_renderer_description, true, hardwareRenderer, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_SHADER, Settings.SECTION_RENDERER, R.string.hw_shaders, R.string.hw_shaders_description, true, hardwareShader, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL, Settings.SECTION_RENDERER, R.string.shaders_accurate_mul, R.string.shaders_accurate_mul_description, false, shadersAccurateMul)); + sl.add(new SliderSetting(SettingsFile.KEY_RESOLUTION_FACTOR, Settings.SECTION_RENDERER, R.string.internal_resolution, R.string.internal_resolution_description, 1, 4, "x", 1, resolutionFactor)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_VSYNC, Settings.SECTION_RENDERER, R.string.vsync, R.string.vsync_description, true, vsyncEnable)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_FILTER_MODE, Settings.SECTION_RENDERER, R.string.linear_filtering, R.string.linear_filtering_description, true, filterMode)); } private void addAudioSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_audio); - Setting audioStretch = null; + SettingSection audioSection = mSettings.getSection(Settings.SECTION_AUDIO); + Setting audioStretch = audioSection.getSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING); - if (!mSettings.get(SettingsFile.SETTINGS_CITRA).isEmpty()) { - audioStretch = mSettings.get(SettingsFile.SETTINGS_CITRA).get(SettingsFile.SECTION_AUDIO).getSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING); - } else { - mView.passSettingsToActivity(mSettings); - } - - sl.add(new CheckBoxSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING, SettingsFile.SECTION_AUDIO, SettingsFile.SETTINGS_CITRA, R.string.audio_stretch, R.string.audio_stretch_description, false, audioStretch)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING, Settings.SECTION_AUDIO, R.string.audio_stretch, R.string.audio_stretch_description, false, audioStretch)); } } \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java index 0d2942f09..c36eb55a7 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java @@ -3,11 +3,10 @@ package org.citra.citra_emu.features.settings.ui; import androidx.fragment.app.FragmentActivity; import org.citra.citra_emu.features.settings.model.Setting; -import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.features.settings.model.view.SettingsItem; import java.util.ArrayList; -import java.util.HashMap; /** * Abstraction for a screen showing a list of settings. Instances of @@ -20,7 +19,7 @@ public interface SettingsFragmentView { * * @param settings The (possibly null) result of the ini load operation. */ - void onSettingsFileLoaded(ArrayList> settings); + void onSettingsFileLoaded(Settings settings); /** * Pass a settings HashMap to the containing activity, so that it can @@ -29,7 +28,7 @@ public interface SettingsFragmentView { * * @param settings An ArrayList containing all the settings HashMaps. */ - void passSettingsToActivity(ArrayList> settings); + void passSettingsToActivity(Settings settings); /** * Pass an ArrayList to the View so that it can be displayed on screen. diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java index b2da31adc..d8e700408 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java @@ -6,6 +6,7 @@ import org.citra.citra_emu.features.settings.model.FloatSetting; import org.citra.citra_emu.features.settings.model.IntSetting; import org.citra.citra_emu.features.settings.model.Setting; import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.features.settings.model.StringSetting; import org.citra.citra_emu.features.settings.ui.SettingsActivityView; import org.citra.citra_emu.utils.DirectoryInitialization; @@ -19,43 +20,14 @@ import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Set; - -/** - * A HashMap that constructs a new SettingSection instead of returning null - * when getting a key not already in the map - */ -final class SettingsSectionMap extends HashMap { - @Override - public SettingSection get(Object key) { - if (!(key instanceof String)) { - return null; - } - - String stringKey = (String) key; - - if (!super.containsKey(stringKey)) { - SettingSection section = new SettingSection(stringKey); - super.put(stringKey, section); - return section; - } - return super.get(key); - } -} +import java.util.TreeMap; /** * Contains static methods for interacting with .ini files in which settings are stored. */ public final class SettingsFile { - public static final int SETTINGS_CITRA = 0; - public static final String FILE_NAME_CONFIG = "config"; - public static final String SECTION_CORE = "Core"; - public static final String SECTION_SYSTEM = "System"; - public static final String SECTION_CONTROLS = "Controls"; - public static final String SECTION_RENDERER = "Renderer"; - public static final String SECTION_AUDIO = "Audio"; - public static final String KEY_CPU_JIT = "use_cpu_jit"; public static final String KEY_HW_RENDERER = "use_hw_renderer"; @@ -131,7 +103,7 @@ public final class SettingsFile { } /** - * Reads a given .ini file from disk and returns it as a HashMap of SettingSections, themselves + * Reads a given .ini file from disk and returns it as a HashMap of Settings, themselves * effectively a HashMap of key/value settings. If unsuccessful, outputs an error telling why it * failed. * @@ -141,7 +113,7 @@ public final class SettingsFile { */ public static HashMap readFile(final String fileName, SettingsActivityView view) { - HashMap sections = new SettingsSectionMap(); + HashMap sections = new Settings.SettingsSectionMap(); File ini = getSettingsFile(fileName); @@ -156,7 +128,7 @@ public final class SettingsFile { current = sectionFromLine(line); sections.put(current.getName(), current); } else if ((current != null)) { - Setting setting = settingFromLine(current, line, fileName); + Setting setting = settingFromLine(current, line); if (setting != null) { current.putSetting(setting); } @@ -189,7 +161,7 @@ public final class SettingsFile { * @param sections The HashMap containing the Settings we want to serialize. * @param view The current view. */ - public static void saveFile(final String fileName, final HashMap sections, + public static void saveFile(final String fileName, TreeMap sections, SettingsActivityView view) { File ini = getSettingsFile(fileName); @@ -223,12 +195,11 @@ public final class SettingsFile { * For a line of text, determines what type of data is being represented, and returns * a Setting object containing this data. * - * @param current The section currently being parsed by the consuming method. - * @param line The line of text being parsed. - * @param fileName The name of the ini file the setting is in. + * @param current The section currently being parsed by the consuming method. + * @param line The line of text being parsed. * @return A typed Setting containing the key/value contained in the line. */ - private static Setting settingFromLine(SettingSection current, String line, String fileName) { + private static Setting settingFromLine(SettingSection current, String line) { String[] splitLine = line.split("="); if (splitLine.length != 2) { @@ -244,23 +215,21 @@ public final class SettingsFile { return null; } - int file = SETTINGS_CITRA; - try { int valueAsInt = Integer.parseInt(value); - return new IntSetting(key, current.getName(), file, valueAsInt); + return new IntSetting(key, current.getName(), valueAsInt); } catch (NumberFormatException ex) { } try { float valueAsFloat = Float.parseFloat(value); - return new FloatSetting(key, current.getName(), file, valueAsFloat); + return new FloatSetting(key, current.getName(), valueAsFloat); } catch (NumberFormatException ex) { } - return new StringSetting(key, current.getName(), file, value); + return new StringSetting(key, current.getName(), value); } /**