From d76b2b5d266895cf1dd35da5449b34b22bb84656 Mon Sep 17 00:00:00 2001 From: nekle Date: Mon, 2 Feb 2026 06:07:26 +0100 Subject: [PATCH] [android] add toggle for quick settings to hide it and fix setting names (#3435) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3435 Reviewed-by: DraVee Reviewed-by: Lizzie Reviewed-by: CamilleLaVey Co-authored-by: nekle Co-committed-by: nekle --- .../yuzu/yuzu_emu/dialogs/QuickSettings.kt | 18 +++++-------- .../features/settings/model/BooleanSetting.kt | 3 ++- .../settings/model/view/SettingsItem.kt | 7 +++++ .../settings/ui/SettingsFragmentPresenter.kt | 2 ++ .../yuzu_emu/fragments/EmulationFragment.kt | 26 ++++++++++++++++--- .../app/src/main/jni/android_settings.h | 5 ++++ .../app/src/main/res/values/strings.xml | 2 ++ 7 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt index 11185f019e..992f8f2a16 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt @@ -22,14 +22,6 @@ import org.yuzu.yuzu_emu.features.settings.model.AbstractShortSetting import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting class QuickSettings(val emulationFragment: EmulationFragment) { - // Kinda a crappy workaround to get a title from setting keys - // Idk how to do this witthout hardcoding every single one - private fun getSettingTitle(settingKey: String): String { - return settingKey.replace("_", " ").split(" ") - .joinToString(" ") { it.replaceFirstChar { c -> c.uppercase() } } - - } - private fun saveSettings() { if (emulationFragment.shouldUseCustom) { NativeConfig.savePerGameConfig() @@ -60,6 +52,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { // settings fun addIntSetting( + name: Int, container: ViewGroup, setting: IntSetting, namesArrayId: Int, @@ -73,7 +66,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { val expandIcon = itemView.findViewById(R.id.expand_icon) val radioGroup = itemView.findViewById(R.id.radio_group) - titleView.text = getSettingTitle(setting.key) + titleView.text = YuzuApplication.appContext.getString(name) val names = emulationFragment.resources.getStringArray(namesArrayId) val values = emulationFragment.resources.getIntArray(valuesArrayId) @@ -115,6 +108,8 @@ class QuickSettings(val emulationFragment: EmulationFragment) { } fun addBooleanSetting( + name: Int, + container: ViewGroup, setting: BooleanSetting ) { @@ -125,7 +120,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { val titleView = itemView.findViewById(R.id.switch_title) val switchView = itemView.findViewById(R.id.setting_switch) - titleView.text = getSettingTitle(setting.key) + titleView.text = YuzuApplication.appContext.getString(name) switchContainer.visibility = View.VISIBLE switchView.isChecked = setting.getBoolean() @@ -141,6 +136,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { } fun addSliderSetting( + name: Int, container: ViewGroup, setting: AbstractSetting, minValue: Int = 0, @@ -156,7 +152,7 @@ class QuickSettings(val emulationFragment: EmulationFragment) { val slider = itemView.findViewById(R.id.setting_slider) - titleView.text = getSettingTitle(setting.key) + titleView.text = YuzuApplication.appContext.getString(name) sliderContainer.visibility = View.VISIBLE slider.valueFrom = minValue.toFloat() 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 2059177621..ee07e15474 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 @@ -82,8 +82,9 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { GPU_LOG_VULKAN_CALLS("gpu_log_vulkan_calls"), GPU_LOG_SHADER_DUMPS("gpu_log_shader_dumps"), GPU_LOG_MEMORY_TRACKING("gpu_log_memory_tracking"), - GPU_LOG_DRIVER_DEBUG("gpu_log_driver_debug"); + GPU_LOG_DRIVER_DEBUG("gpu_log_driver_debug"), + ENABLE_QUICK_SETTINGS("enable_quick_settings"); // external fun isFrameSkippingEnabled(): Boolean external fun isFrameInterpolationEnabled(): Boolean 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 870eec1a1b..0785e3fc8b 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 @@ -799,6 +799,13 @@ abstract class SettingsItem( descriptionId = R.string.enable_update_checks_description, ) ) + put( + SwitchSetting( + BooleanSetting.ENABLE_QUICK_SETTINGS, + titleId = R.string.enable_quick_settings, + descriptionId = R.string.enable_quick_settings_description, + ) + ) put( SwitchSetting( BooleanSetting.ENABLE_FOLDER_BUTTON, 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 490f2a97a5..5899382520 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 @@ -1074,6 +1074,8 @@ class SettingsFragmentPresenter( add(BooleanSetting.ENABLE_UPDATE_CHECKS.key) } + add(BooleanSetting.ENABLE_QUICK_SETTINGS.key) + add(HeaderSetting(R.string.theme_and_color)) 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 97f0dfa86a..0c091fdeb9 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 @@ -690,8 +690,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { }) binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) + if (!BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()) { + binding.drawerLayout.setDrawerLockMode( + DrawerLayout.LOCK_MODE_LOCKED_CLOSED, + binding.quickSettingsSheet + ) + } + updateGameTitle() + binding.inGameMenu.menu.findItem(R.id.menu_quick_settings)?.isVisible = + BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean() + binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply { val lockMode = IntSetting.LOCK_DRAWER.getInt() val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) { @@ -749,10 +759,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { true } - R.id.menu_quick_settings -> { - openQuickSettingsMenu() - true - } + if (BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()) + R.id.menu_quick_settings else 0 -> { + openQuickSettingsMenu() + true + } R.id.menu_settings_per_game -> { val action = HomeNavigationDirections.actionGlobalSettingsActivity( @@ -1045,11 +1056,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } quickSettings.addBooleanSetting( + R.string.frame_limit_enable, container, BooleanSetting.RENDERER_USE_SPEED_LIMIT, ) quickSettings.addSliderSetting( + R.string.frame_limit_slider, container, ShortSetting.RENDERER_SPEED_LIMIT, minValue = 0, @@ -1058,6 +1071,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) quickSettings.addBooleanSetting( + R.string.use_docked_mode, container, BooleanSetting.USE_DOCKED_MODE, ) @@ -1065,6 +1079,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { quickSettings.addDivider(container) quickSettings.addIntSetting( + R.string.renderer_accuracy, container, IntSetting.RENDERER_ACCURACY, R.array.rendererAccuracyNames, @@ -1073,6 +1088,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { quickSettings.addIntSetting( + R.string.renderer_scaling_filter, container, IntSetting.RENDERER_SCALING_FILTER, R.array.rendererScalingFilterNames, @@ -1080,6 +1096,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) quickSettings.addSliderSetting( + R.string.fsr_sharpness, container, IntSetting.FSR_SHARPENING_SLIDER, minValue = 0, @@ -1088,6 +1105,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { ) quickSettings.addIntSetting( + R.string.renderer_anti_aliasing, container, IntSetting.RENDERER_ANTI_ALIASING, R.array.rendererAntiAliasingNames, diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index b6fd37c9dd..7643d49532 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -202,9 +202,14 @@ namespace AndroidSettings { Settings::Specialization::Default, true, true, &show_soc_overlay}; + // MISC Settings::Setting dont_show_driver_shader_warning{linkage, false, "dont_show_driver_shader_warning", Settings::Category::Android, Settings::Specialization::Default, true, true}; + Settings::Setting enable_quick_settings{linkage, true, + "enable_quick_settings", + Settings::Category::Android, Settings::Specialization::Default, true, + false}; }; extern Values values; diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 1e49450b95..ff8b1e3c72 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -738,6 +738,8 @@ Graphics Accuracy level, resolution, shader cache Quick Settings + Enable Quick Settings + Allow access to quick settings menu via swipe and menu button Audio Output engine, volume Controls