From 14d156701f63685397d953cdd59570fbfcc7b098 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Tue, 7 Mar 2023 21:14:47 -0500 Subject: [PATCH] android: Convert SettingsFragmentPresenter to Kotlin --- .../ui/SettingsFragmentPresenter.java | 184 ---------- .../settings/ui/SettingsFragmentPresenter.kt | 333 ++++++++++++++++++ 2 files changed, 333 insertions(+), 184 deletions(-) delete mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.java create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.java deleted file mode 100644 index 49447e606..000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.yuzu.yuzu_emu.features.settings.ui; - -import android.text.TextUtils; - -import org.yuzu.yuzu_emu.R; -import org.yuzu.yuzu_emu.features.settings.model.Setting; -import org.yuzu.yuzu_emu.features.settings.model.SettingSection; -import org.yuzu.yuzu_emu.features.settings.model.Settings; -import org.yuzu.yuzu_emu.features.settings.model.StringSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.CheckBoxSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.DateTimeSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.HeaderSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem; -import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting; -import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting; -import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile; - -import java.util.ArrayList; - -public final class SettingsFragmentPresenter { - private SettingsFragmentView mView; - - private String mMenuTag; - private String mGameID; - - private Settings mSettings; - private ArrayList mSettingsList; - - public SettingsFragmentPresenter(SettingsFragmentView view) { - mView = view; - } - - public void onCreate(String menuTag, String gameId) { - mGameID = gameId; - mMenuTag = menuTag; - } - - public void onViewCreated(Settings settings) { - setSettings(settings); - } - - /** - * If the screen is rotated, the Activity will forget the settings map. This fragment - * won't, though; so rather than have the Activity reload from disk, have the fragment pass - * the settings map back to the Activity. - */ - public void onAttach() { - if (mSettings != null) { - mView.passSettingsToActivity(mSettings); - } - } - - public void putSetting(Setting setting) { - mSettings.getSection(setting.getSection()).putSetting(setting); - } - - private StringSetting asStringSetting(Setting setting) { - if (setting == null) { - return null; - } - - StringSetting stringSetting = new StringSetting(setting.getKey(), setting.getSection(), setting.getValueAsString()); - putSetting(stringSetting); - return stringSetting; - } - - public void loadDefaultSettings() { - loadSettingsList(); - } - - public void setSettings(Settings settings) { - if (mSettingsList == null && settings != null) { - mSettings = settings; - - loadSettingsList(); - } else { - mView.getActivity().setTitle(R.string.preferences_settings); - mView.showSettingsList(mSettingsList); - } - } - - private void loadSettingsList() { - if (!TextUtils.isEmpty(mGameID)) { - mView.getActivity().setTitle("Game Settings: " + mGameID); - } - ArrayList sl = new ArrayList<>(); - - if (mMenuTag == null) { - return; - } - - switch (mMenuTag) { - case SettingsFile.FILE_NAME_CONFIG: - addConfigSettings(sl); - break; - case Settings.SECTION_GENERAL: - addGeneralSettings(sl); - break; - case Settings.SECTION_SYSTEM: - addSystemSettings(sl); - break; - case Settings.SECTION_RENDERER: - addGraphicsSettings(sl); - break; - case Settings.SECTION_AUDIO: - addAudioSettings(sl); - break; - default: - mView.showToastMessage("Unimplemented menu", false); - return; - } - - mSettingsList = sl; - mView.showSettingsList(mSettingsList); - } - - private void addConfigSettings(ArrayList sl) { - mView.getActivity().setTitle(R.string.preferences_settings); - - sl.add(new SubmenuSetting(null, null, R.string.preferences_general, 0, Settings.SECTION_GENERAL)); - sl.add(new SubmenuSetting(null, null, R.string.preferences_system, 0, Settings.SECTION_SYSTEM)); - 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); - - SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); - Setting frameLimitEnable = rendererSection.getSetting(SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT); - Setting frameLimitValue = rendererSection.getSetting(SettingsFile.KEY_RENDERER_SPEED_LIMIT); - - sl.add(new CheckBoxSetting(SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT, Settings.SECTION_RENDERER, R.string.frame_limit_enable, R.string.frame_limit_enable_description, true, frameLimitEnable)); - sl.add(new SliderSetting(SettingsFile.KEY_RENDERER_SPEED_LIMIT, Settings.SECTION_RENDERER, R.string.frame_limit_slider, R.string.frame_limit_slider_description, 1, 200, "%", 100, frameLimitValue)); - - SettingSection cpuSection = mSettings.getSection(Settings.SECTION_CPU); - Setting cpuAccuracy = cpuSection.getSetting(SettingsFile.KEY_CPU_ACCURACY); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_CPU_ACCURACY, Settings.SECTION_CPU, R.string.cpu_accuracy, 0, R.array.cpuAccuracyNames, R.array.cpuAccuracyValues, 0, cpuAccuracy)); - } - - private void addSystemSettings(ArrayList sl) { - mView.getActivity().setTitle(R.string.preferences_system); - - SettingSection systemSection = mSettings.getSection(Settings.SECTION_SYSTEM); - Setting dockedMode = systemSection.getSetting(SettingsFile.KEY_USE_DOCKED_MODE); - Setting region = systemSection.getSetting(SettingsFile.KEY_REGION_INDEX); - Setting language = systemSection.getSetting(SettingsFile.KEY_LANGUAGE_INDEX); - - sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_DOCKED_MODE, Settings.SECTION_SYSTEM, R.string.use_docked_mode, R.string.use_docked_mode_description, true, dockedMode)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_REGION_INDEX, Settings.SECTION_SYSTEM, R.string.emulated_region, 0, R.array.regionNames, R.array.regionValues, -1, region)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_LANGUAGE_INDEX, Settings.SECTION_SYSTEM, R.string.emulated_language, 0, R.array.languageNames, R.array.languageValues, 1, language)); - } - - private void addGraphicsSettings(ArrayList sl) { - mView.getActivity().setTitle(R.string.preferences_graphics); - - SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); - Setting rendererBackend = rendererSection.getSetting(SettingsFile.KEY_RENDERER_BACKEND); - Setting rendererAccuracy = rendererSection.getSetting(SettingsFile.KEY_RENDERER_ACCURACY); - Setting rendererReolution = rendererSection.getSetting(SettingsFile.KEY_RENDERER_RESOLUTION); - Setting rendererAspectRation = rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASPECT_RATIO); - Setting rendererForceMaxClocks = rendererSection.getSetting(SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK); - Setting rendererAsynchronousShaders = rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS); - Setting rendererDebug = rendererSection.getSetting(SettingsFile.KEY_RENDERER_DEBUG); - - sl.add(new SingleChoiceSetting(SettingsFile.KEY_RENDERER_BACKEND, Settings.SECTION_RENDERER, R.string.renderer_api, 0, R.array.rendererApiNames, R.array.rendererApiValues, 1, rendererBackend)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_RENDERER_ACCURACY, Settings.SECTION_RENDERER, R.string.renderer_accuracy, 0, R.array.rendererAccuracyNames, R.array.rendererAccuracyValues, 1, rendererAccuracy)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_RENDERER_RESOLUTION, Settings.SECTION_RENDERER, R.string.renderer_resolution, 0, R.array.rendererResolutionNames, R.array.rendererResolutionValues, 2, rendererReolution)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_RENDERER_ASPECT_RATIO, Settings.SECTION_RENDERER, R.string.renderer_aspect_ratio, 0, R.array.rendererAspectRatioNames, R.array.rendererAspectRatioValues, 0, rendererAspectRation)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK, Settings.SECTION_RENDERER, R.string.renderer_force_max_clock, R.string.renderer_force_max_clock_description, true, rendererForceMaxClocks)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS, Settings.SECTION_RENDERER, R.string.renderer_asynchronous_shaders, R.string.renderer_asynchronous_shaders_description, false, rendererAsynchronousShaders)); - sl.add(new CheckBoxSetting(SettingsFile.KEY_RENDERER_DEBUG, Settings.SECTION_RENDERER, R.string.renderer_debug, R.string.renderer_debug_description, false, rendererDebug)); - } - - private void addAudioSettings(ArrayList sl) { - mView.getActivity().setTitle(R.string.preferences_audio); - - SettingSection audioSection = mSettings.getSection(Settings.SECTION_AUDIO); - Setting audioVolume = audioSection.getSetting(SettingsFile.KEY_AUDIO_VOLUME); - - sl.add(new SliderSetting(SettingsFile.KEY_AUDIO_VOLUME, Settings.SECTION_AUDIO, R.string.audio_volume, R.string.audio_volume_description, 0, 100, "%", 100, audioVolume)); - } -} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt new file mode 100644 index 000000000..e4058ffc2 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -0,0 +1,333 @@ +package org.yuzu.yuzu_emu.features.settings.ui + +import android.text.TextUtils +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.features.settings.model.Setting +import org.yuzu.yuzu_emu.features.settings.model.Settings +import org.yuzu.yuzu_emu.features.settings.model.StringSetting +import org.yuzu.yuzu_emu.features.settings.model.view.* +import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile + +class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) { + private var menuTag: String? = null + private lateinit var gameId: String + private var settings: Settings? = null + private var settingsList: ArrayList? = null + + fun onCreate(menuTag: String, gameId: String) { + this.gameId = gameId + this.menuTag = menuTag + } + + fun onViewCreated(settings: Settings?) { + setSettings(settings) + } + + /** + * If the screen is rotated, the Activity will forget the settings map. This fragment + * won't, though; so rather than have the Activity reload from disk, have the fragment pass + * the settings map back to the Activity. + */ + fun onAttach() { + if (settings != null) { + fragmentView.passSettingsToActivity(settings!!) + } + } + + fun putSetting(setting: Setting) { + settings!!.getSection(setting.section)!!.putSetting(setting) + } + + private fun asStringSetting(setting: Setting?): StringSetting? { + if (setting == null) { + return null + } + val stringSetting = StringSetting(setting.key, setting.section, setting.valueAsString) + putSetting(stringSetting) + return stringSetting + } + + fun loadDefaultSettings() { + loadSettingsList() + } + + fun setSettings(settings: Settings?) { + if (settingsList == null && settings != null) { + this.settings = settings + loadSettingsList() + } else { + fragmentView.fragmentActivity.setTitle(R.string.preferences_settings) + fragmentView.showSettingsList(settingsList!!) + } + } + + private fun loadSettingsList() { + if (!TextUtils.isEmpty(gameId)) { + fragmentView.fragmentActivity.title = "Game Settings: $gameId" + } + val sl = ArrayList() + if (menuTag == null) { + return + } + when (menuTag) { + SettingsFile.FILE_NAME_CONFIG -> addConfigSettings(sl) + Settings.SECTION_GENERAL -> addGeneralSettings(sl) + Settings.SECTION_SYSTEM -> addSystemSettings(sl) + Settings.SECTION_RENDERER -> addGraphicsSettings(sl) + Settings.SECTION_AUDIO -> addAudioSettings(sl) + else -> { + fragmentView.showToastMessage("Unimplemented menu", false) + return + } + } + settingsList = sl + fragmentView.showSettingsList(settingsList!!) + } + + private fun addConfigSettings(sl: ArrayList) { + fragmentView.fragmentActivity.setTitle(R.string.preferences_settings) + sl.apply { + add( + SubmenuSetting( + null, + null, + R.string.preferences_general, + 0, + Settings.SECTION_GENERAL + ) + ) + add( + SubmenuSetting( + null, + null, + R.string.preferences_system, + 0, + Settings.SECTION_SYSTEM + ) + ) + add( + SubmenuSetting( + null, + null, + R.string.preferences_graphics, + 0, + Settings.SECTION_RENDERER + ) + ) + add( + SubmenuSetting( + null, + null, + R.string.preferences_audio, + 0, + Settings.SECTION_AUDIO + ) + ) + } + } + + private fun addGeneralSettings(sl: ArrayList) { + fragmentView.fragmentActivity.setTitle(R.string.preferences_general) + val rendererSection = settings!!.getSection(Settings.SECTION_RENDERER) + val frameLimitEnable = + rendererSection!!.getSetting(SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT) + val frameLimitValue = rendererSection.getSetting(SettingsFile.KEY_RENDERER_SPEED_LIMIT) + val cpuSection = settings!!.getSection(Settings.SECTION_CPU) + val cpuAccuracy = cpuSection!!.getSetting(SettingsFile.KEY_CPU_ACCURACY) + sl.apply { + add( + CheckBoxSetting( + SettingsFile.KEY_RENDERER_USE_SPEED_LIMIT, + Settings.SECTION_RENDERER, + frameLimitEnable, + R.string.frame_limit_enable, + R.string.frame_limit_enable_description, + true + ) + ) + add( + SliderSetting( + SettingsFile.KEY_RENDERER_SPEED_LIMIT, + Settings.SECTION_RENDERER, + frameLimitValue, + R.string.frame_limit_slider, + R.string.frame_limit_slider_description, + 1, + 200, + "%", + 100 + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_CPU_ACCURACY, + Settings.SECTION_CPU, + cpuAccuracy, + R.string.cpu_accuracy, + 0, + R.array.cpuAccuracyNames, + R.array.cpuAccuracyValues, + 0 + ) + ) + } + } + + private fun addSystemSettings(sl: ArrayList) { + fragmentView.fragmentActivity.setTitle(R.string.preferences_system) + val systemSection = settings!!.getSection(Settings.SECTION_SYSTEM) + val dockedMode = systemSection!!.getSetting(SettingsFile.KEY_USE_DOCKED_MODE) + val region = systemSection.getSetting(SettingsFile.KEY_REGION_INDEX) + val language = systemSection.getSetting(SettingsFile.KEY_LANGUAGE_INDEX) + sl.apply { + add( + CheckBoxSetting( + SettingsFile.KEY_USE_DOCKED_MODE, + Settings.SECTION_SYSTEM, + dockedMode, + R.string.use_docked_mode, + R.string.use_docked_mode_description, + true, + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_REGION_INDEX, + Settings.SECTION_SYSTEM, + region, + R.string.emulated_region, + 0, + R.array.regionNames, + R.array.regionValues, + -1 + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_LANGUAGE_INDEX, + Settings.SECTION_SYSTEM, + language, + R.string.emulated_language, + 0, + R.array.languageNames, + R.array.languageValues, + 1 + ) + ) + } + } + + private fun addGraphicsSettings(sl: ArrayList) { + fragmentView.fragmentActivity.setTitle(R.string.preferences_graphics) + val rendererSection = settings!!.getSection(Settings.SECTION_RENDERER) + val rendererBackend = rendererSection!!.getSetting(SettingsFile.KEY_RENDERER_BACKEND) + val rendererAccuracy = rendererSection.getSetting(SettingsFile.KEY_RENDERER_ACCURACY) + val rendererResolution = rendererSection.getSetting(SettingsFile.KEY_RENDERER_RESOLUTION) + val rendererAspectRatio = + rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASPECT_RATIO) + val rendererForceMaxClocks = + rendererSection.getSetting(SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK) + val rendererAsynchronousShaders = + rendererSection.getSetting(SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS) + val rendererDebug = rendererSection.getSetting(SettingsFile.KEY_RENDERER_DEBUG) + sl.apply { + add( + SingleChoiceSetting( + SettingsFile.KEY_RENDERER_BACKEND, + Settings.SECTION_RENDERER, + rendererBackend, + R.string.renderer_api, + 0, + R.array.rendererApiNames, + R.array.rendererApiValues, + 1 + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_RENDERER_ACCURACY, + Settings.SECTION_RENDERER, + rendererAccuracy, + R.string.renderer_accuracy, + 0, + R.array.rendererAccuracyNames, + R.array.rendererAccuracyValues, + 1 + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_RENDERER_RESOLUTION, + Settings.SECTION_RENDERER, + rendererResolution, + R.string.renderer_resolution, + 0, + R.array.rendererResolutionNames, + R.array.rendererResolutionValues, + 2 + ) + ) + add( + SingleChoiceSetting( + SettingsFile.KEY_RENDERER_ASPECT_RATIO, + Settings.SECTION_RENDERER, + rendererAspectRatio, + R.string.renderer_aspect_ratio, + 0, + R.array.rendererAspectRatioNames, + R.array.rendererAspectRatioValues, + 0 + ) + ) + add( + CheckBoxSetting( + SettingsFile.KEY_RENDERER_FORCE_MAX_CLOCK, + Settings.SECTION_RENDERER, + rendererForceMaxClocks, + R.string.renderer_force_max_clock, + R.string.renderer_force_max_clock_description, + true + ) + ) + add( + CheckBoxSetting( + SettingsFile.KEY_RENDERER_ASYNCHRONOUS_SHADERS, + Settings.SECTION_RENDERER, + rendererAsynchronousShaders, + R.string.renderer_asynchronous_shaders, + R.string.renderer_asynchronous_shaders_description, + false + ) + ) + add( + CheckBoxSetting( + SettingsFile.KEY_RENDERER_DEBUG, + Settings.SECTION_RENDERER, + rendererDebug, + R.string.renderer_debug, + R.string.renderer_debug_description, + false + ) + ) + } + } + + private fun addAudioSettings(sl: ArrayList) { + fragmentView.fragmentActivity.setTitle(R.string.preferences_audio) + val audioSection = settings!!.getSection(Settings.SECTION_AUDIO) + val audioVolume = audioSection!!.getSetting(SettingsFile.KEY_AUDIO_VOLUME) + sl.add( + SliderSetting( + SettingsFile.KEY_AUDIO_VOLUME, + Settings.SECTION_AUDIO, + audioVolume, + R.string.audio_volume, + R.string.audio_volume_description, + 0, + 100, + "%", + 100 + ) + ) + } +}