diff options
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 | ||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui | 4 | package org.yuzu.yuzu_emu.features.settings.ui |
| 5 | 5 | ||
| 6 | import android.content.SharedPreferences | ||
| 7 | import android.os.Build | 6 | import android.os.Build |
| 8 | import android.widget.Toast | 7 | import android.widget.Toast |
| 9 | import androidx.preference.PreferenceManager | ||
| 10 | import org.yuzu.yuzu_emu.NativeLibrary | 8 | import org.yuzu.yuzu_emu.NativeLibrary |
| 11 | import org.yuzu.yuzu_emu.R | 9 | import org.yuzu.yuzu_emu.R |
| 12 | import org.yuzu.yuzu_emu.YuzuApplication | 10 | import 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 | ||
| 4 | package org.yuzu.yuzu_emu.utils | 4 | package org.yuzu.yuzu_emu.utils |
| 5 | 5 | ||
| 6 | import androidx.preference.PreferenceManager | ||
| 6 | import java.io.IOException | 7 | import java.io.IOException |
| 7 | import org.yuzu.yuzu_emu.NativeLibrary | 8 | import org.yuzu.yuzu_emu.NativeLibrary |
| 8 | import org.yuzu.yuzu_emu.YuzuApplication | 9 | import org.yuzu.yuzu_emu.YuzuApplication |
| 10 | import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting | ||
| 11 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | ||
| 12 | import org.yuzu.yuzu_emu.features.settings.model.Settings | ||
| 13 | import org.yuzu.yuzu_emu.utils.PreferenceUtil.migratePreference | ||
| 9 | 14 | ||
| 10 | object DirectoryInitialization { | 15 | object 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 | |||
| 4 | package org.yuzu.yuzu_emu.utils | ||
| 5 | |||
| 6 | import android.content.SharedPreferences | ||
| 7 | |||
| 8 | object 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 | |||
| 10 | import androidx.appcompat.app.AppCompatDelegate | 10 | import androidx.appcompat.app.AppCompatDelegate |
| 11 | import androidx.core.view.WindowCompat | 11 | import androidx.core.view.WindowCompat |
| 12 | import androidx.core.view.WindowInsetsControllerCompat | 12 | import androidx.core.view.WindowInsetsControllerCompat |
| 13 | import androidx.preference.PreferenceManager | ||
| 14 | import kotlin.math.roundToInt | 13 | import kotlin.math.roundToInt |
| 15 | import org.yuzu.yuzu_emu.R | 14 | import org.yuzu.yuzu_emu.R |
| 16 | import org.yuzu.yuzu_emu.YuzuApplication | 15 | import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting |
| 17 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 16 | import org.yuzu.yuzu_emu.features.settings.model.IntSetting |
| 18 | import org.yuzu.yuzu_emu.ui.main.ThemeProvider | 17 | import org.yuzu.yuzu_emu.ui.main.ThemeProvider |
| 19 | 18 | ||
| 20 | object ThemeHelper { | 19 | object 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 | |||
| 91 | enum 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 | ||
| 38 | extern Values values; | 43 | extern Values values; |