From fa38c7be4fa46f46168efd35342d06867a4dc7d4 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Mon, 6 Mar 2023 15:54:24 -0500 Subject: [PATCH] android: Convert Settings to Kotlin --- .../features/settings/model/Settings.java | 127 --------------- .../features/settings/model/Settings.kt | 145 ++++++++++++++++++ 2 files changed, 145 insertions(+), 127 deletions(-) delete mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.java create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.java deleted file mode 100644 index 3126eba73..000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.yuzu.yuzu_emu.features.settings.model; - -import android.text.TextUtils; - -import org.yuzu.yuzu_emu.YuzuApplication; -import org.yuzu.yuzu_emu.R; -import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivityView; -import org.yuzu.yuzu_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_GENERAL = "General"; - public static final String SECTION_SYSTEM = "System"; - public static final String SECTION_RENDERER = "Renderer"; - public static final String SECTION_AUDIO = "Audio"; - public static final String SECTION_CPU = "Cpu"; - - private String gameId; - - private static final Map> configFileSectionsMap = new HashMap<>(); - - static { - configFileSectionsMap.put(SettingsFile.FILE_NAME_CONFIG, Arrays.asList(SECTION_GENERAL, SECTION_SYSTEM, SECTION_RENDERER, SECTION_AUDIO, SECTION_CPU)); - } - - /** - * 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(); - loadCitraSettings(view); - - if (!TextUtils.isEmpty(gameId)) { - loadCustomGameSettings(gameId, view); - } - } - - private void loadCitraSettings(SettingsActivityView view) { - for (Map.Entry> entry : configFileSectionsMap.entrySet()) { - String fileName = entry.getKey(); - sections.putAll(SettingsFile.readFile(fileName, view)); - } - } - - private void loadCustomGameSettings(String gameId, SettingsActivityView view) { - // custom game settings - mergeSections(SettingsFile.readCustomGameSettings(gameId, view)); - } - - private void mergeSections(HashMap updatedSections) { - for (Map.Entry entry : updatedSections.entrySet()) { - if (sections.containsKey(entry.getKey())) { - SettingSection originalSection = sections.get(entry.getKey()); - SettingSection updatedSection = entry.getValue(); - originalSection.mergeSection(updatedSection); - } else { - sections.put(entry.getKey(), entry.getValue()); - } - } - } - - public void loadSettings(String gameId, SettingsActivityView view) { - this.gameId = gameId; - loadSettings(view); - } - - public void saveSettings(SettingsActivityView view) { - if (TextUtils.isEmpty(gameId)) { - view.showToastMessage(YuzuApplication.getAppContext().getString(R.string.ini_saved), 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(YuzuApplication.getAppContext().getString(R.string.gameid_saved, gameId), false); - - SettingsFile.saveCustomGameSettings(gameId, sections); - } - - } -} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt new file mode 100644 index 000000000..af887402a --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -0,0 +1,145 @@ +package org.yuzu.yuzu_emu.features.settings.model + +import android.text.TextUtils +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.YuzuApplication +import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivityView +import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile +import java.util.* + +class Settings { + private var gameId: String? = null + + /** + * A HashMap, SettingSection> that constructs a new SettingSection instead of returning null + * when getting a key not already in the map + */ + class SettingsSectionMap : HashMap() { + override operator fun get(key: String): SettingSection? { + if (!super.containsKey(key)) { + val section = SettingSection(key) + super.put(key, section) + return section + } + return super.get(key) + } + } + + var sections: HashMap = SettingsSectionMap() + + fun getSection(sectionName: String): SettingSection? { + return sections[sectionName] + } + + val isEmpty: Boolean + get() = sections.isEmpty() + + fun loadSettings(view: SettingsActivityView) { + sections = SettingsSectionMap() + loadYuzuSettings(view) + if (!TextUtils.isEmpty(gameId)) { + loadCustomGameSettings(gameId!!, view) + } + } + + private fun loadYuzuSettings(view: SettingsActivityView) { + for ((fileName) in configFileSectionsMap) { + sections.putAll(SettingsFile.readFile(fileName, view)) + } + } + + private fun loadCustomGameSettings(gameId: String, view: SettingsActivityView) { + // Custom game settings + mergeSections(SettingsFile.readCustomGameSettings(gameId, view)) + } + + private fun mergeSections(updatedSections: HashMap) { + for ((key, updatedSection) in updatedSections) { + if (sections.containsKey(key)) { + val originalSection = sections[key] + originalSection!!.mergeSection(updatedSection!!) + } else { + sections[key] = updatedSection + } + } + } + + fun loadSettings(gameId: String, view: SettingsActivityView) { + this.gameId = gameId + loadSettings(view) + } + + fun saveSettings(view: SettingsActivityView) { + if (TextUtils.isEmpty(gameId)) { + view.showToastMessage( + YuzuApplication.appContext.getString(R.string.ini_saved), + false + ) + + for ((fileName, sectionNames) in configFileSectionsMap) { + val iniSections = TreeMap() + for (section in sectionNames) { + iniSections[section] = sections[section]!! + } + + SettingsFile.saveFile(fileName, iniSections, view) + } + } else { + // Custom game settings + view.showToastMessage( + YuzuApplication.appContext.getString(R.string.gameid_saved, gameId), + false + ) + + SettingsFile.saveCustomGameSettings(gameId, sections) + } + } + + companion object { + const val SECTION_GENERAL = "General" + const val SECTION_SYSTEM = "System" + const val SECTION_RENDERER = "Renderer" + const val SECTION_AUDIO = "Audio" + const val SECTION_CPU = "Cpu" + + const val PREF_OVERLAY_INIT = "OverlayInit" + const val PREF_CONTROL_SCALE = "controlScale" + const val PREF_TOUCH_ENABLED = "isTouchEnabled" + const val PREF_BUTTON_TOGGLE_0 = "buttonToggleO" + const val PREF_BUTTON_TOGGLE_1 = "buttonToggle1" + const val PREF_BUTTON_TOGGLE_2 = "buttonToggle2" + const val PREF_BUTTON_TOGGLE_3 = "buttonToggle3" + const val PREF_BUTTON_TOGGLE_4 = "buttonToggle4" + const val PREF_BUTTON_TOGGLE_5 = "buttonToggle5" + const val PREF_BUTTON_TOGGLE_6 = "buttonToggle6" + const val PREF_BUTTON_TOGGLE_7 = "buttonToggle7" + const val PREF_BUTTON_TOGGLE_8 = "buttonToggle8" + const val PREF_BUTTON_TOGGLE_9 = "buttonToggle9" + const val PREF_BUTTON_TOGGLE_10 = "buttonToggle10" + const val PREF_BUTTON_TOGGLE_11 = "buttonToggle11" + const val PREF_BUTTON_TOGGLE_12 = "buttonToggle12" + const val PREF_BUTTON_TOGGLE_13 = "buttonToggle13" + const val PREF_BUTTON_TOGGLE_14 = "buttonToggle14" + + const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter" + const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable" + const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout" + const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps" + const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay" + + const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch" + + private val configFileSectionsMap: MutableMap> = HashMap() + + init { + configFileSectionsMap[SettingsFile.FILE_NAME_CONFIG] = + listOf( + SECTION_GENERAL, + SECTION_SYSTEM, + SECTION_RENDERER, + SECTION_AUDIO, + SECTION_CPU + ) + } + } +}