android: Save global settings in onStop
This commit is contained in:
		@@ -3,33 +3,9 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.model
 | 
			
		||||
 | 
			
		||||
import android.text.TextUtils
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.YuzuApplication
 | 
			
		||||
import org.yuzu.yuzu_emu.utils.NativeConfig
 | 
			
		||||
 | 
			
		||||
object Settings {
 | 
			
		||||
    private val context get() = YuzuApplication.appContext
 | 
			
		||||
 | 
			
		||||
    fun saveSettings(gameId: String = "") {
 | 
			
		||||
        if (TextUtils.isEmpty(gameId)) {
 | 
			
		||||
            Toast.makeText(
 | 
			
		||||
                context,
 | 
			
		||||
                context.getString(R.string.ini_saved),
 | 
			
		||||
                Toast.LENGTH_SHORT
 | 
			
		||||
            ).show()
 | 
			
		||||
            NativeConfig.saveSettings()
 | 
			
		||||
        } else {
 | 
			
		||||
            // TODO: Save custom game settings
 | 
			
		||||
            Toast.makeText(
 | 
			
		||||
                context,
 | 
			
		||||
                context.getString(R.string.gameid_saved, gameId),
 | 
			
		||||
                Toast.LENGTH_SHORT
 | 
			
		||||
            ).show()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enum class Category {
 | 
			
		||||
        Android,
 | 
			
		||||
        Audio,
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,13 @@ import androidx.lifecycle.repeatOnLifecycle
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment
 | 
			
		||||
import androidx.navigation.navArgs
 | 
			
		||||
import com.google.android.material.color.MaterialColors
 | 
			
		||||
import kotlinx.coroutines.CoroutineScope
 | 
			
		||||
import kotlinx.coroutines.Dispatchers
 | 
			
		||||
import kotlinx.coroutines.flow.collectLatest
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import org.yuzu.yuzu_emu.R
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
 | 
			
		||||
import org.yuzu.yuzu_emu.fragments.ResetSettingsDialogFragment
 | 
			
		||||
import org.yuzu.yuzu_emu.model.SettingsViewModel
 | 
			
		||||
@@ -53,10 +54,6 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        WindowCompat.setDecorFitsSystemWindows(window, false)
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            settingsViewModel.shouldSave = savedInstanceState.getBoolean(KEY_SHOULD_SAVE)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (InsetsHelper.getSystemGestureType(applicationContext) !=
 | 
			
		||||
            InsetsHelper.GESTURE_NAVIGATION
 | 
			
		||||
        ) {
 | 
			
		||||
@@ -127,12 +124,6 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onSaveInstanceState(outState: Bundle) {
 | 
			
		||||
        // Critical: If super method is not called, rotations will be busted.
 | 
			
		||||
        super.onSaveInstanceState(outState)
 | 
			
		||||
        outState.putBoolean(KEY_SHOULD_SAVE, settingsViewModel.shouldSave)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onStart() {
 | 
			
		||||
        super.onStart()
 | 
			
		||||
        // TODO: Load custom settings contextually
 | 
			
		||||
@@ -141,16 +132,10 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If this is called, the user has left the settings screen (potentially through the
 | 
			
		||||
     * home button) and will expect their changes to be persisted. So we kick off an
 | 
			
		||||
     * IntentService which will do so on a background thread.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onStop() {
 | 
			
		||||
        super.onStop()
 | 
			
		||||
        if (isFinishing && settingsViewModel.shouldSave) {
 | 
			
		||||
            Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI...")
 | 
			
		||||
            Settings.saveSettings()
 | 
			
		||||
        CoroutineScope(Dispatchers.IO).launch {
 | 
			
		||||
            NativeConfig.saveSettings()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -160,9 +145,6 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onSettingsReset() {
 | 
			
		||||
        // Prevents saving to a non-existent settings file
 | 
			
		||||
        settingsViewModel.shouldSave = false
 | 
			
		||||
 | 
			
		||||
        // Delete settings file because the user may have changed values that do not exist in the UI
 | 
			
		||||
        NativeConfig.unloadConfig()
 | 
			
		||||
        val settingsFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_CONFIG)
 | 
			
		||||
@@ -194,8 +176,4 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
            windowInsets
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        private const val KEY_SHOULD_SAVE = "should_save"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,6 @@ class SettingsAdapter(
 | 
			
		||||
    fun onBooleanClick(item: SwitchSetting, checked: Boolean) {
 | 
			
		||||
        item.checked = checked
 | 
			
		||||
        settingsViewModel.setShouldReloadSettingsList(true)
 | 
			
		||||
        settingsViewModel.shouldSave = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onSingleChoiceClick(item: SingleChoiceSetting, position: Int) {
 | 
			
		||||
@@ -161,7 +160,6 @@ class SettingsAdapter(
 | 
			
		||||
            epochTime += timePicker.hour.toLong() * 60 * 60
 | 
			
		||||
            epochTime += timePicker.minute.toLong() * 60
 | 
			
		||||
            if (item.value != epochTime) {
 | 
			
		||||
                settingsViewModel.shouldSave = true
 | 
			
		||||
                notifyItemChanged(position)
 | 
			
		||||
                item.value = epochTime
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
 | 
			
		||||
                    .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int ->
 | 
			
		||||
                        settingsViewModel.clickedItem!!.setting.reset()
 | 
			
		||||
                        settingsViewModel.setAdapterItemChanged(position)
 | 
			
		||||
                        settingsViewModel.shouldSave = true
 | 
			
		||||
                    }
 | 
			
		||||
                    .setNegativeButton(android.R.string.cancel, null)
 | 
			
		||||
                    .create()
 | 
			
		||||
@@ -137,24 +136,17 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
 | 
			
		||||
            is SingleChoiceSetting -> {
 | 
			
		||||
                val scSetting = settingsViewModel.clickedItem as SingleChoiceSetting
 | 
			
		||||
                val value = getValueForSingleChoiceSelection(scSetting, which)
 | 
			
		||||
                if (scSetting.selectedValue != value) {
 | 
			
		||||
                    settingsViewModel.shouldSave = true
 | 
			
		||||
                }
 | 
			
		||||
                scSetting.selectedValue = value
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is StringSingleChoiceSetting -> {
 | 
			
		||||
                val scSetting = settingsViewModel.clickedItem as StringSingleChoiceSetting
 | 
			
		||||
                val value = scSetting.getValueAt(which)
 | 
			
		||||
                if (scSetting.selectedValue != value) settingsViewModel.shouldSave = true
 | 
			
		||||
                scSetting.selectedValue = value
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is SliderSetting -> {
 | 
			
		||||
                val sliderSetting = settingsViewModel.clickedItem as SliderSetting
 | 
			
		||||
                if (sliderSetting.selectedValue != settingsViewModel.sliderProgress.value) {
 | 
			
		||||
                    settingsViewModel.shouldSave = true
 | 
			
		||||
                }
 | 
			
		||||
                sliderSetting.selectedValue = settingsViewModel.sliderProgress.value
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,6 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
class SettingsViewModel : ViewModel() {
 | 
			
		||||
    var game: Game? = null
 | 
			
		||||
 | 
			
		||||
    var shouldSave = false
 | 
			
		||||
 | 
			
		||||
    var clickedItem: SettingsItem? = null
 | 
			
		||||
 | 
			
		||||
    val shouldRecreate: StateFlow<Boolean> get() = _shouldRecreate
 | 
			
		||||
@@ -73,6 +71,5 @@ class SettingsViewModel : ViewModel() {
 | 
			
		||||
 | 
			
		||||
    fun clear() {
 | 
			
		||||
        game = null
 | 
			
		||||
        shouldSave = false
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -253,6 +253,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
 | 
			
		||||
        super.onResume()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onStop() {
 | 
			
		||||
        super.onStop()
 | 
			
		||||
        CoroutineScope(Dispatchers.IO).launch {
 | 
			
		||||
            NativeConfig.saveSettings()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroy() {
 | 
			
		||||
        EmulationActivity.stopForegroundService(this)
 | 
			
		||||
        super.onDestroy()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user