android: Store settings object in viewmodel

This commit is contained in:
Charles Lombardo 2023-03-22 22:40:31 -04:00 committed by bunnei
parent 06e58cf088
commit aaefe8a0e0
7 changed files with 45 additions and 57 deletions

View file

@ -0,0 +1,7 @@
package org.yuzu.yuzu_emu.features.settings.model
import androidx.lifecycle.ViewModel
class SettingsViewModel : ViewModel() {
var settings = Settings()
}

View file

@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
@ -23,7 +24,7 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding
import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.features.settings.ui.SettingsFragment.Companion.newInstance import org.yuzu.yuzu_emu.features.settings.model.SettingsViewModel
import org.yuzu.yuzu_emu.utils.* import org.yuzu.yuzu_emu.utils.*
class SettingsActivity : AppCompatActivity(), SettingsActivityView { class SettingsActivity : AppCompatActivity(), SettingsActivityView {
@ -32,6 +33,14 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
private lateinit var binding: ActivitySettingsBinding private lateinit var binding: ActivitySettingsBinding
private val settingsViewModel: SettingsViewModel by viewModels()
override var settings: Settings
get() = settingsViewModel.settings
set(settings) {
settingsViewModel.settings = settings
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
ThemeHelper.setTheme(this) ThemeHelper.setTheme(this)
@ -93,9 +102,10 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
} }
override fun showSettingsFragment(menuTag: String, addToStack: Boolean, gameId: String) { override fun showSettingsFragment(menuTag: String, addToStack: Boolean, gameId: String) {
if (!addToStack && fragment != null) { if (!addToStack && settingsFragment != null) {
return return
} }
val transaction = supportFragmentManager.beginTransaction() val transaction = supportFragmentManager.beginTransaction()
if (addToStack) { if (addToStack) {
if (areSystemAnimationsEnabled()) { if (areSystemAnimationsEnabled()) {
@ -108,7 +118,11 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
} }
transaction.addToBackStack(null) transaction.addToBackStack(null)
} }
transaction.replace(R.id.frame_content, newInstance(menuTag, gameId), FRAGMENT_TAG) transaction.replace(
R.id.frame_content,
SettingsFragment.newInstance(menuTag, gameId),
FRAGMENT_TAG
)
transaction.commit() transaction.commit()
} }
@ -165,19 +179,13 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
).show() ).show()
} }
override var settings: Settings? override fun onSettingsFileLoaded(settings: Settings) {
get() = presenter.settings val fragment: SettingsFragmentView? = settingsFragment
set(settings) {
presenter.settings = settings
}
override fun onSettingsFileLoaded(settings: Settings?) {
val fragment: SettingsFragmentView? = fragment
fragment?.onSettingsFileLoaded(settings) fragment?.onSettingsFileLoaded(settings)
} }
override fun onSettingsFileNotFound() { override fun onSettingsFileNotFound() {
val fragment: SettingsFragmentView? = fragment val fragment: SettingsFragmentView? = settingsFragment
fragment?.loadDefaultSettings() fragment?.loadDefaultSettings()
} }
@ -193,7 +201,7 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
presenter.onSettingChanged() presenter.onSettingChanged()
} }
private val fragment: SettingsFragment? private val settingsFragment: SettingsFragment?
get() = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as SettingsFragment? get() = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as SettingsFragment?
private fun setInsets() { private fun setInsets() {

View file

@ -16,17 +16,17 @@ import org.yuzu.yuzu_emu.utils.Log
import java.io.File import java.io.File
class SettingsActivityPresenter(private val activityView: SettingsActivityView) { class SettingsActivityPresenter(private val activityView: SettingsActivityView) {
var settings: Settings? = Settings() val settings: Settings get() = activityView.settings
private var shouldSave = false private var shouldSave = false
private var directoryStateReceiver: DirectoryStateReceiver? = null private var directoryStateReceiver: DirectoryStateReceiver? = null
private lateinit var menuTag: String private lateinit var menuTag: String
private lateinit var gameId: String private lateinit var gameId: String
fun onCreate(savedInstanceState: Bundle?, menuTag: String, gameId: String) { fun onCreate(savedInstanceState: Bundle?, menuTag: String, gameId: String) {
if (savedInstanceState == null) { this.menuTag = menuTag
this.menuTag = menuTag this.gameId = gameId
this.gameId = gameId if (savedInstanceState != null) {
} else {
shouldSave = savedInstanceState.getBoolean(KEY_SHOULD_SAVE) shouldSave = savedInstanceState.getBoolean(KEY_SHOULD_SAVE)
} }
} }
@ -36,11 +36,11 @@ class SettingsActivityPresenter(private val activityView: SettingsActivityView)
} }
private fun loadSettingsUI() { private fun loadSettingsUI() {
if (settings!!.isEmpty) { if (settings.isEmpty) {
if (!TextUtils.isEmpty(gameId)) { if (!TextUtils.isEmpty(gameId)) {
settings!!.loadSettings(gameId, activityView) settings.loadSettings(gameId, activityView)
} else { } else {
settings!!.loadSettings(activityView) settings.loadSettings(activityView)
} }
} }
activityView.showSettingsFragment(menuTag, false, gameId) activityView.showSettingsFragment(menuTag, false, gameId)
@ -81,9 +81,9 @@ class SettingsActivityPresenter(private val activityView: SettingsActivityView)
activityView.stopListeningToDirectoryInitializationService(directoryStateReceiver!!) activityView.stopListeningToDirectoryInitializationService(directoryStateReceiver!!)
directoryStateReceiver = null directoryStateReceiver = null
} }
if (settings != null && finishing && shouldSave) { if (finishing && shouldSave) {
Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...") Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...")
settings!!.saveSettings(activityView) settings.saveSettings(activityView)
} }
NativeLibrary.ReloadSettings() NativeLibrary.ReloadSettings()
} }

View file

@ -26,14 +26,14 @@ interface SettingsActivityView {
* *
* @return A possibly null HashMap of Settings. * @return A possibly null HashMap of Settings.
*/ */
var settings: Settings? var settings: Settings
/** /**
* Called when an asynchronous load operation completes. * Called when an asynchronous load operation completes.
* *
* @param settings The (possibly null) result of the ini load operation. * @param settings The (possibly null) result of the ini load operation.
*/ */
fun onSettingsFileLoaded(settings: Settings?) fun onSettingsFileLoaded(settings: Settings)
/** /**
* Called when an asynchronous load operation fails. * Called when an asynchronous load operation fails.

View file

@ -34,7 +34,6 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
super.onAttach(context) super.onAttach(context)
activityView = context as SettingsActivityView activityView = context as SettingsActivityView
fragmentActivity = requireActivity() fragmentActivity = requireActivity()
presenter.onAttach()
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -76,16 +75,10 @@ class SettingsFragment : Fragment(), SettingsFragmentView {
} }
} }
override fun onSettingsFileLoaded(settings: Settings?) { override fun onSettingsFileLoaded(settings: Settings) {
presenter.setSettings(settings) presenter.setSettings(settings)
} }
override fun passSettingsToActivity(settings: Settings) {
if (activityView != null) {
activityView!!.settings = settings
}
}
override fun showSettingsList(settingsList: ArrayList<SettingsItem>) { override fun showSettingsList(settingsList: ArrayList<SettingsItem>) {
settingsAdapter!!.setSettings(settingsList) settingsAdapter!!.setSettings(settingsList)
} }

View file

@ -22,21 +22,10 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
this.menuTag = menuTag this.menuTag = menuTag
} }
fun onViewCreated(settings: Settings?) { fun onViewCreated(settings: Settings) {
setSettings(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) { fun putSetting(setting: Setting) {
settings!!.getSection(setting.section)!!.putSetting(setting) settings!!.getSection(setting.section)!!.putSetting(setting)
} }
@ -54,8 +43,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
loadSettingsList() loadSettingsList()
} }
fun setSettings(settings: Settings?) { fun setSettings(settings: Settings) {
if (settingsList == null && settings != null) { if (settingsList == null) {
this.settings = settings this.settings = settings
loadSettingsList() loadSettingsList()
} else { } else {

View file

@ -19,16 +19,7 @@ interface SettingsFragmentView {
* *
* @param settings The (possibly null) result of the ini load operation. * @param settings The (possibly null) result of the ini load operation.
*/ */
fun onSettingsFileLoaded(settings: Settings?) fun onSettingsFileLoaded(settings: Settings)
/**
* Pass a settings HashMap to the containing activity, so that it can
* share the HashMap with other SettingsFragments; useful so that rotations
* do not require an additional load operation.
*
* @param settings An ArrayList containing all the settings HashMaps.
*/
fun passSettingsToActivity(settings: Settings)
/** /**
* Pass an ArrayList to the View so that it can be displayed on screen. * Pass an ArrayList to the View so that it can be displayed on screen.