Merge pull request #12018 from t895/settings-cleanup
android: Settings visual cleanup
This commit is contained in:
		@@ -82,7 +82,6 @@ object Settings {
 | 
			
		||||
 | 
			
		||||
    enum class MenuTag(val titleId: Int) {
 | 
			
		||||
        SECTION_ROOT(R.string.advanced_settings),
 | 
			
		||||
        SECTION_GENERAL(R.string.preferences_general),
 | 
			
		||||
        SECTION_SYSTEM(R.string.preferences_system),
 | 
			
		||||
        SECTION_RENDERER(R.string.preferences_graphics),
 | 
			
		||||
        SECTION_AUDIO(R.string.preferences_audio),
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,13 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.model.view
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.DrawableRes
 | 
			
		||||
 | 
			
		||||
class RunnableSetting(
 | 
			
		||||
    titleId: Int,
 | 
			
		||||
    descriptionId: Int,
 | 
			
		||||
    val isRuntimeRunnable: Boolean,
 | 
			
		||||
    @DrawableRes val iconId: Int = 0,
 | 
			
		||||
    val runnable: () -> Unit
 | 
			
		||||
) : SettingsItem(emptySetting, titleId, descriptionId) {
 | 
			
		||||
    override val type = TYPE_RUNNABLE
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,14 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.model.view
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.DrawableRes
 | 
			
		||||
import androidx.annotation.StringRes
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
 | 
			
		||||
 | 
			
		||||
class SubmenuSetting(
 | 
			
		||||
    titleId: Int,
 | 
			
		||||
    descriptionId: Int,
 | 
			
		||||
    @StringRes titleId: Int,
 | 
			
		||||
    @StringRes descriptionId: Int,
 | 
			
		||||
    @DrawableRes val iconId: Int,
 | 
			
		||||
    val menuKey: Settings.MenuTag
 | 
			
		||||
) : SettingsItem(emptySetting, titleId, descriptionId) {
 | 
			
		||||
    override val type = TYPE_SUBMENU
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ import androidx.lifecycle.repeatOnLifecycle
 | 
			
		||||
import androidx.navigation.findNavController
 | 
			
		||||
import androidx.navigation.fragment.navArgs
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import com.google.android.material.divider.MaterialDividerItemDecoration
 | 
			
		||||
import com.google.android.material.transition.MaterialSharedAxis
 | 
			
		||||
import kotlinx.coroutines.flow.collectLatest
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
@@ -68,15 +67,9 @@ class SettingsFragment : Fragment() {
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        binding.toolbarSettingsLayout.title = getString(args.menuTag.titleId)
 | 
			
		||||
        val dividerDecoration = MaterialDividerItemDecoration(
 | 
			
		||||
            requireContext(),
 | 
			
		||||
            LinearLayoutManager.VERTICAL
 | 
			
		||||
        )
 | 
			
		||||
        dividerDecoration.isLastItemDecorated = false
 | 
			
		||||
        binding.listSettings.apply {
 | 
			
		||||
            adapter = settingsAdapter
 | 
			
		||||
            layoutManager = LinearLayoutManager(requireContext())
 | 
			
		||||
            addItemDecoration(dividerDecoration)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.toolbarSettings.setNavigationOnClickListener {
 | 
			
		||||
@@ -94,17 +87,6 @@ class SettingsFragment : Fragment() {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            launch {
 | 
			
		||||
                settingsViewModel.isUsingSearch.collectLatest {
 | 
			
		||||
                    if (it) {
 | 
			
		||||
                        reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
 | 
			
		||||
                        exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
 | 
			
		||||
                        exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (args.menuTag == Settings.MenuTag.SECTION_ROOT) {
 | 
			
		||||
@@ -112,8 +94,6 @@ class SettingsFragment : Fragment() {
 | 
			
		||||
            binding.toolbarSettings.setOnMenuItemClickListener {
 | 
			
		||||
                when (it.itemId) {
 | 
			
		||||
                    R.id.action_search -> {
 | 
			
		||||
                        reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
 | 
			
		||||
                        exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
 | 
			
		||||
                        view.findNavController()
 | 
			
		||||
                            .navigate(R.id.action_settingsFragment_to_settingsSearchFragment)
 | 
			
		||||
                        true
 | 
			
		||||
@@ -129,11 +109,6 @@ class SettingsFragment : Fragment() {
 | 
			
		||||
        setInsets()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onResume() {
 | 
			
		||||
        super.onResume()
 | 
			
		||||
        settingsViewModel.setIsUsingSearch(false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setInsets() {
 | 
			
		||||
        ViewCompat.setOnApplyWindowInsetsListener(
 | 
			
		||||
            binding.root
 | 
			
		||||
@@ -144,10 +119,9 @@ class SettingsFragment : Fragment() {
 | 
			
		||||
            val leftInsets = barInsets.left + cutoutInsets.left
 | 
			
		||||
            val rightInsets = barInsets.right + cutoutInsets.right
 | 
			
		||||
 | 
			
		||||
            val sideMargin = resources.getDimensionPixelSize(R.dimen.spacing_medlarge)
 | 
			
		||||
            val mlpSettingsList = binding.listSettings.layoutParams as MarginLayoutParams
 | 
			
		||||
            mlpSettingsList.leftMargin = sideMargin + leftInsets
 | 
			
		||||
            mlpSettingsList.rightMargin = sideMargin + rightInsets
 | 
			
		||||
            mlpSettingsList.leftMargin = leftInsets
 | 
			
		||||
            mlpSettingsList.rightMargin = rightInsets
 | 
			
		||||
            binding.listSettings.layoutParams = mlpSettingsList
 | 
			
		||||
            binding.listSettings.updatePadding(
 | 
			
		||||
                bottom = barInsets.bottom
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@
 | 
			
		||||
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.ui
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
@@ -32,8 +31,6 @@ class SettingsFragmentPresenter(
 | 
			
		||||
    private val preferences: SharedPreferences
 | 
			
		||||
        get() = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
 | 
			
		||||
 | 
			
		||||
    private val context: Context get() = YuzuApplication.appContext
 | 
			
		||||
 | 
			
		||||
    // Extension for populating settings list based on paired settings
 | 
			
		||||
    fun ArrayList<SettingsItem>.add(key: String) {
 | 
			
		||||
        val item = SettingsItem.settingsItems[key]!!
 | 
			
		||||
@@ -53,7 +50,6 @@ class SettingsFragmentPresenter(
 | 
			
		||||
        val sl = ArrayList<SettingsItem>()
 | 
			
		||||
        when (menuTag) {
 | 
			
		||||
            Settings.MenuTag.SECTION_ROOT -> addConfigSettings(sl)
 | 
			
		||||
            Settings.MenuTag.SECTION_GENERAL -> addGeneralSettings(sl)
 | 
			
		||||
            Settings.MenuTag.SECTION_SYSTEM -> addSystemSettings(sl)
 | 
			
		||||
            Settings.MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
 | 
			
		||||
            Settings.MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
 | 
			
		||||
@@ -75,30 +71,53 @@ class SettingsFragmentPresenter(
 | 
			
		||||
 | 
			
		||||
    private fun addConfigSettings(sl: ArrayList<SettingsItem>) {
 | 
			
		||||
        sl.apply {
 | 
			
		||||
            add(SubmenuSetting(R.string.preferences_general, 0, Settings.MenuTag.SECTION_GENERAL))
 | 
			
		||||
            add(SubmenuSetting(R.string.preferences_system, 0, Settings.MenuTag.SECTION_SYSTEM))
 | 
			
		||||
            add(SubmenuSetting(R.string.preferences_graphics, 0, Settings.MenuTag.SECTION_RENDERER))
 | 
			
		||||
            add(SubmenuSetting(R.string.preferences_audio, 0, Settings.MenuTag.SECTION_AUDIO))
 | 
			
		||||
            add(SubmenuSetting(R.string.preferences_debug, 0, Settings.MenuTag.SECTION_DEBUG))
 | 
			
		||||
            add(
 | 
			
		||||
                RunnableSetting(R.string.reset_to_default, 0, false) {
 | 
			
		||||
                    settingsViewModel.setShouldShowResetSettingsDialog(true)
 | 
			
		||||
                }
 | 
			
		||||
                SubmenuSetting(
 | 
			
		||||
                    R.string.preferences_system,
 | 
			
		||||
                    R.string.preferences_system_description,
 | 
			
		||||
                    R.drawable.ic_system_settings,
 | 
			
		||||
                    Settings.MenuTag.SECTION_SYSTEM
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            add(
 | 
			
		||||
                SubmenuSetting(
 | 
			
		||||
                    R.string.preferences_graphics,
 | 
			
		||||
                    R.string.preferences_graphics_description,
 | 
			
		||||
                    R.drawable.ic_graphics,
 | 
			
		||||
                    Settings.MenuTag.SECTION_RENDERER
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            add(
 | 
			
		||||
                SubmenuSetting(
 | 
			
		||||
                    R.string.preferences_audio,
 | 
			
		||||
                    R.string.preferences_audio_description,
 | 
			
		||||
                    R.drawable.ic_audio,
 | 
			
		||||
                    Settings.MenuTag.SECTION_AUDIO
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            add(
 | 
			
		||||
                SubmenuSetting(
 | 
			
		||||
                    R.string.preferences_debug,
 | 
			
		||||
                    R.string.preferences_debug_description,
 | 
			
		||||
                    R.drawable.ic_code,
 | 
			
		||||
                    Settings.MenuTag.SECTION_DEBUG
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            add(
 | 
			
		||||
                RunnableSetting(
 | 
			
		||||
                    R.string.reset_to_default,
 | 
			
		||||
                    R.string.reset_to_default_description,
 | 
			
		||||
                    false,
 | 
			
		||||
                    R.drawable.ic_restore
 | 
			
		||||
                ) { settingsViewModel.setShouldShowResetSettingsDialog(true) }
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun addGeneralSettings(sl: ArrayList<SettingsItem>) {
 | 
			
		||||
        sl.apply {
 | 
			
		||||
            add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key)
 | 
			
		||||
            add(ShortSetting.RENDERER_SPEED_LIMIT.key)
 | 
			
		||||
            add(IntSetting.CPU_ACCURACY.key)
 | 
			
		||||
            add(BooleanSetting.PICTURE_IN_PICTURE.key)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun addSystemSettings(sl: ArrayList<SettingsItem>) {
 | 
			
		||||
        sl.apply {
 | 
			
		||||
            add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key)
 | 
			
		||||
            add(ShortSetting.RENDERER_SPEED_LIMIT.key)
 | 
			
		||||
            add(BooleanSetting.USE_DOCKED_MODE.key)
 | 
			
		||||
            add(IntSetting.REGION_INDEX.key)
 | 
			
		||||
            add(IntSetting.LANGUAGE_INDEX.key)
 | 
			
		||||
@@ -116,6 +135,7 @@ class SettingsFragmentPresenter(
 | 
			
		||||
            add(IntSetting.RENDERER_ANTI_ALIASING.key)
 | 
			
		||||
            add(IntSetting.RENDERER_SCREEN_LAYOUT.key)
 | 
			
		||||
            add(IntSetting.RENDERER_ASPECT_RATIO.key)
 | 
			
		||||
            add(BooleanSetting.PICTURE_IN_PICTURE.key)
 | 
			
		||||
            add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
 | 
			
		||||
            add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
 | 
			
		||||
            add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
 | 
			
		||||
@@ -249,6 +269,7 @@ class SettingsFragmentPresenter(
 | 
			
		||||
            add(BooleanSetting.RENDERER_DEBUG.key)
 | 
			
		||||
 | 
			
		||||
            add(HeaderSetting(R.string.cpu))
 | 
			
		||||
            add(IntSetting.CPU_ACCURACY.key)
 | 
			
		||||
            add(BooleanSetting.CPU_DEBUG_MODE.key)
 | 
			
		||||
            add(SettingsItem.FASTMEM_COMBINED)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.content.res.ResourcesCompat
 | 
			
		||||
import org.yuzu.yuzu_emu.NativeLibrary
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting
 | 
			
		||||
@@ -16,6 +17,19 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
 | 
			
		||||
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        setting = item as RunnableSetting
 | 
			
		||||
        if (item.iconId != 0) {
 | 
			
		||||
            binding.icon.visibility = View.VISIBLE
 | 
			
		||||
            binding.icon.setImageDrawable(
 | 
			
		||||
                ResourcesCompat.getDrawable(
 | 
			
		||||
                    binding.icon.resources,
 | 
			
		||||
                    item.iconId,
 | 
			
		||||
                    binding.icon.context.theme
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.icon.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingName.setText(item.nameId)
 | 
			
		||||
        if (item.descriptionId != 0) {
 | 
			
		||||
            binding.textSettingDescription.setText(item.descriptionId)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.core.content.res.ResourcesCompat
 | 
			
		||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
 | 
			
		||||
@@ -15,6 +16,19 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
 | 
			
		||||
 | 
			
		||||
    override fun bind(item: SettingsItem) {
 | 
			
		||||
        this.item = item as SubmenuSetting
 | 
			
		||||
        if (item.iconId != 0) {
 | 
			
		||||
            binding.icon.visibility = View.VISIBLE
 | 
			
		||||
            binding.icon.setImageDrawable(
 | 
			
		||||
                ResourcesCompat.getDrawable(
 | 
			
		||||
                    binding.icon.resources,
 | 
			
		||||
                    item.iconId,
 | 
			
		||||
                    binding.icon.context.theme
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.icon.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.textSettingName.setText(item.nameId)
 | 
			
		||||
        if (item.descriptionId != 0) {
 | 
			
		||||
            binding.textSettingDescription.setText(item.descriptionId)
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,10 @@ class SettingsSearchFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
        enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
 | 
			
		||||
        returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
 | 
			
		||||
        enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
 | 
			
		||||
        returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
 | 
			
		||||
        reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
 | 
			
		||||
        exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreateView(
 | 
			
		||||
@@ -55,7 +57,6 @@ class SettingsSearchFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedInstanceState)
 | 
			
		||||
        settingsViewModel.setIsUsingSearch(true)
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            binding.searchText.setText(savedInstanceState.getString(SEARCH_TEXT))
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,6 @@ class SettingsViewModel : ViewModel() {
 | 
			
		||||
    val shouldReloadSettingsList: StateFlow<Boolean> get() = _shouldReloadSettingsList
 | 
			
		||||
    private val _shouldReloadSettingsList = MutableStateFlow(false)
 | 
			
		||||
 | 
			
		||||
    val isUsingSearch: StateFlow<Boolean> get() = _isUsingSearch
 | 
			
		||||
    private val _isUsingSearch = MutableStateFlow(false)
 | 
			
		||||
 | 
			
		||||
    val sliderProgress: StateFlow<Int> get() = _sliderProgress
 | 
			
		||||
    private val _sliderProgress = MutableStateFlow(-1)
 | 
			
		||||
 | 
			
		||||
@@ -57,10 +54,6 @@ class SettingsViewModel : ViewModel() {
 | 
			
		||||
        _shouldReloadSettingsList.value = value
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun setIsUsingSearch(value: Boolean) {
 | 
			
		||||
        _isUsingSearch.value = value
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun setSliderTextValue(value: Float, units: String) {
 | 
			
		||||
        _sliderProgress.value = value.toInt()
 | 
			
		||||
        _sliderTextValue.value = String.format(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_audio.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_audio.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:viewportHeight="24"
 | 
			
		||||
    android:viewportWidth="24">
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="?attr/colorControlNormal"
 | 
			
		||||
        android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
 | 
			
		||||
</vector>
 | 
			
		||||
							
								
								
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_code.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_code.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:viewportWidth="960"
 | 
			
		||||
    android:viewportHeight="960">
 | 
			
		||||
  <path
 | 
			
		||||
      android:fillColor="?attr/colorControlNormal"
 | 
			
		||||
      android:pathData="M320,720 L80,480l240,-240 57,57 -184,184 183,183 -56,56ZM640,720 L583,663 767,479 584,296 640,240 880,480 640,720Z"/>
 | 
			
		||||
</vector>
 | 
			
		||||
							
								
								
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_graphics.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/android/app/src/main/res/drawable/ic_graphics.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:viewportWidth="960"
 | 
			
		||||
    android:viewportHeight="960">
 | 
			
		||||
  <path
 | 
			
		||||
      android:fillColor="?attr/colorControlNormal"
 | 
			
		||||
      android:pathData="M160,840q-33,0 -56.5,-23.5T80,760v-560q0,-33 23.5,-56.5T160,120h560q33,0 56.5,23.5T800,200v80h80v80h-80v80h80v80h-80v80h80v80h-80v80q0,33 -23.5,56.5T720,840L160,840ZM160,760h560v-560L160,200v560ZM240,680h200v-160L240,520v160ZM480,400h160v-120L480,280v120ZM240,480h200v-200L240,280v200ZM480,680h160v-240L480,440v240ZM160,200v560,-560Z"/>
 | 
			
		||||
</vector>
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:viewportWidth="960"
 | 
			
		||||
    android:viewportHeight="960">
 | 
			
		||||
  <path
 | 
			
		||||
      android:fillColor="?attr/colorControlNormal"
 | 
			
		||||
      android:pathData="M320,960q-17,0 -28.5,-11.5T280,920q0,-17 11.5,-28.5T320,880q17,0 28.5,11.5T360,920q0,17 -11.5,28.5T320,960ZM480,960q-17,0 -28.5,-11.5T440,920q0,-17 11.5,-28.5T480,880q17,0 28.5,11.5T520,920q0,17 -11.5,28.5T480,960ZM640,960q-17,0 -28.5,-11.5T600,920q0,-17 11.5,-28.5T640,880q17,0 28.5,11.5T680,920q0,17 -11.5,28.5T640,960ZM320,800q-33,0 -56.5,-23.5T240,720v-640q0,-33 23.5,-56.5T320,0h320q33,0 56.5,23.5T720,80v640q0,33 -23.5,56.5T640,800L320,800ZM320,720h320v-40L320,680v40ZM320,600h320v-400L320,200v400ZM320,120h320v-40L320,80v40ZM320,120v-40,40ZM320,720v-40,40Z"/>
 | 
			
		||||
</vector>
 | 
			
		||||
@@ -10,41 +10,59 @@
 | 
			
		||||
    android:focusable="true"
 | 
			
		||||
    android:gravity="center_vertical"
 | 
			
		||||
    android:minHeight="72dp"
 | 
			
		||||
    android:padding="@dimen/spacing_large">
 | 
			
		||||
    android:padding="16dp">
 | 
			
		||||
 | 
			
		||||
    <LinearLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:orientation="vertical">
 | 
			
		||||
        android:orientation="horizontal">
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
            android:id="@+id/text_setting_name"
 | 
			
		||||
            style="@style/TextAppearance.Material3.HeadlineMedium"
 | 
			
		||||
        <ImageView
 | 
			
		||||
            android:id="@+id/icon"
 | 
			
		||||
            android:layout_width="24dp"
 | 
			
		||||
            android:layout_height="24dp"
 | 
			
		||||
            android:layout_marginStart="8dp"
 | 
			
		||||
            android:layout_marginEnd="24dp"
 | 
			
		||||
            android:layout_gravity="center_vertical"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:tint="?attr/colorOnSurface" />
 | 
			
		||||
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            android:textSize="16sp"
 | 
			
		||||
            app:lineHeight="22dp"
 | 
			
		||||
            tools:text="Setting Name" />
 | 
			
		||||
            android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
            android:id="@+id/text_setting_description"
 | 
			
		||||
            style="@style/TextAppearance.Material3.BodySmall"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginTop="@dimen/spacing_small"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            tools:text="@string/app_disclaimer" />
 | 
			
		||||
            <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
                android:id="@+id/text_setting_name"
 | 
			
		||||
                style="@style/TextAppearance.Material3.HeadlineMedium"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                android:textSize="17sp"
 | 
			
		||||
                app:lineHeight="22dp"
 | 
			
		||||
                tools:text="Setting Name" />
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
            android:id="@+id/text_setting_value"
 | 
			
		||||
            style="@style/TextAppearance.Material3.LabelMedium"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginTop="@dimen/spacing_small"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            android:textStyle="bold"
 | 
			
		||||
            tools:text="1x" />
 | 
			
		||||
            <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
                android:id="@+id/text_setting_description"
 | 
			
		||||
                style="@style/TextAppearance.Material3.BodySmall"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="@dimen/spacing_small"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                tools:text="@string/app_disclaimer" />
 | 
			
		||||
 | 
			
		||||
            <com.google.android.material.textview.MaterialTextView
 | 
			
		||||
                android:id="@+id/text_setting_value"
 | 
			
		||||
                style="@style/TextAppearance.Material3.LabelMedium"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_marginTop="@dimen/spacing_small"
 | 
			
		||||
                android:textAlignment="viewStart"
 | 
			
		||||
                android:textStyle="bold"
 | 
			
		||||
                android:textSize="13sp"
 | 
			
		||||
                tools:text="1x" />
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,9 +8,7 @@
 | 
			
		||||
    android:clickable="true"
 | 
			
		||||
    android:focusable="true"
 | 
			
		||||
    android:minHeight="72dp"
 | 
			
		||||
    android:paddingVertical="@dimen/spacing_large"
 | 
			
		||||
    android:paddingStart="@dimen/spacing_large"
 | 
			
		||||
    android:paddingEnd="24dp">
 | 
			
		||||
    android:padding="16dp">
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.materialswitch.MaterialSwitch
 | 
			
		||||
        android:id="@+id/switch_widget"
 | 
			
		||||
@@ -24,7 +22,7 @@
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:layout_centerVertical="true"
 | 
			
		||||
        android:layout_marginEnd="@dimen/spacing_large"
 | 
			
		||||
        android:layout_marginEnd="24dp"
 | 
			
		||||
        android:layout_toStartOf="@+id/switch_widget"
 | 
			
		||||
        android:gravity="center_vertical"
 | 
			
		||||
        android:orientation="vertical">
 | 
			
		||||
@@ -35,7 +33,7 @@
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            android:textSize="16sp"
 | 
			
		||||
            android:textSize="17sp"
 | 
			
		||||
            app:lineHeight="28dp"
 | 
			
		||||
            tools:text="@string/frame_limit_enable" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_gravity="start|center_vertical"
 | 
			
		||||
    android:paddingHorizontal="@dimen/spacing_large"
 | 
			
		||||
    android:paddingVertical="16dp"
 | 
			
		||||
    android:paddingTop="16dp"
 | 
			
		||||
    android:paddingBottom="8dp"
 | 
			
		||||
    android:textAlignment="viewStart"
 | 
			
		||||
    android:textColor="?attr/colorPrimary"
 | 
			
		||||
    android:textStyle="bold"
 | 
			
		||||
 
 | 
			
		||||
@@ -240,6 +240,7 @@
 | 
			
		||||
    <string name="shutting_down">Shutting down…</string>
 | 
			
		||||
    <string name="reset_setting_confirmation">Do you want to reset this setting back to its default value?</string>
 | 
			
		||||
    <string name="reset_to_default">Reset to default</string>
 | 
			
		||||
    <string name="reset_to_default_description">Resets all advanced settings</string>
 | 
			
		||||
    <string name="reset_all_settings">Reset all settings?</string>
 | 
			
		||||
    <string name="reset_all_settings_description">All advanced settings will be reset to their default configuration. This can not be undone.</string>
 | 
			
		||||
    <string name="settings_reset">Settings reset</string>
 | 
			
		||||
@@ -271,10 +272,14 @@
 | 
			
		||||
    <string name="preferences_settings">Settings</string>
 | 
			
		||||
    <string name="preferences_general">General</string>
 | 
			
		||||
    <string name="preferences_system">System</string>
 | 
			
		||||
    <string name="preferences_system_description">Docked mode, region, language</string>
 | 
			
		||||
    <string name="preferences_graphics">Graphics</string>
 | 
			
		||||
    <string name="preferences_graphics_description">Accuracy level, resolution, shader cache</string>
 | 
			
		||||
    <string name="preferences_audio">Audio</string>
 | 
			
		||||
    <string name="preferences_audio_description">Output engine, volume</string>
 | 
			
		||||
    <string name="preferences_theme">Theme and color</string>
 | 
			
		||||
    <string name="preferences_debug">Debug</string>
 | 
			
		||||
    <string name="preferences_debug_description">CPU/GPU debugging, graphics API, fastmem</string>
 | 
			
		||||
 | 
			
		||||
    <!-- ROM loading errors -->
 | 
			
		||||
    <string name="loader_error_encrypted">Your ROM is encrypted</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user