Browse Source

android: Store settings object in viewmodel

pull/15/merge
Charles Lombardo 3 years ago
committed by bunnei
parent
commit
aaefe8a0e0
  1. 7
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt
  2. 34
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
  3. 20
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt
  4. 4
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt
  5. 9
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
  6. 17
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
  7. 11
      src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt

7
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/SettingsViewModel.kt

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

34
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt

@ -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?
get() = presenter.settings
set(settings) {
presenter.settings = settings
}
override fun onSettingsFileLoaded(settings: Settings?) {
val fragment: SettingsFragmentView? = fragment
override fun onSettingsFileLoaded(settings: Settings) {
val fragment: SettingsFragmentView? = settingsFragment
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() {

20
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityPresenter.kt

@ -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.gameId = gameId
} else {
this.menuTag = menuTag
this.gameId = gameId
if (savedInstanceState != null) {
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()
} }

4
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivityView.kt

@ -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.

9
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt

@ -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)
} }

17
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt

@ -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?) {
if (settingsList == null && settings != null) {
fun setSettings(settings: Settings) {
if (settingsList == null) {
this.settings = settings this.settings = settings
loadSettingsList() loadSettingsList()
} else { } else {

11
src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentView.kt

@ -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?)
/**
* 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)
fun onSettingsFileLoaded(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.

Loading…
Cancel
Save