summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt4
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt1
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt74
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt33
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/PreferenceUtil.kt37
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt31
-rw-r--r--src/android/app/src/main/jni/android_settings.h5
8 files changed, 127 insertions, 61 deletions
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 16f06cd0a..110d15f1c 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
@@ -18,7 +18,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
18 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), 18 RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
19 RENDERER_DEBUG("debug"), 19 RENDERER_DEBUG("debug"),
20 PICTURE_IN_PICTURE("picture_in_picture"), 20 PICTURE_IN_PICTURE("picture_in_picture"),
21 USE_CUSTOM_RTC("custom_rtc_enabled"); 21 USE_CUSTOM_RTC("custom_rtc_enabled"),
22 BLACK_BACKGROUNDS("black_backgrounds");
22 23
23 override fun getBoolean(needsGlobal: Boolean): Boolean = 24 override fun getBoolean(needsGlobal: Boolean): Boolean =
24 NativeConfig.getBoolean(key, needsGlobal) 25 NativeConfig.getBoolean(key, needsGlobal)
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 df760440f..b0193d83e 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
@@ -19,7 +19,9 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
19 RENDERER_SCREEN_LAYOUT("screen_layout"), 19 RENDERER_SCREEN_LAYOUT("screen_layout"),
20 RENDERER_ASPECT_RATIO("aspect_ratio"), 20 RENDERER_ASPECT_RATIO("aspect_ratio"),
21 AUDIO_OUTPUT_ENGINE("output_engine"), 21 AUDIO_OUTPUT_ENGINE("output_engine"),
22 MAX_ANISOTROPY("max_anisotropy"); 22 MAX_ANISOTROPY("max_anisotropy"),
23 THEME("theme"),
24 THEME_MODE("theme_mode");
23 25
24 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) 26 override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
25 27
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 9551fc05e..360bdaf3e 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
@@ -54,6 +54,7 @@ object Settings {
54 const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps" 54 const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps"
55 const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay" 55 const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay"
56 56
57 // Deprecated theme preference keys
57 const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch" 58 const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
58 const val PREF_THEME = "Theme" 59 const val PREF_THEME = "Theme"
59 const val PREF_THEME_MODE = "ThemeMode" 60 const val PREF_THEME_MODE = "ThemeMode"
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 db1a1076c..2ad2f4966 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
@@ -3,10 +3,8 @@
3 3
4package org.yuzu.yuzu_emu.features.settings.ui 4package org.yuzu.yuzu_emu.features.settings.ui
5 5
6import android.content.SharedPreferences
7import android.os.Build 6import android.os.Build
8import android.widget.Toast 7import android.widget.Toast
9import androidx.preference.PreferenceManager
10import org.yuzu.yuzu_emu.NativeLibrary 8import org.yuzu.yuzu_emu.NativeLibrary
11import org.yuzu.yuzu_emu.R 9import org.yuzu.yuzu_emu.R
12import org.yuzu.yuzu_emu.YuzuApplication 10import org.yuzu.yuzu_emu.YuzuApplication
@@ -29,9 +27,6 @@ class SettingsFragmentPresenter(
29) { 27) {
30 private var settingsList = ArrayList<SettingsItem>() 28 private var settingsList = ArrayList<SettingsItem>()
31 29
32 private val preferences: SharedPreferences
33 get() = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
34
35 // Extension for altering settings list based on each setting's properties 30 // Extension for altering settings list based on each setting's properties
36 fun ArrayList<SettingsItem>.add(key: String) { 31 fun ArrayList<SettingsItem>.add(key: String) {
37 val item = SettingsItem.settingsItems[key]!! 32 val item = SettingsItem.settingsItems[key]!!
@@ -170,25 +165,19 @@ class SettingsFragmentPresenter(
170 private fun addThemeSettings(sl: ArrayList<SettingsItem>) { 165 private fun addThemeSettings(sl: ArrayList<SettingsItem>) {
171 sl.apply { 166 sl.apply {
172 val theme: AbstractIntSetting = object : AbstractIntSetting { 167 val theme: AbstractIntSetting = object : AbstractIntSetting {
173 override fun getInt(needsGlobal: Boolean): Int = 168 override fun getInt(needsGlobal: Boolean): Int = IntSetting.THEME.getInt()
174 preferences.getInt(Settings.PREF_THEME, 0)
175
176 override fun setInt(value: Int) { 169 override fun setInt(value: Int) {
177 preferences.edit() 170 IntSetting.THEME.setInt(value)
178 .putInt(Settings.PREF_THEME, value)
179 .apply()
180 settingsViewModel.setShouldRecreate(true) 171 settingsViewModel.setShouldRecreate(true)
181 } 172 }
182 173
183 override val key: String = Settings.PREF_THEME 174 override val key: String = IntSetting.THEME.key
184 override val isRuntimeModifiable: Boolean = false 175 override val isRuntimeModifiable: Boolean = IntSetting.THEME.isRuntimeModifiable
185 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString() 176 override fun getValueAsString(needsGlobal: Boolean): String =
186 override val defaultValue: Int = 0 177 IntSetting.THEME.getValueAsString()
187 override fun reset() { 178
188 preferences.edit() 179 override val defaultValue: Int = IntSetting.THEME.defaultValue
189 .putInt(Settings.PREF_THEME, defaultValue) 180 override fun reset() = IntSetting.THEME.setInt(defaultValue)
190 .apply()
191 }
192 } 181 }
193 182
194 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { 183 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
@@ -214,24 +203,22 @@ class SettingsFragmentPresenter(
214 } 203 }
215 204
216 val themeMode: AbstractIntSetting = object : AbstractIntSetting { 205 val themeMode: AbstractIntSetting = object : AbstractIntSetting {
217 override fun getInt(needsGlobal: Boolean): Int = 206 override fun getInt(needsGlobal: Boolean): Int = IntSetting.THEME_MODE.getInt()
218 preferences.getInt(Settings.PREF_THEME_MODE, -1)
219
220 override fun setInt(value: Int) { 207 override fun setInt(value: Int) {
221 preferences.edit() 208 IntSetting.THEME_MODE.setInt(value)
222 .putInt(Settings.PREF_THEME_MODE, value)
223 .apply()
224 settingsViewModel.setShouldRecreate(true) 209 settingsViewModel.setShouldRecreate(true)
225 } 210 }
226 211
227 override val key: String = Settings.PREF_THEME_MODE 212 override val key: String = IntSetting.THEME_MODE.key
228 override val isRuntimeModifiable: Boolean = false 213 override val isRuntimeModifiable: Boolean =
229 override fun getValueAsString(needsGlobal: Boolean): String = getInt().toString() 214 IntSetting.THEME_MODE.isRuntimeModifiable
230 override val defaultValue: Int = -1 215
216 override fun getValueAsString(needsGlobal: Boolean): String =
217 IntSetting.THEME_MODE.getValueAsString()
218
219 override val defaultValue: Int = IntSetting.THEME_MODE.defaultValue
231 override fun reset() { 220 override fun reset() {
232 preferences.edit() 221 IntSetting.THEME_MODE.setInt(defaultValue)
233 .putInt(Settings.PREF_BLACK_BACKGROUNDS, defaultValue)
234 .apply()
235 settingsViewModel.setShouldRecreate(true) 222 settingsViewModel.setShouldRecreate(true)
236 } 223 }
237 } 224 }
@@ -248,25 +235,24 @@ class SettingsFragmentPresenter(
248 235
249 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting { 236 val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting {
250 override fun getBoolean(needsGlobal: Boolean): Boolean = 237 override fun getBoolean(needsGlobal: Boolean): Boolean =
251 preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false) 238 BooleanSetting.BLACK_BACKGROUNDS.getBoolean()
252 239
253 override fun setBoolean(value: Boolean) { 240 override fun setBoolean(value: Boolean) {
254 preferences.edit() 241 BooleanSetting.BLACK_BACKGROUNDS.setBoolean(value)
255 .putBoolean(Settings.PREF_BLACK_BACKGROUNDS, value)
256 .apply()
257 settingsViewModel.setShouldRecreate(true) 242 settingsViewModel.setShouldRecreate(true)
258 } 243 }
259 244
260 override val key: String = Settings.PREF_BLACK_BACKGROUNDS 245 override val key: String = BooleanSetting.BLACK_BACKGROUNDS.key
261 override val isRuntimeModifiable: Boolean = false 246 override val isRuntimeModifiable: Boolean =
247 BooleanSetting.BLACK_BACKGROUNDS.isRuntimeModifiable
248
262 override fun getValueAsString(needsGlobal: Boolean): String = 249 override fun getValueAsString(needsGlobal: Boolean): String =
263 getBoolean().toString() 250 BooleanSetting.BLACK_BACKGROUNDS.getValueAsString()
264 251
265 override val defaultValue: Boolean = false 252 override val defaultValue: Boolean = BooleanSetting.BLACK_BACKGROUNDS.defaultValue
266 override fun reset() { 253 override fun reset() {
267 preferences.edit() 254 BooleanSetting.BLACK_BACKGROUNDS
268 .putBoolean(Settings.PREF_BLACK_BACKGROUNDS, defaultValue) 255 .setBoolean(BooleanSetting.BLACK_BACKGROUNDS.defaultValue)
269 .apply()
270 settingsViewModel.setShouldRecreate(true) 256 settingsViewModel.setShouldRecreate(true)
271 } 257 }
272 } 258 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
index 0197fd712..d4a9da06f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
@@ -3,9 +3,14 @@
3 3
4package org.yuzu.yuzu_emu.utils 4package org.yuzu.yuzu_emu.utils
5 5
6import androidx.preference.PreferenceManager
6import java.io.IOException 7import java.io.IOException
7import org.yuzu.yuzu_emu.NativeLibrary 8import org.yuzu.yuzu_emu.NativeLibrary
8import org.yuzu.yuzu_emu.YuzuApplication 9import org.yuzu.yuzu_emu.YuzuApplication
10import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
11import org.yuzu.yuzu_emu.features.settings.model.IntSetting
12import org.yuzu.yuzu_emu.features.settings.model.Settings
13import org.yuzu.yuzu_emu.utils.PreferenceUtil.migratePreference
9 14
10object DirectoryInitialization { 15object DirectoryInitialization {
11 private var userPath: String? = null 16 private var userPath: String? = null
@@ -17,6 +22,7 @@ object DirectoryInitialization {
17 initializeInternalStorage() 22 initializeInternalStorage()
18 NativeLibrary.initializeSystem(false) 23 NativeLibrary.initializeSystem(false)
19 NativeConfig.initializeGlobalConfig() 24 NativeConfig.initializeGlobalConfig()
25 migrateSettings()
20 areDirectoriesReady = true 26 areDirectoriesReady = true
21 } 27 }
22 } 28 }
@@ -35,4 +41,31 @@ object DirectoryInitialization {
35 e.printStackTrace() 41 e.printStackTrace()
36 } 42 }
37 } 43 }
44
45 private fun migrateSettings() {
46 val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
47 var saveConfig = false
48 val theme = preferences.migratePreference<Int>(Settings.PREF_THEME)
49 if (theme != null) {
50 IntSetting.THEME.setInt(theme)
51 saveConfig = true
52 }
53
54 val themeMode = preferences.migratePreference<Int>(Settings.PREF_THEME_MODE)
55 if (themeMode != null) {
56 IntSetting.THEME_MODE.setInt(themeMode)
57 saveConfig = true
58 }
59
60 val blackBackgrounds =
61 preferences.migratePreference<Boolean>(Settings.PREF_BLACK_BACKGROUNDS)
62 if (blackBackgrounds != null) {
63 BooleanSetting.BLACK_BACKGROUNDS.setBoolean(blackBackgrounds)
64 saveConfig = true
65 }
66
67 if (saveConfig) {
68 NativeConfig.saveGlobalConfig()
69 }
70 }
38} 71}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/PreferenceUtil.kt
new file mode 100644
index 000000000..a233ba25c
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/PreferenceUtil.kt
@@ -0,0 +1,37 @@
1// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.utils
5
6import android.content.SharedPreferences
7
8object PreferenceUtil {
9 /**
10 * Retrieves a shared preference value and then deletes the value in storage.
11 * @param key Associated key for the value in this preferences instance
12 * @return Typed value associated with [key]. Null if no such key exists.
13 */
14 inline fun <reified T> SharedPreferences.migratePreference(key: String): T? {
15 if (!this.contains(key)) {
16 return null
17 }
18
19 val value: Any = when (T::class) {
20 String::class -> this.getString(key, "")!!
21
22 Boolean::class -> this.getBoolean(key, false)
23
24 Int::class -> this.getInt(key, 0)
25
26 Float::class -> this.getFloat(key, 0f)
27
28 Long::class -> this.getLong(key, 0)
29
30 else -> throw IllegalStateException("Tried to migrate preference with invalid type!")
31 }
32 deletePreference(key)
33 return value as T
34 }
35
36 fun SharedPreferences.deletePreference(key: String) = this.edit().remove(key).apply()
37}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt
index f312e24cf..792f6a253 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt
@@ -10,33 +10,26 @@ import androidx.appcompat.app.AppCompatActivity
10import androidx.appcompat.app.AppCompatDelegate 10import androidx.appcompat.app.AppCompatDelegate
11import androidx.core.view.WindowCompat 11import androidx.core.view.WindowCompat
12import androidx.core.view.WindowInsetsControllerCompat 12import androidx.core.view.WindowInsetsControllerCompat
13import androidx.preference.PreferenceManager
14import kotlin.math.roundToInt 13import kotlin.math.roundToInt
15import org.yuzu.yuzu_emu.R 14import org.yuzu.yuzu_emu.R
16import org.yuzu.yuzu_emu.YuzuApplication 15import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
17import org.yuzu.yuzu_emu.features.settings.model.Settings 16import org.yuzu.yuzu_emu.features.settings.model.IntSetting
18import org.yuzu.yuzu_emu.ui.main.ThemeProvider 17import org.yuzu.yuzu_emu.ui.main.ThemeProvider
19 18
20object ThemeHelper { 19object ThemeHelper {
21 const val SYSTEM_BAR_ALPHA = 0.9f 20 const val SYSTEM_BAR_ALPHA = 0.9f
22 21
23 private const val DEFAULT = 0
24 private const val MATERIAL_YOU = 1
25
26 fun setTheme(activity: AppCompatActivity) { 22 fun setTheme(activity: AppCompatActivity) {
27 val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
28 setThemeMode(activity) 23 setThemeMode(activity)
29 when (preferences.getInt(Settings.PREF_THEME, 0)) { 24 when (Theme.from(IntSetting.THEME.getInt())) {
30 DEFAULT -> activity.setTheme(R.style.Theme_Yuzu_Main) 25 Theme.Default -> activity.setTheme(R.style.Theme_Yuzu_Main)
31 MATERIAL_YOU -> activity.setTheme(R.style.Theme_Yuzu_Main_MaterialYou) 26 Theme.MaterialYou -> activity.setTheme(R.style.Theme_Yuzu_Main_MaterialYou)
32 } 27 }
33 28
34 // Using a specific night mode check because this could apply incorrectly when using the 29 // Using a specific night mode check because this could apply incorrectly when using the
35 // light app mode, dark system mode, and black backgrounds. Launching the settings activity 30 // light app mode, dark system mode, and black backgrounds. Launching the settings activity
36 // will then show light mode colors/navigation bars but with black backgrounds. 31 // will then show light mode colors/navigation bars but with black backgrounds.
37 if (preferences.getBoolean(Settings.PREF_BLACK_BACKGROUNDS, false) && 32 if (BooleanSetting.BLACK_BACKGROUNDS.getBoolean() && isNightMode(activity)) {
38 isNightMode(activity)
39 ) {
40 activity.setTheme(R.style.ThemeOverlay_Yuzu_Dark) 33 activity.setTheme(R.style.ThemeOverlay_Yuzu_Dark)
41 } 34 }
42 } 35 }
@@ -60,8 +53,7 @@ object ThemeHelper {
60 } 53 }
61 54
62 fun setThemeMode(activity: AppCompatActivity) { 55 fun setThemeMode(activity: AppCompatActivity) {
63 val themeMode = PreferenceManager.getDefaultSharedPreferences(activity.applicationContext) 56 val themeMode = IntSetting.THEME_MODE.getInt()
64 .getInt(Settings.PREF_THEME_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
65 activity.delegate.localNightMode = themeMode 57 activity.delegate.localNightMode = themeMode
66 val windowController = WindowCompat.getInsetsController( 58 val windowController = WindowCompat.getInsetsController(
67 activity.window, 59 activity.window,
@@ -95,3 +87,12 @@ object ThemeHelper {
95 windowController.isAppearanceLightNavigationBars = false 87 windowController.isAppearanceLightNavigationBars = false
96 } 88 }
97} 89}
90
91enum class Theme(val int: Int) {
92 Default(0),
93 MaterialYou(1);
94
95 companion object {
96 fun from(int: Int): Theme = entries.firstOrNull { it.int == int } ?: Default
97 }
98}
diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h
index 3733f5a3c..1e4906b9a 100644
--- a/src/android/app/src/main/jni/android_settings.h
+++ b/src/android/app/src/main/jni/android_settings.h
@@ -33,6 +33,11 @@ struct Values {
33 33
34 Settings::SwitchableSetting<std::string, false> driver_path{linkage, "", "driver_path", 34 Settings::SwitchableSetting<std::string, false> driver_path{linkage, "", "driver_path",
35 Settings::Category::GpuDriver}; 35 Settings::Category::GpuDriver};
36
37 Settings::Setting<s32> theme{linkage, 0, "theme", Settings::Category::Android};
38 Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
39 Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
40 Settings::Category::Android};
36}; 41};
37 42
38extern Values values; 43extern Values values;