Add emulation settings

This commit is contained in:
SSimco
2025-06-18 19:07:29 +03:00
parent 89ec2f0591
commit f14536635c
6 changed files with 124 additions and 16 deletions
@@ -38,6 +38,8 @@ import info.cemu.cemu.inputoverlay.OverlaySettings
import info.cemu.cemu.nativeinterface.NativeEmulation
import info.cemu.cemu.nativeinterface.NativeException
import info.cemu.cemu.nativeinterface.NativeSwkbd.setCurrentInputText
import info.cemu.cemu.settings.EmulationScreenSettings
import info.cemu.cemu.settings.SettingsManager
import java.lang.ref.WeakReference
import kotlin.system.exitProcess
@@ -80,6 +82,7 @@ class EmulationActivity : AppCompatActivity() {
private lateinit var binding: ActivityEmulationBinding
private var isMotionEnabled = false
private lateinit var overlaySettings: OverlaySettings
private lateinit var emulationScreenSettings: EmulationScreenSettings
private lateinit var inputOverlaySurfaceView: InputOverlaySurfaceView
private lateinit var sensorManager: SensorManager
private var hasEmulationError = false
@@ -118,8 +121,8 @@ class EmulationActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
emulationActivityInstance = WeakReference(this)
val inputOverlaySettingsManager = InputOverlaySettingsManager(this)
overlaySettings = inputOverlaySettingsManager.overlaySettings
overlaySettings = InputOverlaySettingsManager(this).overlaySettings
emulationScreenSettings = SettingsManager(this).emulationScreenSettings
sensorManager = SensorManager(this)
sensorManager.setDeviceRotationProvider(deviceRotationProvider = { display.rotation })
@@ -240,7 +243,14 @@ class EmulationActivity : AppCompatActivity() {
binding.editInputsLayout.visibility = View.GONE
toastMessage(R.string.input_mode_default)
}
binding.emulationSettingsButton.setOnClickListener { binding.drawerLayout.open() }
if (emulationScreenSettings.isDrawerButtonVisible) {
binding.emulationSettingsButton.setOnClickListener { binding.drawerLayout.open() }
binding.drawerLayout.setLockedMode(true)
} else {
binding.emulationSettingsButton.visibility = View.GONE
}
val mainCanvas = binding.mainCanvas
try {
val testSurfaceTexture = SurfaceTexture(0)
@@ -8,21 +8,34 @@ import androidx.drawerlayout.widget.DrawerLayout as AndroidxDrawerLayout
class DrawerLayout @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null,
) : AndroidxDrawerLayout(context, attrs) {
init {
setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED)
addDrawerListener(object : DrawerListener {
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
private var isLocked = false
private val lockedModeDrawerListener = object : DrawerListener {
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
override fun onDrawerOpened(drawerView: View) {
setDrawerLockMode(LOCK_MODE_UNLOCKED)
}
override fun onDrawerOpened(drawerView: View) {
setDrawerLockMode(LOCK_MODE_UNLOCKED)
}
override fun onDrawerClosed(drawerView: View) {
setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED)
}
override fun onDrawerClosed(drawerView: View) {
setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED)
}
override fun onDrawerStateChanged(newState: Int) {}
})
override fun onDrawerStateChanged(newState: Int) {}
}
fun setLockedMode(isLocked: Boolean) {
if (this.isLocked == isLocked) {
return
}
this.isLocked = isLocked
if (isLocked) {
setDrawerLockMode(LOCK_MODE_LOCKED_CLOSED)
addDrawerListener(lockedModeDrawerListener)
return
}
setDrawerLockMode(LOCK_MODE_UNLOCKED)
removeDrawerListener(lockedModeDrawerListener)
}
}
@@ -0,0 +1,40 @@
package info.cemu.cemu.settings
import android.content.Context
import android.content.SharedPreferences
class EmulationScreenSettings(
var isDrawerButtonVisible: Boolean,
) {
companion object {
private const val IS_BUTTON_VISIBLE_KEY = "IS_BUTTON_VISIBLE"
}
constructor(sharedPreferences: SharedPreferences) : this(
isDrawerButtonVisible = sharedPreferences.getBoolean(
IS_BUTTON_VISIBLE_KEY,
false
),
)
fun save(sharedPreferences: SharedPreferences) {
sharedPreferences.edit().apply {
putBoolean(IS_BUTTON_VISIBLE_KEY, isDrawerButtonVisible)
apply()
}
}
}
class SettingsManager(context: Context) {
private val sharedPreferences: SharedPreferences =
context.getSharedPreferences(SETTINGS_NAME, Context.MODE_PRIVATE)
var emulationScreenSettings: EmulationScreenSettings
get() = EmulationScreenSettings(sharedPreferences)
set(value) = value.save(sharedPreferences)
companion object {
private const val SETTINGS_NAME = "SETTINGS"
}
}
@@ -3,15 +3,21 @@ package info.cemu.cemu.settings.general
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.lifecycle.viewmodel.compose.viewModel
import info.cemu.cemu.R
import info.cemu.cemu.guicore.components.Button
import info.cemu.cemu.guicore.components.ScreenContent
import info.cemu.cemu.guicore.components.SingleSelection
import info.cemu.cemu.guicore.components.Toggle
import info.cemu.cemu.guicore.nativeenummapper.consoleLanguageToStringId
import info.cemu.cemu.nativeinterface.NativeSettings
@Composable
fun GeneralSettingsScreen(navigateBack: () -> Unit, goToGamePathsSettings: () -> Unit) {
fun GeneralSettingsScreen(
navigateBack: () -> Unit,
goToGamePathsSettings: () -> Unit,
generalSettingsViewModel: GeneralSettingsViewModel = viewModel(factory = GeneralSettingsViewModel.Factory),
) {
ScreenContent(
appBarText = stringResource(R.string.general_settings),
navigateBack = navigateBack,
@@ -41,5 +47,13 @@ fun GeneralSettingsScreen(navigateBack: () -> Unit, goToGamePathsSettings: () ->
NativeSettings.CONSOLE_LANGUAGE_TAIWANESE,
),
)
Toggle(
label = stringResource(R.string.side_menu_button),
description = stringResource(R.string.side_menu_button_description),
initialCheckedState = { generalSettingsViewModel.emulationScreenSettings.isDrawerButtonVisible },
onCheckedChanged = {
generalSettingsViewModel.emulationScreenSettings.isDrawerButtonVisible = it
}
)
}
}
@@ -0,0 +1,29 @@
package info.cemu.cemu.settings.general
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import info.cemu.cemu.CemuApplication
import info.cemu.cemu.settings.SettingsManager
class GeneralSettingsViewModel(
private val settingsManager: SettingsManager,
) : ViewModel() {
val emulationScreenSettings = settingsManager.emulationScreenSettings
override fun onCleared() {
super.onCleared()
settingsManager.emulationScreenSettings = emulationScreenSettings
}
companion object {
val Factory: ViewModelProvider.Factory = viewModelFactory {
initializer {
GeneralSettingsViewModel(
SettingsManager(CemuApplication.Application)
)
}
}
}
}
@@ -335,4 +335,6 @@
<string name="controller_setup_all_inputs">Setup all inputs</string>
<string name="no_controllers_available">No controllers available</string>
<string name="controller_select_dialog_title">Select a controller</string>
<string name="side_menu_button">Side menu button</string>
<string name="side_menu_button_description">Show the emulation side menu button</string>
</resources>