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 index b59815770..bbe0097d6 100644 --- 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 @@ -13,6 +13,8 @@ import java.util.* class Settings { private var gameId: String? = null + var isLoaded = false + /** * A HashMap, SettingSection> that constructs a new SettingSection instead of returning null * when getting a key not already in the map @@ -43,6 +45,7 @@ class Settings { if (!TextUtils.isEmpty(gameId)) { loadCustomGameSettings(gameId!!, view) } + isLoaded = true } private fun loadYuzuSettings(view: SettingsActivityView) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt index 0e33a85bb..7141604d5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt @@ -3,5 +3,5 @@ package org.yuzu.yuzu_emu.features.settings.model import androidx.lifecycle.ViewModel class SettingsViewModel : ViewModel() { - var settings = Settings() + val settings = Settings() } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt index 1683f511f..60858ecd6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt @@ -35,11 +35,7 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView { private val settingsViewModel: SettingsViewModel by viewModels() - override var settings: Settings - get() = settingsViewModel.settings - set(settings) { - settingsViewModel.settings = settings - } + override val settings: Settings get() = settingsViewModel.settings override fun onCreate(savedInstanceState: Bundle?) { ThemeHelper.setTheme(this) @@ -179,14 +175,14 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView { ).show() } - override fun onSettingsFileLoaded(settings: Settings) { + override fun onSettingsFileLoaded() { val fragment: SettingsFragmentView? = settingsFragment - fragment?.onSettingsFileLoaded(settings) + fragment?.loadSettingsList() } override fun onSettingsFileNotFound() { val fragment: SettingsFragmentView? = settingsFragment - fragment?.loadDefaultSettings() + fragment?.loadSettingsList() } override fun showToastMessage(message: String, is_long: Boolean) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt index 60df9d5b5..2a86e4463 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt @@ -36,7 +36,7 @@ class SettingsActivityPresenter(private val activityView: SettingsActivityView) } private fun loadSettingsUI() { - if (settings.isEmpty) { + if (!settings.isLoaded) { if (!TextUtils.isEmpty(gameId)) { settings.loadSettings(gameId, activityView) } else { @@ -44,7 +44,7 @@ class SettingsActivityPresenter(private val activityView: SettingsActivityView) } } activityView.showSettingsFragment(menuTag, false, gameId) - activityView.onSettingsFileLoaded(settings) + activityView.onSettingsFileLoaded() } private fun prepareDirectoriesIfNeeded() { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt index f19ca0e30..2b6dd2fce 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt @@ -24,19 +24,17 @@ interface SettingsActivityView { * loaded from disk, so that each Fragment doesn't need to perform its own * read operation. * - * @return A possibly null HashMap of Settings. + * @return A HashMap of Settings. */ - var settings: Settings + val settings: Settings /** - * Called when an asynchronous load operation completes. - * - * @param settings The (possibly null) result of the ini load operation. + * Called when a load operation completes. */ - fun onSettingsFileLoaded(settings: Settings) + fun onSettingsFileLoaded() /** - * Called when an asynchronous load operation fails. + * Called when a load operation fails. */ fun onSettingsFileNotFound() diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt index 1f81f6e62..cdbdc78a0 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt @@ -12,6 +12,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -93,7 +94,7 @@ class SettingsAdapter( return getItem(position).type } - fun setSettings(settings: ArrayList?) { + fun setSettingsList(settings: ArrayList?) { this.settings = settings notifyDataSetChanged() } @@ -144,7 +145,7 @@ class SettingsAdapter( calendar.timeZone = TimeZone.getTimeZone("UTC") var timeFormat: Int = TimeFormat.CLOCK_12H - if (DateFormat.is24HourFormat(fragmentView.fragmentActivity)) { + if (DateFormat.is24HourFormat(fragmentView.activityView as AppCompatActivity)) { timeFormat = TimeFormat.CLOCK_24H } @@ -161,7 +162,7 @@ class SettingsAdapter( datePicker.addOnPositiveButtonClickListener { timePicker.show( - fragmentView.fragmentActivity.supportFragmentManager, + (fragmentView.activityView as AppCompatActivity).supportFragmentManager, "TimePicker" ) } @@ -177,7 +178,7 @@ class SettingsAdapter( item.setSelectedValue(rtcString) clickedItem = null } - datePicker.show(fragmentView.fragmentActivity.supportFragmentManager, "DatePicker") + datePicker.show((fragmentView.activityView as AppCompatActivity).supportFragmentManager, "DatePicker") } fun onSliderClick(item: SliderSetting, position: Int) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt index f522a82b7..a9cfdc21f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt @@ -12,7 +12,6 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.divider.MaterialDividerItemDecoration import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding @@ -21,10 +20,9 @@ import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem class SettingsFragment : Fragment(), SettingsFragmentView { - override lateinit var fragmentActivity: FragmentActivity + override var activityView: SettingsActivityView? = null - private val presenter = SettingsFragmentPresenter(this) - private var activityView: SettingsActivityView? = null + private val fragmentPresenter = SettingsFragmentPresenter(this) private var settingsAdapter: SettingsAdapter? = null private var _binding: FragmentSettingsBinding? = null @@ -32,15 +30,14 @@ class SettingsFragment : Fragment(), SettingsFragmentView { override fun onAttach(context: Context) { super.onAttach(context) - activityView = context as SettingsActivityView - fragmentActivity = requireActivity() + activityView = requireActivity() as SettingsActivityView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val menuTag = requireArguments().getString(ARGUMENT_MENU_TAG) val gameId = requireArguments().getString(ARGUMENT_GAME_ID) - presenter.onCreate(menuTag!!, gameId!!) + fragmentPresenter.onCreate(menuTag!!, gameId!!) } override fun onCreateView( @@ -61,8 +58,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView { layoutManager = LinearLayoutManager(activity) addItemDecoration(dividerDecoration) } - val activity = activity as SettingsActivityView? - presenter.onViewCreated(activity!!.settings) + fragmentPresenter.onViewCreated() setInsets() } @@ -75,16 +71,12 @@ class SettingsFragment : Fragment(), SettingsFragmentView { } } - override fun onSettingsFileLoaded(settings: Settings) { - presenter.setSettings(settings) - } - override fun showSettingsList(settingsList: ArrayList) { - settingsAdapter!!.setSettings(settingsList) + settingsAdapter!!.setSettingsList(settingsList) } - override fun loadDefaultSettings() { - presenter.loadDefaultSettings() + override fun loadSettingsList() { + fragmentPresenter.loadSettingsList() } override fun loadSubMenu(menuKey: String) { @@ -100,7 +92,7 @@ class SettingsFragment : Fragment(), SettingsFragmentView { } override fun putSetting(setting: Setting) { - presenter.putSetting(setting) + fragmentPresenter.putSetting(setting) } override fun onSettingChanged() { 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 index 8eaa0a0fa..e2b1326f8 100644 --- 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 @@ -4,58 +4,37 @@ package org.yuzu.yuzu_emu.features.settings.ui import android.text.TextUtils +import androidx.appcompat.app.AppCompatActivity 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 + private val settingsActivity get() = fragmentView.activityView as AppCompatActivity + private val settings get() = fragmentView.activityView!!.settings + fun onCreate(menuTag: String, gameId: String) { this.gameId = gameId this.menuTag = menuTag } - fun onViewCreated(settings: Settings) { - setSettings(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() { + fun onViewCreated() { loadSettingsList() } - fun setSettings(settings: Settings) { - if (settingsList == null) { - this.settings = settings - loadSettingsList() - } else { - fragmentView.fragmentActivity.setTitle(R.string.preferences_settings) - fragmentView.showSettingsList(settingsList!!) - } + fun putSetting(setting: Setting) { + settings.getSection(setting.section)!!.putSetting(setting) } - private fun loadSettingsList() { + fun loadSettingsList() { if (!TextUtils.isEmpty(gameId)) { - fragmentView.fragmentActivity.title = "Game Settings: $gameId" + settingsActivity.title = "Game Settings: $gameId" } val sl = ArrayList() if (menuTag == null) { @@ -77,7 +56,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } private fun addConfigSettings(sl: ArrayList) { - fragmentView.fragmentActivity.setTitle(R.string.preferences_settings) + settingsActivity.setTitle(R.string.preferences_settings) sl.apply { add( SubmenuSetting( @@ -119,12 +98,12 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } private fun addGeneralSettings(sl: ArrayList) { - fragmentView.fragmentActivity.setTitle(R.string.preferences_general) - val rendererSection = settings!!.getSection(Settings.SECTION_RENDERER) + settingsActivity.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 cpuSection = settings.getSection(Settings.SECTION_CPU) val cpuAccuracy = cpuSection!!.getSetting(SettingsFile.KEY_CPU_ACCURACY) sl.apply { add( @@ -166,8 +145,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } private fun addSystemSettings(sl: ArrayList) { - fragmentView.fragmentActivity.setTitle(R.string.preferences_system) - val systemSection = settings!!.getSection(Settings.SECTION_SYSTEM) + settingsActivity.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) @@ -210,8 +189,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } private fun addGraphicsSettings(sl: ArrayList) { - fragmentView.fragmentActivity.setTitle(R.string.preferences_graphics) - val rendererSection = settings!!.getSection(Settings.SECTION_RENDERER) + settingsActivity.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) @@ -305,8 +284,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } private fun addAudioSettings(sl: ArrayList) { - fragmentView.fragmentActivity.setTitle(R.string.preferences_audio) - val audioSection = settings!!.getSection(Settings.SECTION_AUDIO) + settingsActivity.setTitle(R.string.preferences_audio) + val audioSection = settings.getSection(Settings.SECTION_AUDIO) val audioVolume = audioSection!!.getSetting(SettingsFile.KEY_AUDIO_VOLUME) sl.add( SliderSetting( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt index 2d9700fca..9a14c5795 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt @@ -3,9 +3,7 @@ package org.yuzu.yuzu_emu.features.settings.ui -import androidx.fragment.app.FragmentActivity 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.view.SettingsItem /** @@ -13,14 +11,6 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem * this type of view will each display a layer of the setting hierarchy. */ interface SettingsFragmentView { - /** - * Called by the containing Activity to notify the Fragment that an - * asynchronous load operation completed. - * - * @param settings The (possibly null) result of the ini load operation. - */ - fun onSettingsFileLoaded(settings: Settings) - /** * Pass an ArrayList to the View so that it can be displayed on screen. * @@ -29,15 +19,14 @@ interface SettingsFragmentView { fun showSettingsList(settingsList: ArrayList) /** - * Called by the containing Activity when an asynchronous load operation fails. - * Instructs the Fragment to load the settings screen with defaults selected. + * Instructs the Fragment to load the settings screen. */ - fun loadDefaultSettings() + fun loadSettingsList() /** * @return The Fragment's containing activity. */ - val fragmentActivity: FragmentActivity + val activityView: SettingsActivityView? /** * Tell the Fragment to tell the containing Activity to show a new