summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt20
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt54
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt53
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt51
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt22
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt23
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt5
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt17
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt30
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt11
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt29
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt2
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt6
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt12
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt47
-rw-r--r--src/android/app/src/main/jni/native_config.cpp126
-rw-r--r--src/common/settings_setting.h5
34 files changed, 324 insertions, 353 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
index f41d7bdbf..9b08f008d 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
@@ -172,7 +172,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
172 172
173 override fun onUserLeaveHint() { 173 override fun onUserLeaveHint() {
174 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { 174 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
175 if (BooleanSetting.PICTURE_IN_PICTURE.boolean && !isInPictureInPictureMode) { 175 if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) {
176 val pictureInPictureParamsBuilder = PictureInPictureParams.Builder() 176 val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
177 .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder() 177 .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
178 enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) 178 enterPictureInPictureMode(pictureInPictureParamsBuilder.build())
@@ -284,7 +284,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
284 284
285 private fun PictureInPictureParams.Builder.getPictureInPictureAspectBuilder(): 285 private fun PictureInPictureParams.Builder.getPictureInPictureAspectBuilder():
286 PictureInPictureParams.Builder { 286 PictureInPictureParams.Builder {
287 val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.int) { 287 val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.getInt()) {
288 0 -> Rational(16, 9) 288 0 -> Rational(16, 9)
289 1 -> Rational(4, 3) 289 1 -> Rational(4, 3)
290 2 -> Rational(21, 9) 290 2 -> Rational(21, 9)
@@ -331,7 +331,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
331 pictureInPictureActions.add(pauseRemoteAction) 331 pictureInPictureActions.add(pauseRemoteAction)
332 } 332 }
333 333
334 if (BooleanSetting.AUDIO_MUTED.boolean) { 334 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
335 val unmuteIcon = Icon.createWithResource( 335 val unmuteIcon = Icon.createWithResource(
336 this@EmulationActivity, 336 this@EmulationActivity,
337 R.drawable.ic_pip_unmute 337 R.drawable.ic_pip_unmute
@@ -376,7 +376,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
376 val isEmulationActive = emulationViewModel.emulationStarted.value && 376 val isEmulationActive = emulationViewModel.emulationStarted.value &&
377 !emulationViewModel.isEmulationStopping.value 377 !emulationViewModel.isEmulationStopping.value
378 pictureInPictureParamsBuilder.setAutoEnterEnabled( 378 pictureInPictureParamsBuilder.setAutoEnterEnabled(
379 BooleanSetting.PICTURE_IN_PICTURE.boolean && isEmulationActive 379 BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && isEmulationActive
380 ) 380 )
381 } 381 }
382 setPictureInPictureParams(pictureInPictureParamsBuilder.build()) 382 setPictureInPictureParams(pictureInPictureParamsBuilder.build())
@@ -390,9 +390,13 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
390 if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation() 390 if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation()
391 } 391 }
392 if (intent.action == actionUnmute) { 392 if (intent.action == actionUnmute) {
393 if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false) 393 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
394 BooleanSetting.AUDIO_MUTED.setBoolean(false)
395 }
394 } else if (intent.action == actionMute) { 396 } else if (intent.action == actionMute) {
395 if (!BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(true) 397 if (!BooleanSetting.AUDIO_MUTED.getBoolean()) {
398 BooleanSetting.AUDIO_MUTED.setBoolean(true)
399 }
396 } 400 }
397 buildPictureInPictureParams() 401 buildPictureInPictureParams()
398 } 402 }
@@ -423,7 +427,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
423 } catch (ignored: Exception) { 427 } catch (ignored: Exception) {
424 } 428 }
425 // Always resume audio, since there is no UI button 429 // Always resume audio, since there is no UI button
426 if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false) 430 if (BooleanSetting.AUDIO_MUTED.getBoolean()) {
431 BooleanSetting.AUDIO_MUTED.setBoolean(false)
432 }
427 } 433 }
428 } 434 }
429 435
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt
index aeda8d222..0ba465356 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractBooleanSetting : AbstractSetting { 6interface AbstractBooleanSetting : AbstractSetting {
7 val boolean: Boolean 7 fun getBoolean(needsGlobal: Boolean = false): Boolean
8
9 fun setBoolean(value: Boolean) 8 fun setBoolean(value: Boolean)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
index 606519ad8..cf6300535 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractByteSetting : AbstractSetting { 6interface AbstractByteSetting : AbstractSetting {
7 val byte: Byte 7 fun getByte(needsGlobal: Boolean = false): Byte
8
9 fun setByte(value: Byte) 8 fun setByte(value: Byte)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt
index 974925eed..c6c0bcf34 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractFloatSetting : AbstractSetting { 6interface AbstractFloatSetting : AbstractSetting {
7 val float: Float 7 fun getFloat(needsGlobal: Boolean = false): Float
8
9 fun setFloat(value: Float) 8 fun setFloat(value: Float)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt
index 89b285b10..826402c34 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractIntSetting : AbstractSetting { 6interface AbstractIntSetting : AbstractSetting {
7 val int: Int 7 fun getInt(needsGlobal: Boolean = false): Int
8
9 fun setInt(value: Int) 8 fun setInt(value: Int)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
index 4873942db..2b62cc06b 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractLongSetting : AbstractSetting { 6interface AbstractLongSetting : AbstractSetting {
7 val long: Long 7 fun getLong(needsGlobal: Boolean = false): Long
8
9 fun setLong(value: Long) 8 fun setLong(value: Long)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt
index 8b6d29fe5..e384c78c2 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt
@@ -7,12 +7,7 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8interface AbstractSetting { 8interface AbstractSetting {
9 val key: String 9 val key: String
10 val category: Settings.Category
11 val defaultValue: Any 10 val defaultValue: Any
12 val androidDefault: Any?
13 get() = null
14 val valueAsString: String
15 get() = ""
16 11
17 val isRuntimeModifiable: Boolean 12 val isRuntimeModifiable: Boolean
18 get() = NativeConfig.getIsRuntimeModifiable(key) 13 get() = NativeConfig.getIsRuntimeModifiable(key)
@@ -20,5 +15,14 @@ interface AbstractSetting {
20 val pairedSettingKey: String 15 val pairedSettingKey: String
21 get() = NativeConfig.getPairedSettingKey(key) 16 get() = NativeConfig.getPairedSettingKey(key)
22 17
18 val isSwitchable: Boolean
19 get() = NativeConfig.getIsSwitchable(key)
20
21 var global: Boolean
22 get() = NativeConfig.usingGlobal(key)
23 set(value) = NativeConfig.setGlobal(key, value)
24
25 fun getValueAsString(needsGlobal: Boolean = false): String
26
23 fun reset() 27 fun reset()
24} 28}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
index 91407ccbb..8bfa81e4a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractShortSetting : AbstractSetting { 6interface AbstractShortSetting : AbstractSetting {
7 val short: Short 7 fun getShort(needsGlobal: Boolean = false): Short
8
9 fun setShort(value: Short) 8 fun setShort(value: Short)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt
index c8935cc48..6ff8fd3f9 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.features.settings.model 4package org.yuzu.yuzu_emu.features.settings.model
5 5
6interface AbstractStringSetting : AbstractSetting { 6interface AbstractStringSetting : AbstractSetting {
7 val string: String 7 fun getString(needsGlobal: Boolean = false): String
8
9 fun setString(value: String) 8 fun setString(value: String)
10} 9}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
index 8476ce867..16f06cd0a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
@@ -5,36 +5,34 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class BooleanSetting( 8enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
9 override val key: String, 9 AUDIO_MUTED("audio_muted"),
10 override val category: Settings.Category, 10 CPU_DEBUG_MODE("cpu_debug_mode"),
11 override val androidDefault: Boolean? = null 11 FASTMEM("cpuopt_fastmem"),
12) : AbstractBooleanSetting { 12 FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives"),
13 AUDIO_MUTED("audio_muted", Settings.Category.Audio), 13 RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
14 CPU_DEBUG_MODE("cpu_debug_mode", Settings.Category.Cpu), 14 USE_DOCKED_MODE("use_docked_mode"),
15 FASTMEM("cpuopt_fastmem", Settings.Category.Cpu), 15 RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
16 FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives", Settings.Category.Cpu), 16 RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
17 RENDERER_USE_SPEED_LIMIT("use_speed_limit", Settings.Category.Core), 17 RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
18 USE_DOCKED_MODE("use_docked_mode", Settings.Category.System, false), 18 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
19 RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache", Settings.Category.Renderer), 19 RENDERER_DEBUG("debug"),
20 RENDERER_FORCE_MAX_CLOCK("force_max_clock", Settings.Category.Renderer), 20 PICTURE_IN_PICTURE("picture_in_picture"),
21 RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders", Settings.Category.Renderer), 21 USE_CUSTOM_RTC("custom_rtc_enabled");
22 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing", Settings.Category.Renderer, false), 22
23 RENDERER_DEBUG("debug", Settings.Category.Renderer), 23 override fun getBoolean(needsGlobal: Boolean): Boolean =
24 PICTURE_IN_PICTURE("picture_in_picture", Settings.Category.Android), 24 NativeConfig.getBoolean(key, needsGlobal)
25 USE_CUSTOM_RTC("custom_rtc_enabled", Settings.Category.System); 25
26 26 override fun setBoolean(value: Boolean) {
27 override val boolean: Boolean 27 if (NativeConfig.isPerGameConfigLoaded()) {
28 get() = NativeConfig.getBoolean(key, false) 28 global = false
29 29 }
30 override fun setBoolean(value: Boolean) = NativeConfig.setBoolean(key, value) 30 NativeConfig.setBoolean(key, value)
31
32 override val defaultValue: Boolean by lazy {
33 androidDefault ?: NativeConfig.getBoolean(key, true)
34 } 31 }
35 32
36 override val valueAsString: String 33 override val defaultValue: Boolean by lazy { NativeConfig.getDefaultToString(key).toBoolean() }
37 get() = if (boolean) "1" else "0" 34
35 override fun getValueAsString(needsGlobal: Boolean): String = getBoolean(needsGlobal).toString()
38 36
39 override fun reset() = NativeConfig.setBoolean(key, defaultValue) 37 override fun reset() = NativeConfig.setBoolean(key, defaultValue)
40} 38}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
index 6ec0a765e..7b7fac211 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class ByteSetting( 8enum class ByteSetting(override val key: String) : AbstractByteSetting {
9 override val key: String, 9 AUDIO_VOLUME("volume");
10 override val category: Settings.Category
11) : AbstractByteSetting {
12 AUDIO_VOLUME("volume", Settings.Category.Audio);
13 10
14 override val byte: Byte 11 override fun getByte(needsGlobal: Boolean): Byte = NativeConfig.getByte(key, needsGlobal)
15 get() = NativeConfig.getByte(key, false)
16 12
17 override fun setByte(value: Byte) = NativeConfig.setByte(key, value) 13 override fun setByte(value: Byte) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setByte(key, value)
18 }
18 19
19 override val defaultValue: Byte by lazy { NativeConfig.getByte(key, true) } 20 override val defaultValue: Byte by lazy { NativeConfig.getDefaultToString(key).toByte() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getByte(needsGlobal).toString()
22 get() = byte.toString()
23 23
24 override fun reset() = NativeConfig.setByte(key, defaultValue) 24 override fun reset() = NativeConfig.setByte(key, defaultValue)
25} 25}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt
index 0181d06f2..4644824d8 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt
@@ -5,22 +5,22 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class FloatSetting( 8enum class FloatSetting(override val key: String) : AbstractFloatSetting {
9 override val key: String,
10 override val category: Settings.Category
11) : AbstractFloatSetting {
12 // No float settings currently exist 9 // No float settings currently exist
13 EMPTY_SETTING("", Settings.Category.UiGeneral); 10 EMPTY_SETTING("");
14 11
15 override val float: Float 12 override fun getFloat(needsGlobal: Boolean): Float = NativeConfig.getFloat(key, false)
16 get() = NativeConfig.getFloat(key, false)
17 13
18 override fun setFloat(value: Float) = NativeConfig.setFloat(key, value) 14 override fun setFloat(value: Float) {
15 if (NativeConfig.isPerGameConfigLoaded()) {
16 global = false
17 }
18 NativeConfig.setFloat(key, value)
19 }
19 20
20 override val defaultValue: Float by lazy { NativeConfig.getFloat(key, true) } 21 override val defaultValue: Float by lazy { NativeConfig.getDefaultToString(key).toFloat() }
21 22
22 override val valueAsString: String 23 override fun getValueAsString(needsGlobal: Boolean): String = getFloat(needsGlobal).toString()
23 get() = float.toString()
24 24
25 override fun reset() = NativeConfig.setFloat(key, defaultValue) 25 override fun reset() = NativeConfig.setFloat(key, defaultValue)
26} 26}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
index ef10b209f..21e4e1afd 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
@@ -5,36 +5,33 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class IntSetting( 8enum class IntSetting(override val key: String) : AbstractIntSetting {
9 override val key: String, 9 CPU_BACKEND("cpu_backend"),
10 override val category: Settings.Category, 10 CPU_ACCURACY("cpu_accuracy"),
11 override val androidDefault: Int? = null 11 REGION_INDEX("region_index"),
12) : AbstractIntSetting { 12 LANGUAGE_INDEX("language_index"),
13 CPU_BACKEND("cpu_backend", Settings.Category.Cpu), 13 RENDERER_BACKEND("backend"),
14 CPU_ACCURACY("cpu_accuracy", Settings.Category.Cpu), 14 RENDERER_ACCURACY("gpu_accuracy"),
15 REGION_INDEX("region_index", Settings.Category.System), 15 RENDERER_RESOLUTION("resolution_setup"),
16 LANGUAGE_INDEX("language_index", Settings.Category.System), 16 RENDERER_VSYNC("use_vsync"),
17 RENDERER_BACKEND("backend", Settings.Category.Renderer), 17 RENDERER_SCALING_FILTER("scaling_filter"),
18 RENDERER_ACCURACY("gpu_accuracy", Settings.Category.Renderer, 0), 18 RENDERER_ANTI_ALIASING("anti_aliasing"),
19 RENDERER_RESOLUTION("resolution_setup", Settings.Category.Renderer), 19 RENDERER_SCREEN_LAYOUT("screen_layout"),
20 RENDERER_VSYNC("use_vsync", Settings.Category.Renderer), 20 RENDERER_ASPECT_RATIO("aspect_ratio"),
21 RENDERER_SCALING_FILTER("scaling_filter", Settings.Category.Renderer), 21 AUDIO_OUTPUT_ENGINE("output_engine");
22 RENDERER_ANTI_ALIASING("anti_aliasing", Settings.Category.Renderer), 22
23 RENDERER_SCREEN_LAYOUT("screen_layout", Settings.Category.Android), 23 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
24 RENDERER_ASPECT_RATIO("aspect_ratio", Settings.Category.Renderer), 24
25 AUDIO_OUTPUT_ENGINE("output_engine", Settings.Category.Audio); 25 override fun setInt(value: Int) {
26 26 if (NativeConfig.isPerGameConfigLoaded()) {
27 override val int: Int 27 global = false
28 get() = NativeConfig.getInt(key, false) 28 }
29 29 NativeConfig.setInt(key, value)
30 override fun setInt(value: Int) = NativeConfig.setInt(key, value)
31
32 override val defaultValue: Int by lazy {
33 androidDefault ?: NativeConfig.getInt(key, true)
34 } 30 }
35 31
36 override val valueAsString: String 32 override val defaultValue: Int by lazy { NativeConfig.getDefaultToString(key).toInt() }
37 get() = int.toString() 33
34 override fun getValueAsString(needsGlobal: Boolean): String = getInt(needsGlobal).toString()
38 35
39 override fun reset() = NativeConfig.setInt(key, defaultValue) 36 override fun reset() = NativeConfig.setInt(key, defaultValue)
40} 37}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
index c526fc4cf..e3efd516c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class LongSetting( 8enum class LongSetting(override val key: String) : AbstractLongSetting {
9 override val key: String, 9 CUSTOM_RTC("custom_rtc");
10 override val category: Settings.Category
11) : AbstractLongSetting {
12 CUSTOM_RTC("custom_rtc", Settings.Category.System);
13 10
14 override val long: Long 11 override fun getLong(needsGlobal: Boolean): Long = NativeConfig.getLong(key, needsGlobal)
15 get() = NativeConfig.getLong(key, false)
16 12
17 override fun setLong(value: Long) = NativeConfig.setLong(key, value) 13 override fun setLong(value: Long) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setLong(key, value)
18 }
18 19
19 override val defaultValue: Long by lazy { NativeConfig.getLong(key, true) } 20 override val defaultValue: Long by lazy { NativeConfig.getDefaultToString(key).toLong() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getLong(needsGlobal).toString()
22 get() = long.toString()
23 23
24 override fun reset() = NativeConfig.setLong(key, defaultValue) 24 override fun reset() = NativeConfig.setLong(key, defaultValue)
25} 25}
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 e3cd66185..9551fc05e 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
@@ -6,62 +6,11 @@ package org.yuzu.yuzu_emu.features.settings.model
6import org.yuzu.yuzu_emu.R 6import org.yuzu.yuzu_emu.R
7 7
8object Settings { 8object Settings {
9 enum class Category {
10 Android,
11 Audio,
12 Core,
13 Cpu,
14 CpuDebug,
15 CpuUnsafe,
16 Renderer,
17 RendererAdvanced,
18 RendererDebug,
19 System,
20 SystemAudio,
21 DataStorage,
22 Debugging,
23 DebuggingGraphics,
24 Miscellaneous,
25 Network,
26 WebService,
27 AddOns,
28 Controls,
29 Ui,
30 UiGeneral,
31 UiLayout,
32 UiGameList,
33 Screenshots,
34 Shortcuts,
35 Multiplayer,
36 Services,
37 Paths,
38 MaxEnum
39 }
40
41 val settingsList = listOf<AbstractSetting>(
42 *BooleanSetting.values(),
43 *ByteSetting.values(),
44 *ShortSetting.values(),
45 *IntSetting.values(),
46 *FloatSetting.values(),
47 *LongSetting.values(),
48 *StringSetting.values()
49 )
50
51 const val SECTION_GENERAL = "General"
52 const val SECTION_SYSTEM = "System"
53 const val SECTION_RENDERER = "Renderer"
54 const val SECTION_AUDIO = "Audio"
55 const val SECTION_CPU = "Cpu"
56 const val SECTION_THEME = "Theme"
57 const val SECTION_DEBUG = "Debug"
58
59 enum class MenuTag(val titleId: Int) { 9 enum class MenuTag(val titleId: Int) {
60 SECTION_ROOT(R.string.advanced_settings), 10 SECTION_ROOT(R.string.advanced_settings),
61 SECTION_SYSTEM(R.string.preferences_system), 11 SECTION_SYSTEM(R.string.preferences_system),
62 SECTION_RENDERER(R.string.preferences_graphics), 12 SECTION_RENDERER(R.string.preferences_graphics),
63 SECTION_AUDIO(R.string.preferences_audio), 13 SECTION_AUDIO(R.string.preferences_audio),
64 SECTION_CPU(R.string.cpu),
65 SECTION_THEME(R.string.preferences_theme), 14 SECTION_THEME(R.string.preferences_theme),
66 SECTION_DEBUG(R.string.preferences_debug); 15 SECTION_DEBUG(R.string.preferences_debug);
67 } 16 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
index c9a0c664c..16eb4ffdd 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt
@@ -5,21 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class ShortSetting( 8enum class ShortSetting(override val key: String) : AbstractShortSetting {
9 override val key: String, 9 RENDERER_SPEED_LIMIT("speed_limit");
10 override val category: Settings.Category
11) : AbstractShortSetting {
12 RENDERER_SPEED_LIMIT("speed_limit", Settings.Category.Core);
13 10
14 override val short: Short 11 override fun getShort(needsGlobal: Boolean): Short = NativeConfig.getShort(key, needsGlobal)
15 get() = NativeConfig.getShort(key, false)
16 12
17 override fun setShort(value: Short) = NativeConfig.setShort(key, value) 13 override fun setShort(value: Short) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setShort(key, value)
18 }
18 19
19 override val defaultValue: Short by lazy { NativeConfig.getShort(key, true) } 20 override val defaultValue: Short by lazy { NativeConfig.getDefaultToString(key).toShort() }
20 21
21 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getShort(needsGlobal).toString()
22 get() = short.toString()
23 23
24 override fun reset() = NativeConfig.setShort(key, defaultValue) 24 override fun reset() = NativeConfig.setShort(key, defaultValue)
25} 25}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt
index 9bb3e66d4..a0d8cfede 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt
@@ -5,22 +5,21 @@ package org.yuzu.yuzu_emu.features.settings.model
5 5
6import org.yuzu.yuzu_emu.utils.NativeConfig 6import org.yuzu.yuzu_emu.utils.NativeConfig
7 7
8enum class StringSetting( 8enum class StringSetting(override val key: String) : AbstractStringSetting {
9 override val key: String, 9 DRIVER_PATH("driver_path");
10 override val category: Settings.Category
11) : AbstractStringSetting {
12 // No string settings currently exist
13 EMPTY_SETTING("", Settings.Category.UiGeneral);
14 10
15 override val string: String 11 override fun getString(needsGlobal: Boolean): String = NativeConfig.getString(key, needsGlobal)
16 get() = NativeConfig.getString(key, false)
17 12
18 override fun setString(value: String) = NativeConfig.setString(key, value) 13 override fun setString(value: String) {
14 if (NativeConfig.isPerGameConfigLoaded()) {
15 global = false
16 }
17 NativeConfig.setString(key, value)
18 }
19 19
20 override val defaultValue: String by lazy { NativeConfig.getString(key, true) } 20 override val defaultValue: String by lazy { NativeConfig.getDefaultToString(key) }
21 21
22 override val valueAsString: String 22 override fun getValueAsString(needsGlobal: Boolean): String = getString(needsGlobal)
23 get() = string
24 23
25 override fun reset() = NativeConfig.setString(key, defaultValue) 24 override fun reset() = NativeConfig.setString(key, defaultValue)
26} 25}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt
index 8bc164197..1d81f5f2b 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt
@@ -12,7 +12,6 @@ class DateTimeSetting(
12) : SettingsItem(longSetting, titleId, descriptionId) { 12) : SettingsItem(longSetting, titleId, descriptionId) {
13 override val type = TYPE_DATETIME_SETTING 13 override val type = TYPE_DATETIME_SETTING
14 14
15 var value: Long 15 fun getValue(needsGlobal: Boolean = false): Long = longSetting.getLong(needsGlobal)
16 get() = longSetting.long 16 fun setValue(value: Long) = (setting as AbstractLongSetting).setLong(value)
17 set(value) = (setting as AbstractLongSetting).setLong(value)
18} 17}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
index e198b18a0..384527294 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
@@ -11,7 +11,6 @@ import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
11import org.yuzu.yuzu_emu.features.settings.model.ByteSetting 11import org.yuzu.yuzu_emu.features.settings.model.ByteSetting
12import org.yuzu.yuzu_emu.features.settings.model.IntSetting 12import org.yuzu.yuzu_emu.features.settings.model.IntSetting
13import org.yuzu.yuzu_emu.features.settings.model.LongSetting 13import org.yuzu.yuzu_emu.features.settings.model.LongSetting
14import org.yuzu.yuzu_emu.features.settings.model.Settings
15import org.yuzu.yuzu_emu.features.settings.model.ShortSetting 14import org.yuzu.yuzu_emu.features.settings.model.ShortSetting
16 15
17/** 16/**
@@ -48,8 +47,8 @@ abstract class SettingsItem(
48 47
49 val emptySetting = object : AbstractSetting { 48 val emptySetting = object : AbstractSetting {
50 override val key: String = "" 49 override val key: String = ""
51 override val category: Settings.Category = Settings.Category.Ui
52 override val defaultValue: Any = false 50 override val defaultValue: Any = false
51 override fun getValueAsString(needsGlobal: Boolean): String = ""
53 override fun reset() {} 52 override fun reset() {}
54 } 53 }
55 54
@@ -270,9 +269,9 @@ abstract class SettingsItem(
270 ) 269 )
271 270
272 val fastmem = object : AbstractBooleanSetting { 271 val fastmem = object : AbstractBooleanSetting {
273 override val boolean: Boolean 272 override fun getBoolean(needsGlobal: Boolean): Boolean =
274 get() = 273 BooleanSetting.FASTMEM.getBoolean() &&
275 BooleanSetting.FASTMEM.boolean && BooleanSetting.FASTMEM_EXCLUSIVES.boolean 274 BooleanSetting.FASTMEM_EXCLUSIVES.getBoolean()
276 275
277 override fun setBoolean(value: Boolean) { 276 override fun setBoolean(value: Boolean) {
278 BooleanSetting.FASTMEM.setBoolean(value) 277 BooleanSetting.FASTMEM.setBoolean(value)
@@ -280,9 +279,22 @@ abstract class SettingsItem(
280 } 279 }
281 280
282 override val key: String = FASTMEM_COMBINED 281 override val key: String = FASTMEM_COMBINED
283 override val category = Settings.Category.Cpu
284 override val isRuntimeModifiable: Boolean = false 282 override val isRuntimeModifiable: Boolean = false
285 override val defaultValue: Boolean = true 283 override val defaultValue: Boolean = true
284 override val isSwitchable: Boolean = true
285 override var global: Boolean
286 get() {
287 return BooleanSetting.FASTMEM.global &&
288 BooleanSetting.FASTMEM_EXCLUSIVES.global
289 }
290 set(value) {
291 BooleanSetting.FASTMEM.global = value
292 BooleanSetting.FASTMEM_EXCLUSIVES.global = value
293 }
294
295 override fun getValueAsString(needsGlobal: Boolean): String =
296 getBoolean().toString()
297
286 override fun reset() = setBoolean(defaultValue) 298 override fun reset() = setBoolean(defaultValue)
287 } 299 }
288 put(SwitchSetting(fastmem, R.string.fastmem, 0)) 300 put(SwitchSetting(fastmem, R.string.fastmem, 0))
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt
index 705527a73..97a5a9e59 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt
@@ -15,16 +15,11 @@ class SingleChoiceSetting(
15) : SettingsItem(setting, titleId, descriptionId) { 15) : SettingsItem(setting, titleId, descriptionId) {
16 override val type = TYPE_SINGLE_CHOICE 16 override val type = TYPE_SINGLE_CHOICE
17 17
18 var selectedValue: Int 18 fun getSelectedValue(needsGlobal: Boolean = false) =
19 get() { 19 when (setting) {
20 return when (setting) { 20 is AbstractIntSetting -> setting.getInt(needsGlobal)
21 is AbstractIntSetting -> setting.int 21 else -> -1
22 else -> -1
23 }
24 }
25 set(value) {
26 when (setting) {
27 is AbstractIntSetting -> setting.setInt(value)
28 }
29 } 22 }
23
24 fun setSelectedValue(value: Int) = (setting as AbstractIntSetting).setInt(value)
30} 25}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt
index c3b5df02c..b9b709bf7 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt
@@ -20,22 +20,20 @@ class SliderSetting(
20) : SettingsItem(setting, titleId, descriptionId) { 20) : SettingsItem(setting, titleId, descriptionId) {
21 override val type = TYPE_SLIDER 21 override val type = TYPE_SLIDER
22 22
23 var selectedValue: Int 23 fun getSelectedValue(needsGlobal: Boolean = false) =
24 get() { 24 when (setting) {
25 return when (setting) { 25 is AbstractByteSetting -> setting.getByte(needsGlobal).toInt()
26 is AbstractByteSetting -> setting.byte.toInt() 26 is AbstractShortSetting -> setting.getShort(needsGlobal).toInt()
27 is AbstractShortSetting -> setting.short.toInt() 27 is AbstractIntSetting -> setting.getInt(needsGlobal)
28 is AbstractIntSetting -> setting.int 28 is AbstractFloatSetting -> setting.getFloat(needsGlobal).roundToInt()
29 is AbstractFloatSetting -> setting.float.roundToInt() 29 else -> -1
30 else -> -1
31 }
32 } 30 }
33 set(value) { 31
34 when (setting) { 32 fun setSelectedValue(value: Int) =
35 is AbstractByteSetting -> setting.setByte(value.toByte()) 33 when (setting) {
36 is AbstractShortSetting -> setting.setShort(value.toShort()) 34 is AbstractByteSetting -> setting.setByte(value.toByte())
37 is AbstractIntSetting -> setting.setInt(value) 35 is AbstractShortSetting -> setting.setShort(value.toShort())
38 is AbstractFloatSetting -> setting.setFloat(value.toFloat()) 36 is AbstractFloatSetting -> setting.setFloat(value.toFloat())
39 } 37 else -> (setting as AbstractIntSetting).setInt(value)
40 } 38 }
41} 39}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt
index 871dab4f3..ba7920f50 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt
@@ -17,14 +17,13 @@ class StringSingleChoiceSetting(
17 fun getValueAt(index: Int): String = 17 fun getValueAt(index: Int): String =
18 if (index >= 0 && index < values.size) values[index] else "" 18 if (index >= 0 && index < values.size) values[index] else ""
19 19
20 var selectedValue: String 20 fun getSelectedValue(needsGlobal: Boolean = false) = stringSetting.getString(needsGlobal)
21 get() = stringSetting.string 21 fun setSelectedValue(value: String) = stringSetting.setString(value)
22 set(value) = stringSetting.setString(value)
23 22
24 val selectValueIndex: Int 23 val selectValueIndex: Int
25 get() { 24 get() {
26 for (i in values.indices) { 25 for (i in values.indices) {
27 if (values[i] == selectedValue) { 26 if (values[i] == getSelectedValue()) {
28 return i 27 return i
29 } 28 }
30 } 29 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt
index 416967e64..44d47dd69 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt
@@ -14,18 +14,18 @@ class SwitchSetting(
14) : SettingsItem(setting, titleId, descriptionId) { 14) : SettingsItem(setting, titleId, descriptionId) {
15 override val type = TYPE_SWITCH 15 override val type = TYPE_SWITCH
16 16
17 var checked: Boolean 17 fun getIsChecked(needsGlobal: Boolean = false): Boolean {
18 get() { 18 return when (setting) {
19 return when (setting) { 19 is AbstractIntSetting -> setting.getInt(needsGlobal) == 1
20 is AbstractIntSetting -> setting.int == 1 20 is AbstractBooleanSetting -> setting.getBoolean(needsGlobal)
21 is AbstractBooleanSetting -> setting.boolean 21 else -> false
22 else -> false
23 }
24 } 22 }
25 set(value) { 23 }
26 when (setting) { 24
27 is AbstractIntSetting -> setting.setInt(if (value) 1 else 0) 25 fun setChecked(value: Boolean) {
28 is AbstractBooleanSetting -> setting.setBoolean(value) 26 when (setting) {
29 } 27 is AbstractIntSetting -> setting.setInt(if (value) 1 else 0)
28 is AbstractBooleanSetting -> setting.setBoolean(value)
30 } 29 }
30 }
31} 31}
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 af2c1e582..3f23c064e 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
@@ -102,8 +102,9 @@ class SettingsAdapter(
102 return currentList[position].type 102 return currentList[position].type
103 } 103 }
104 104
105 fun onBooleanClick(item: SwitchSetting, checked: Boolean) { 105 fun onBooleanClick(item: SwitchSetting, checked: Boolean, position: Int) {
106 item.checked = checked 106 item.setChecked(checked)
107 notifyItemChanged(position)
107 settingsViewModel.setShouldReloadSettingsList(true) 108 settingsViewModel.setShouldReloadSettingsList(true)
108 } 109 }
109 110
@@ -126,7 +127,7 @@ class SettingsAdapter(
126 } 127 }
127 128
128 fun onDateTimeClick(item: DateTimeSetting, position: Int) { 129 fun onDateTimeClick(item: DateTimeSetting, position: Int) {
129 val storedTime = item.value * 1000 130 val storedTime = item.getValue() * 1000
130 131
131 // Helper to extract hour and minute from epoch time 132 // Helper to extract hour and minute from epoch time
132 val calendar: Calendar = Calendar.getInstance() 133 val calendar: Calendar = Calendar.getInstance()
@@ -159,9 +160,9 @@ class SettingsAdapter(
159 var epochTime: Long = datePicker.selection!! / 1000 160 var epochTime: Long = datePicker.selection!! / 1000
160 epochTime += timePicker.hour.toLong() * 60 * 60 161 epochTime += timePicker.hour.toLong() * 60 * 60
161 epochTime += timePicker.minute.toLong() * 60 162 epochTime += timePicker.minute.toLong() * 60
162 if (item.value != epochTime) { 163 if (item.getValue() != epochTime) {
163 notifyItemChanged(position) 164 notifyItemChanged(position)
164 item.value = epochTime 165 item.setValue(epochTime)
165 } 166 }
166 } 167 }
167 datePicker.show( 168 datePicker.show(
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 7425728c6..12a389b37 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
@@ -36,7 +36,14 @@ class SettingsFragmentPresenter(
36 val item = SettingsItem.settingsItems[key]!! 36 val item = SettingsItem.settingsItems[key]!!
37 val pairedSettingKey = item.setting.pairedSettingKey 37 val pairedSettingKey = item.setting.pairedSettingKey
38 if (pairedSettingKey.isNotEmpty()) { 38 if (pairedSettingKey.isNotEmpty()) {
39 val pairedSettingValue = NativeConfig.getBoolean(pairedSettingKey, false) 39 val pairedSettingValue = NativeConfig.getBoolean(
40 pairedSettingKey,
41 if (NativeLibrary.isRunning() && !NativeConfig.isPerGameConfigLoaded()) {
42 !NativeConfig.usingGlobal(pairedSettingKey)
43 } else {
44 NativeConfig.usingGlobal(pairedSettingKey)
45 }
46 )
40 if (!pairedSettingValue) return 47 if (!pairedSettingValue) return
41 } 48 }
42 add(item) 49 add(item)
@@ -153,8 +160,8 @@ class SettingsFragmentPresenter(
153 private fun addThemeSettings(sl: ArrayList<SettingsItem>) { 160 private fun addThemeSettings(sl: ArrayList<SettingsItem>) {
154 sl.apply { 161 sl.apply {
155 val theme: AbstractIntSetting = object : AbstractIntSetting { 162 val theme: AbstractIntSetting = object : AbstractIntSetting {
156 override val int: Int 163 override fun getInt(needsGlobal: Boolean): Int =
157 get() = preferences.getInt(Settings.PREF_THEME, 0) 164 preferences.getInt(Settings.PREF_THEME, 0)
158 165
159 override fun setInt(value: Int) { 166 override fun setInt(value: Int) {
160 preferences.edit() 167 preferences.edit()
@@ -164,8 +171,8 @@ class SettingsFragmentPresenter(
164 } 171 }
165 172
166 override val key: String = Settings.PREF_THEME 173 override val key: String = Settings.PREF_THEME
167 override val category = Settings.Category.UiGeneral
168 override val isRuntimeModifiable: Boolean = false 174 override val isRuntimeModifiable: Boolean = false
175 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString()
169 override val defaultValue: Int = 0 176 override val defaultValue: Int = 0
170 override fun reset() { 177 override fun reset() {
171 preferences.edit() 178 preferences.edit()
@@ -197,8 +204,8 @@ class SettingsFragmentPresenter(
197 } 204 }
198 205
199 val themeMode: AbstractIntSetting = object : AbstractIntSetting { 206 val themeMode: AbstractIntSetting = object : AbstractIntSetting {
200 override val int: Int 207 override fun getInt(needsGlobal: Boolean): Int =
201 get() = preferences.getInt(Settings.PREF_THEME_MODE, -1) 208 preferences.getInt(Settings.PREF_THEME_MODE, -1)
202 209
203 override fun setInt(value: Int) { 210 override fun setInt(value: Int) {
204 preferences.edit() 211 preferences.edit()
@@ -208,8 +215,8 @@ class SettingsFragmentPresenter(
208 } 215 }
209 216
210 override val key: String = Settings.PREF_THEME_MODE 217 override val key: String = Settings.PREF_THEME_MODE
211 override val category = Settings.Category.UiGeneral
212 override val isRuntimeModifiable: Boolean = false 218 override val isRuntimeModifiable: Boolean = false
219 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString()
213 override val defaultValue: Int = -1 220 override val defaultValue: Int = -1
214 override fun reset() { 221 override fun reset() {
215 preferences.edit() 222 preferences.edit()
@@ -230,8 +237,8 @@ class SettingsFragmentPresenter(
230 ) 237 )
231 238
232 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting { 239 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting {
233 override val boolean: Boolean 240 override fun getBoolean(needsGlobal: Boolean): Boolean =
234 get() = preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false) 241 preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false)
235 242
236 override fun setBoolean(value: Boolean) { 243 override fun setBoolean(value: Boolean) {
237 preferences.edit() 244 preferences.edit()
@@ -241,8 +248,10 @@ class SettingsFragmentPresenter(
241 } 248 }
242 249
243 override val key: String = Settings.PREF_BLACK_BACKGROUNDS 250 override val key: String = Settings.PREF_BLACK_BACKGROUNDS
244 override val category = Settings.Category.UiGeneral
245 override val isRuntimeModifiable: Boolean = false 251 override val isRuntimeModifiable: Boolean = false
252 override fun getValueAsString(needsGlobal: Boolean): String =
253 getBoolean().toString()
254
246 override val defaultValue: Boolean = false 255 override val defaultValue: Boolean = false
247 override fun reset() { 256 override fun reset() {
248 preferences.edit() 257 preferences.edit()
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
index 525f013f8..4e159a799 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt
@@ -29,7 +29,7 @@ class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
29 } 29 }
30 30
31 binding.textSettingValue.visibility = View.VISIBLE 31 binding.textSettingValue.visibility = View.VISIBLE
32 val epochTime = setting.value 32 val epochTime = setting.getValue()
33 val instant = Instant.ofEpochMilli(epochTime * 1000) 33 val instant = Instant.ofEpochMilli(epochTime * 1000)
34 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")) 34 val zonedTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"))
35 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) 35 val dateFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
index 80d1b22c1..28c4d1777 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt
@@ -29,14 +29,14 @@ class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: Setti
29 val resMgr = binding.textSettingValue.context.resources 29 val resMgr = binding.textSettingValue.context.resources
30 val values = resMgr.getIntArray(item.valuesId) 30 val values = resMgr.getIntArray(item.valuesId)
31 for (i in values.indices) { 31 for (i in values.indices) {
32 if (values[i] == item.selectedValue) { 32 if (values[i] == item.getSelectedValue()) {
33 binding.textSettingValue.text = resMgr.getStringArray(item.choicesId)[i] 33 binding.textSettingValue.text = resMgr.getStringArray(item.choicesId)[i]
34 break 34 break
35 } 35 }
36 } 36 }
37 } else if (item is StringSingleChoiceSetting) { 37 } else if (item is StringSingleChoiceSetting) {
38 for (i in item.values.indices) { 38 for (i in item.values.indices) {
39 if (item.values[i] == item.selectedValue) { 39 if (item.values[i] == item.getSelectedValue()) {
40 binding.textSettingValue.text = item.choices[i] 40 binding.textSettingValue.text = item.choices[i]
41 break 41 break
42 } 42 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
index b83c90100..67432f88e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt
@@ -26,7 +26,7 @@ class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAda
26 binding.textSettingValue.visibility = View.VISIBLE 26 binding.textSettingValue.visibility = View.VISIBLE
27 binding.textSettingValue.text = String.format( 27 binding.textSettingValue.text = String.format(
28 binding.textSettingValue.context.getString(R.string.value_with_units), 28 binding.textSettingValue.context.getString(R.string.value_with_units),
29 setting.selectedValue, 29 setting.getSelectedValue(),
30 setting.units 30 setting.units
31 ) 31 )
32 32
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
index 57fdeaa20..98ed888cb 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt
@@ -27,7 +27,7 @@ class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter
27 } 27 }
28 28
29 binding.switchWidget.setOnCheckedChangeListener(null) 29 binding.switchWidget.setOnCheckedChangeListener(null)
30 binding.switchWidget.isChecked = setting.checked 30 binding.switchWidget.isChecked = setting.getIsChecked(setting.needsRuntimeGlobal)
31 binding.switchWidget.setOnCheckedChangeListener { _: CompoundButton, _: Boolean -> 31 binding.switchWidget.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
32 adapter.onBooleanClick(item, binding.switchWidget.isChecked) 32 adapter.onBooleanClick(item, binding.switchWidget.isChecked)
33 } 33 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index 734c1d5ca..b09df7db3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -435,7 +435,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
435 @SuppressLint("SourceLockedOrientationActivity") 435 @SuppressLint("SourceLockedOrientationActivity")
436 private fun updateOrientation() { 436 private fun updateOrientation() {
437 emulationActivity?.let { 437 emulationActivity?.let {
438 it.requestedOrientation = when (IntSetting.RENDERER_SCREEN_LAYOUT.int) { 438 it.requestedOrientation = when (IntSetting.RENDERER_SCREEN_LAYOUT.getInt()) {
439 Settings.LayoutOption_MobileLandscape -> 439 Settings.LayoutOption_MobileLandscape ->
440 ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE 440 ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
441 Settings.LayoutOption_MobilePortrait -> 441 Settings.LayoutOption_MobilePortrait ->
@@ -617,7 +617,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
617 @SuppressLint("SourceLockedOrientationActivity") 617 @SuppressLint("SourceLockedOrientationActivity")
618 private fun startConfiguringControls() { 618 private fun startConfiguringControls() {
619 // Lock the current orientation to prevent editing inconsistencies 619 // Lock the current orientation to prevent editing inconsistencies
620 if (IntSetting.RENDERER_SCREEN_LAYOUT.int == Settings.LayoutOption_Unspecified) { 620 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == Settings.LayoutOption_Unspecified) {
621 emulationActivity?.let { 621 emulationActivity?.let {
622 it.requestedOrientation = 622 it.requestedOrientation =
623 if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { 623 if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
@@ -635,7 +635,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
635 binding.doneControlConfig.visibility = View.GONE 635 binding.doneControlConfig.visibility = View.GONE
636 binding.surfaceInputOverlay.setIsInEditMode(false) 636 binding.surfaceInputOverlay.setIsInEditMode(false)
637 // Unlock the orientation if it was locked for editing 637 // Unlock the orientation if it was locked for editing
638 if (IntSetting.RENDERER_SCREEN_LAYOUT.int == Settings.LayoutOption_Unspecified) { 638 if (IntSetting.RENDERER_SCREEN_LAYOUT.getInt() == Settings.LayoutOption_Unspecified) {
639 emulationActivity?.let { 639 emulationActivity?.let {
640 it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 640 it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
641 } 641 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
index b88d2c038..60e029f34 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsDialogFragment.kt
@@ -70,7 +70,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
70 sliderBinding = DialogSliderBinding.inflate(layoutInflater) 70 sliderBinding = DialogSliderBinding.inflate(layoutInflater)
71 val item = settingsViewModel.clickedItem as SliderSetting 71 val item = settingsViewModel.clickedItem as SliderSetting
72 72
73 settingsViewModel.setSliderTextValue(item.selectedValue.toFloat(), item.units) 73 settingsViewModel.setSliderTextValue(item.getSelectedValue().toFloat(), item.units)
74 sliderBinding.slider.apply { 74 sliderBinding.slider.apply {
75 valueFrom = item.min.toFloat() 75 valueFrom = item.min.toFloat()
76 valueTo = item.max.toFloat() 76 valueTo = item.max.toFloat()
@@ -136,18 +136,18 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
136 is SingleChoiceSetting -> { 136 is SingleChoiceSetting -> {
137 val scSetting = settingsViewModel.clickedItem as SingleChoiceSetting 137 val scSetting = settingsViewModel.clickedItem as SingleChoiceSetting
138 val value = getValueForSingleChoiceSelection(scSetting, which) 138 val value = getValueForSingleChoiceSelection(scSetting, which)
139 scSetting.selectedValue = value 139 scSetting.setSelectedValue(value)
140 } 140 }
141 141
142 is StringSingleChoiceSetting -> { 142 is StringSingleChoiceSetting -> {
143 val scSetting = settingsViewModel.clickedItem as StringSingleChoiceSetting 143 val scSetting = settingsViewModel.clickedItem as StringSingleChoiceSetting
144 val value = scSetting.getValueAt(which) 144 val value = scSetting.getValueAt(which)
145 scSetting.selectedValue = value 145 scSetting.setSelectedValue(value)
146 } 146 }
147 147
148 is SliderSetting -> { 148 is SliderSetting -> {
149 val sliderSetting = settingsViewModel.clickedItem as SliderSetting 149 val sliderSetting = settingsViewModel.clickedItem as SliderSetting
150 sliderSetting.selectedValue = settingsViewModel.sliderProgress.value 150 sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value)
151 } 151 }
152 } 152 }
153 closeDialog() 153 closeDialog()
@@ -171,7 +171,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
171 } 171 }
172 172
173 private fun getSelectionForSingleChoiceValue(item: SingleChoiceSetting): Int { 173 private fun getSelectionForSingleChoiceValue(item: SingleChoiceSetting): Int {
174 val value = item.selectedValue 174 val value = item.getSelectedValue()
175 val valuesId = item.valuesId 175 val valuesId = item.valuesId
176 if (valuesId > 0) { 176 if (valuesId > 0) {
177 val valuesArray = requireContext().resources.getIntArray(valuesId) 177 val valuesArray = requireContext().resources.getIntArray(valuesId)
@@ -211,7 +211,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
211 throw IllegalArgumentException("[SettingsDialogFragment] Incompatible type!") 211 throw IllegalArgumentException("[SettingsDialogFragment] Incompatible type!")
212 212
213 SettingsItem.TYPE_SLIDER -> settingsViewModel.setSliderProgress( 213 SettingsItem.TYPE_SLIDER -> settingsViewModel.setSliderProgress(
214 (clickedItem as SliderSetting).selectedValue.toFloat() 214 (clickedItem as SliderSetting).getSelectedValue().toFloat()
215 ) 215 )
216 } 216 }
217 settingsViewModel.clickedItem = clickedItem 217 settingsViewModel.clickedItem = clickedItem
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
index f4e1bb13f..4c7316ba3 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
@@ -31,32 +31,63 @@ object NativeConfig {
31 external fun saveSettings() 31 external fun saveSettings()
32 32
33 external fun getBoolean(key: String, getDefault: Boolean): Boolean 33 external fun getBoolean(key: String, getDefault: Boolean): Boolean
34
35 @Synchronized
36 external fun getBoolean(key: String, needsGlobal: Boolean): Boolean
37
38 @Synchronized
34 external fun setBoolean(key: String, value: Boolean) 39 external fun setBoolean(key: String, value: Boolean)
35 40
36 external fun getByte(key: String, getDefault: Boolean): Byte 41 @Synchronized
42 external fun getByte(key: String, needsGlobal: Boolean): Byte
43
44 @Synchronized
37 external fun setByte(key: String, value: Byte) 45 external fun setByte(key: String, value: Byte)
38 46
39 external fun getShort(key: String, getDefault: Boolean): Short 47 @Synchronized
48 external fun getShort(key: String, needsGlobal: Boolean): Short
49
50 @Synchronized
40 external fun setShort(key: String, value: Short) 51 external fun setShort(key: String, value: Short)
41 52
42 external fun getInt(key: String, getDefault: Boolean): Int 53 @Synchronized
54 external fun getInt(key: String, needsGlobal: Boolean): Int
55
56 @Synchronized
43 external fun setInt(key: String, value: Int) 57 external fun setInt(key: String, value: Int)
44 58
45 external fun getFloat(key: String, getDefault: Boolean): Float 59 @Synchronized
60 external fun getFloat(key: String, needsGlobal: Boolean): Float
61
62 @Synchronized
46 external fun setFloat(key: String, value: Float) 63 external fun setFloat(key: String, value: Float)
47 64
48 external fun getLong(key: String, getDefault: Boolean): Long 65 @Synchronized
66 external fun getLong(key: String, needsGlobal: Boolean): Long
67
68 @Synchronized
49 external fun setLong(key: String, value: Long) 69 external fun setLong(key: String, value: Long)
50 70
51 external fun getString(key: String, getDefault: Boolean): String 71 @Synchronized
72 external fun getString(key: String, needsGlobal: Boolean): String
73
74 @Synchronized
52 external fun setString(key: String, value: String) 75 external fun setString(key: String, value: String)
53 76
54 external fun getIsRuntimeModifiable(key: String): Boolean 77 external fun getIsRuntimeModifiable(key: String): Boolean
55 78
56 external fun getConfigHeader(category: Int): String
57
58 external fun getPairedSettingKey(key: String): String 79 external fun getPairedSettingKey(key: String): String
59 80
81 external fun getIsSwitchable(key: String): Boolean
82
83 @Synchronized
84 external fun usingGlobal(key: String): Boolean
85
86 @Synchronized
87 external fun setGlobal(key: String, global: Boolean)
88
89 external fun getDefaultToString(key: String): String
90
60 /** 91 /**
61 * Gets every [GameDir] in AndroidSettings::values.game_dirs 92 * Gets every [GameDir] in AndroidSettings::values.game_dirs
62 */ 93 */
diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp
index 763b2164c..9439d11e1 100644
--- a/src/android/app/src/main/jni/native_config.cpp
+++ b/src/android/app/src/main/jni/native_config.cpp
@@ -49,18 +49,12 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_saveSettings(JNIEnv* env, jobjec
49} 49}
50 50
51jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, 51jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj,
52 jstring jkey, jboolean getDefault) { 52 jstring jkey, jboolean needGlobal) {
53 auto setting = getSetting<bool>(env, jkey); 53 auto setting = getSetting<bool>(env, jkey);
54 if (setting == nullptr) { 54 if (setting == nullptr) {
55 return false; 55 return false;
56 } 56 }
57 setting->SetGlobal(true); 57 return setting->GetValue(static_cast<bool>(needGlobal));
58
59 if (static_cast<bool>(getDefault)) {
60 return setting->GetDefault();
61 }
62
63 return setting->GetValue();
64} 58}
65 59
66void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, 60void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey,
@@ -69,23 +63,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject
69 if (setting == nullptr) { 63 if (setting == nullptr) {
70 return; 64 return;
71 } 65 }
72 setting->SetGlobal(true);
73 setting->SetValue(static_cast<bool>(value)); 66 setting->SetValue(static_cast<bool>(value));
74} 67}
75 68
76jbyte Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, 69jbyte Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey,
77 jboolean getDefault) { 70 jboolean needGlobal) {
78 auto setting = getSetting<u8>(env, jkey); 71 auto setting = getSetting<u8>(env, jkey);
79 if (setting == nullptr) { 72 if (setting == nullptr) {
80 return -1; 73 return -1;
81 } 74 }
82 setting->SetGlobal(true); 75 return setting->GetValue(static_cast<bool>(needGlobal));
83
84 if (static_cast<bool>(getDefault)) {
85 return setting->GetDefault();
86 }
87
88 return setting->GetValue();
89} 76}
90 77
91void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, 78void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey,
@@ -94,23 +81,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj
94 if (setting == nullptr) { 81 if (setting == nullptr) {
95 return; 82 return;
96 } 83 }
97 setting->SetGlobal(true);
98 setting->SetValue(value); 84 setting->SetValue(value);
99} 85}
100 86
101jshort Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, 87jshort Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey,
102 jboolean getDefault) { 88 jboolean needGlobal) {
103 auto setting = getSetting<u16>(env, jkey); 89 auto setting = getSetting<u16>(env, jkey);
104 if (setting == nullptr) { 90 if (setting == nullptr) {
105 return -1; 91 return -1;
106 } 92 }
107 setting->SetGlobal(true); 93 return setting->GetValue(static_cast<bool>(needGlobal));
108
109 if (static_cast<bool>(getDefault)) {
110 return setting->GetDefault();
111 }
112
113 return setting->GetValue();
114} 94}
115 95
116void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, 96void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey,
@@ -119,23 +99,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject ob
119 if (setting == nullptr) { 99 if (setting == nullptr) {
120 return; 100 return;
121 } 101 }
122 setting->SetGlobal(true);
123 setting->SetValue(value); 102 setting->SetValue(value);
124} 103}
125 104
126jint Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, 105jint Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey,
127 jboolean getDefault) { 106 jboolean needGlobal) {
128 auto setting = getSetting<int>(env, jkey); 107 auto setting = getSetting<int>(env, jkey);
129 if (setting == nullptr) { 108 if (setting == nullptr) {
130 return -1; 109 return -1;
131 } 110 }
132 setting->SetGlobal(true); 111 return setting->GetValue(needGlobal);
133
134 if (static_cast<bool>(getDefault)) {
135 return setting->GetDefault();
136 }
137
138 return setting->GetValue();
139} 112}
140 113
141void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, 114void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey,
@@ -144,23 +117,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj,
144 if (setting == nullptr) { 117 if (setting == nullptr) {
145 return; 118 return;
146 } 119 }
147 setting->SetGlobal(true);
148 setting->SetValue(value); 120 setting->SetValue(value);
149} 121}
150 122
151jfloat Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, 123jfloat Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey,
152 jboolean getDefault) { 124 jboolean needGlobal) {
153 auto setting = getSetting<float>(env, jkey); 125 auto setting = getSetting<float>(env, jkey);
154 if (setting == nullptr) { 126 if (setting == nullptr) {
155 return -1; 127 return -1;
156 } 128 }
157 setting->SetGlobal(true); 129 return setting->GetValue(static_cast<bool>(needGlobal));
158
159 if (static_cast<bool>(getDefault)) {
160 return setting->GetDefault();
161 }
162
163 return setting->GetValue();
164} 130}
165 131
166void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, 132void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey,
@@ -169,23 +135,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject ob
169 if (setting == nullptr) { 135 if (setting == nullptr) {
170 return; 136 return;
171 } 137 }
172 setting->SetGlobal(true);
173 setting->SetValue(value); 138 setting->SetValue(value);
174} 139}
175 140
176jlong Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, 141jlong Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey,
177 jboolean getDefault) { 142 jboolean needGlobal) {
178 auto setting = getSetting<long>(env, jkey); 143 auto setting = getSetting<s64>(env, jkey);
179 if (setting == nullptr) { 144 if (setting == nullptr) {
180 return -1; 145 return -1;
181 } 146 }
182 setting->SetGlobal(true); 147 return setting->GetValue(static_cast<bool>(needGlobal));
183
184 if (static_cast<bool>(getDefault)) {
185 return setting->GetDefault();
186 }
187
188 return setting->GetValue();
189} 148}
190 149
191void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, 150void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey,
@@ -194,23 +153,16 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj
194 if (setting == nullptr) { 153 if (setting == nullptr) {
195 return; 154 return;
196 } 155 }
197 setting->SetGlobal(true);
198 setting->SetValue(value); 156 setting->SetValue(value);
199} 157}
200 158
201jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, 159jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey,
202 jboolean getDefault) { 160 jboolean needGlobal) {
203 auto setting = getSetting<std::string>(env, jkey); 161 auto setting = getSetting<std::string>(env, jkey);
204 if (setting == nullptr) { 162 if (setting == nullptr) {
205 return ToJString(env, ""); 163 return ToJString(env, "");
206 } 164 }
207 setting->SetGlobal(true); 165 return ToJString(env, setting->GetValue(static_cast<bool>(needGlobal)));
208
209 if (static_cast<bool>(getDefault)) {
210 return ToJString(env, setting->GetDefault());
211 }
212
213 return ToJString(env, setting->GetValue());
214} 166}
215 167
216void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, 168void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey,
@@ -220,27 +172,18 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o
220 return; 172 return;
221 } 173 }
222 174
223 setting->SetGlobal(true);
224 setting->SetValue(GetJString(env, value)); 175 setting->SetValue(GetJString(env, value));
225} 176}
226 177
227jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, 178jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj,
228 jstring jkey) { 179 jstring jkey) {
229 auto key = GetJString(env, jkey); 180 auto setting = getSetting<std::string>(env, jkey);
230 auto setting = Settings::values.linkage.by_key[key]; 181 if (setting != nullptr) {
231 if (setting != 0) {
232 return setting->RuntimeModfiable(); 182 return setting->RuntimeModfiable();
233 } 183 }
234 LOG_ERROR(Frontend, "[Android Native] Could not find setting - {}", key);
235 return true; 184 return true;
236} 185}
237 186
238jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getConfigHeader(JNIEnv* env, jobject obj,
239 jint jcategory) {
240 auto category = static_cast<Settings::Category>(jcategory);
241 return ToJString(env, Settings::TranslateCategory(category));
242}
243
244jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, 187jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj,
245 jstring jkey) { 188 jstring jkey) {
246 auto setting = getSetting<std::string>(env, jkey); 189 auto setting = getSetting<std::string>(env, jkey);
@@ -254,6 +197,41 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e
254 return ToJString(env, setting->PairedSetting()->GetLabel()); 197 return ToJString(env, setting->PairedSetting()->GetLabel());
255} 198}
256 199
200jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj,
201 jstring jkey) {
202 auto setting = getSetting<std::string>(env, jkey);
203 if (setting != nullptr) {
204 return setting->Switchable();
205 }
206 return false;
207}
208
209jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj,
210 jstring jkey) {
211 auto setting = getSetting<std::string>(env, jkey);
212 if (setting != nullptr) {
213 return setting->UsingGlobal();
214 }
215 return true;
216}
217
218void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey,
219 jboolean global) {
220 auto setting = getSetting<std::string>(env, jkey);
221 if (setting != nullptr) {
222 setting->SetGlobal(static_cast<bool>(global));
223 }
224}
225
226jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj,
227 jstring jkey) {
228 auto setting = getSetting<std::string>(env, jkey);
229 if (setting != nullptr) {
230 return ToJString(env, setting->DefaultToString());
231 }
232 return ToJString(env, "");
233}
234
257jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { 235jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) {
258 jclass gameDirClass = IDCache::GetGameDirClass(); 236 jclass gameDirClass = IDCache::GetGameDirClass();
259 jmethodID gameDirConstructor = IDCache::GetGameDirConstructor(); 237 jmethodID gameDirConstructor = IDCache::GetGameDirConstructor();
diff --git a/src/common/settings_setting.h b/src/common/settings_setting.h
index 3175ab07d..0b18ca5ec 100644
--- a/src/common/settings_setting.h
+++ b/src/common/settings_setting.h
@@ -81,6 +81,9 @@ public:
81 [[nodiscard]] virtual const Type& GetValue() const { 81 [[nodiscard]] virtual const Type& GetValue() const {
82 return value; 82 return value;
83 } 83 }
84 [[nodiscard]] virtual const Type& GetValue(bool need_global) const {
85 return value;
86 }
84 87
85 /** 88 /**
86 * Sets the setting to the given value. 89 * Sets the setting to the given value.
@@ -353,7 +356,7 @@ public:
353 } 356 }
354 return custom; 357 return custom;
355 } 358 }
356 [[nodiscard]] const Type& GetValue(bool need_global) const { 359 [[nodiscard]] const Type& GetValue(bool need_global) const override final {
357 if (use_global || need_global) { 360 if (use_global || need_global) {
358 return this->value; 361 return this->value;
359 } 362 }