diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
index a8ec82e560..5566423af6 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
@@ -10,6 +10,8 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.res.ResourcesCompat
import androidx.lifecycle.LifecycleOwner
+import com.google.android.material.button.MaterialButton
+import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.CardInstallableIconBinding
import org.yuzu.yuzu_emu.databinding.CardSimpleOutlinedBinding
import org.yuzu.yuzu_emu.model.GameProperty
@@ -89,29 +91,33 @@ class GamePropertiesAdapter(
val hasVisibleActions = submenuProperty.secondaryActions?.any { it.isShown } == true
+ binding.layoutSecondaryActions.removeAllViews()
+ binding.dividerSecondaryActions.setVisible(false)
if (hasVisibleActions) {
- binding.dividerSecondaryActions.setVisible(true)
binding.layoutSecondaryActions.setVisible(true)
- submenuProperty.secondaryActions!!.forEach { secondaryAction ->
- if (secondaryAction.isShown) {
- val button = com.google.android.material.button.MaterialButton(
- binding.root.context,
- null,
- com.google.android.material.R.attr.materialButtonOutlinedStyle
- ).apply {
- setIconResource(secondaryAction.iconId)
- iconSize = (18 * binding.root.context.resources.displayMetrics.density).toInt()
- text = binding.root.context.getString(secondaryAction.descriptionId)
- contentDescription = binding.root.context.getString(secondaryAction.descriptionId)
- setOnClickListener { secondaryAction.action.invoke() }
- }
- binding.layoutSecondaryActions.addView(button)
+ val visibleActions = submenuProperty.secondaryActions!!.filter { it.isShown }
+ val inflater = LayoutInflater.from(binding.root.context)
+ visibleActions.forEachIndexed { index, secondaryAction ->
+ val button = inflater.inflate(
+ R.layout.item_secondary_action_button,
+ binding.layoutSecondaryActions,
+ false
+ ) as MaterialButton
+ button.setIconResource(secondaryAction.iconId)
+ button.text = ""
+ button.contentDescription = binding.root.context
+ .getString(secondaryAction.descriptionId)
+ button.tooltipText = binding.root.context
+ .getString(secondaryAction.descriptionId)
+ if (index == visibleActions.lastIndex) {
+ (button.layoutParams as ViewGroup.MarginLayoutParams).marginEnd = 0
}
+ button.setOnClickListener { secondaryAction.action.invoke() }
+ binding.layoutSecondaryActions.addView(button)
}
} else {
- binding.dividerSecondaryActions.setVisible(false)
binding.layoutSecondaryActions.setVisible(false)
}
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt
index 57fd551e02..6d5c6ef23f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/LobbyBrowser.kt
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.dialogs
@@ -14,6 +14,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
+import android.widget.FrameLayout
import androidx.core.content.getSystemService
import androidx.core.widget.doOnTextChanged
import androidx.recyclerview.widget.DividerItemDecoration
@@ -58,6 +59,30 @@ class LobbyBrowser(context: Context) : BottomSheetDialog(context) {
setupSearchBar()
}
+ override fun onStart() {
+ super.onStart()
+
+ window?.setLayout(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+
+ val bottomSheet =
+ findViewById(com.google.android.material.R.id.design_bottom_sheet)
+ if (bottomSheet != null) {
+ bottomSheet.layoutParams = bottomSheet.layoutParams.apply {
+ width = ViewGroup.LayoutParams.MATCH_PARENT
+ height = ViewGroup.LayoutParams.MATCH_PARENT
+ }
+ bottomSheet.requestLayout()
+ }
+
+ behavior.isFitToContents = false
+ behavior.expandedOffset = 0
+ behavior.skipCollapsed = true
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
+ }
+
private fun setupRecyclerView() {
adapter = LobbyRoomAdapter { room -> handleRoomSelection(room) }
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 37a331b385..0f89533d8e 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
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.features.settings.model
@@ -27,7 +27,7 @@ object Settings {
SECTION_APP_SETTINGS(R.string.app_settings),
SECTION_CUSTOM_PATHS(R.string.preferences_custom_paths),
SECTION_DEBUG(R.string.preferences_debug),
- SECTION_FREEDRENO(R.string.gpu_driver_settings),
+ SECTION_FREEDRENO(R.string.freedreno_settings_title),
SECTION_APPLETS(R.string.applets_menu);
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
index dd932fcafb..11be703536 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
@@ -111,10 +111,18 @@ class SettingsActivity : AppCompatActivity() {
if (navHostFragment.childFragmentManager.backStackEntryCount > 0) {
navHostFragment.navController.popBackStack()
} else {
- finish()
+ finishWithFragmentLikeAnimation()
}
}
+ private fun finishWithFragmentLikeAnimation() {
+ finish()
+ overridePendingTransition(
+ androidx.navigation.ui.R.anim.nav_default_pop_enter_anim,
+ androidx.navigation.ui.R.anim.nav_default_pop_exit_anim
+ )
+ }
+
override fun onStart() {
super.onStart()
if (!DirectoryInitialization.areDirectoriesReady) {
@@ -170,7 +178,7 @@ class SettingsActivity : AppCompatActivity() {
getString(R.string.settings_reset),
Toast.LENGTH_LONG
).show()
- finish()
+ finishWithFragmentLikeAnimation()
}
private fun setInsets() {
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
index 2f527b5f62..667141725d 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
@@ -98,23 +98,8 @@ class SettingsFragment : Fragment() {
activity
)
- binding.toolbarSettingsLayout.title = if (args.menuTag == Settings.MenuTag.SECTION_ROOT &&
- args.game != null
- ) {
- args.game!!.title
- } else {
- when (args.menuTag) {
- Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> Settings.getPlayerString(1)
- Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> Settings.getPlayerString(2)
- Settings.MenuTag.SECTION_INPUT_PLAYER_THREE -> Settings.getPlayerString(3)
- Settings.MenuTag.SECTION_INPUT_PLAYER_FOUR -> Settings.getPlayerString(4)
- Settings.MenuTag.SECTION_INPUT_PLAYER_FIVE -> Settings.getPlayerString(5)
- Settings.MenuTag.SECTION_INPUT_PLAYER_SIX -> Settings.getPlayerString(6)
- Settings.MenuTag.SECTION_INPUT_PLAYER_SEVEN -> Settings.getPlayerString(7)
- Settings.MenuTag.SECTION_INPUT_PLAYER_EIGHT -> Settings.getPlayerString(8)
- else -> getString(args.menuTag.titleId)
- }
- }
+ val toolbarTitle = resolveToolbarTitle()
+ configureToolbar(toolbarTitle)
binding.listSettings.apply {
adapter = settingsAdapter
@@ -193,11 +178,9 @@ class SettingsFragment : Fragment() {
}
presenter.onViewCreated()
-
setInsets()
}
-
- private fun getPlayerIndex(): Int =
+private fun getPlayerIndex(): Int =
when (args.menuTag) {
Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> 0
Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> 1
@@ -210,6 +193,27 @@ class SettingsFragment : Fragment() {
else -> -1
}
+ private fun resolveToolbarTitle(): String {
+ if (args.menuTag == Settings.MenuTag.SECTION_ROOT && args.game != null) {
+ return args.game!!.title
+ }
+ return when (args.menuTag) {
+ Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> Settings.getPlayerString(1)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> Settings.getPlayerString(2)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_THREE -> Settings.getPlayerString(3)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_FOUR -> Settings.getPlayerString(4)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_FIVE -> Settings.getPlayerString(5)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_SIX -> Settings.getPlayerString(6)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_SEVEN -> Settings.getPlayerString(7)
+ Settings.MenuTag.SECTION_INPUT_PLAYER_EIGHT -> Settings.getPlayerString(8)
+ else -> getString(args.menuTag.titleId)
+ }
+ }
+
+ private fun configureToolbar(title: String) {
+ binding.toolbarSettings.title = title
+ }
+
private fun setInsets() {
ViewCompat.setOnApplyWindowInsetsListener(
binding.root
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 77104e0614..ff25584c92 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
@@ -6,7 +6,6 @@ package org.yuzu.yuzu_emu.features.settings.ui
import android.annotation.SuppressLint
import android.os.Build
import android.widget.Toast
-import androidx.preference.PreferenceManager
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
@@ -27,11 +26,9 @@ import org.yuzu.yuzu_emu.features.settings.model.Settings.MenuTag
import org.yuzu.yuzu_emu.features.settings.model.ShortSetting
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
import org.yuzu.yuzu_emu.features.settings.model.view.*
-import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.InputHandler
import org.yuzu.yuzu_emu.utils.NativeConfig
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
-import androidx.core.content.edit
import androidx.fragment.app.FragmentActivity
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
@@ -183,16 +180,6 @@ class SettingsFragmentPresenter(
menuKey = MenuTag.SECTION_DEBUG
)
)
- if (GpuDriverHelper.isAdrenoGpu() && !NativeConfig.isPerGameConfigLoaded()) {
- add(
- SubmenuSetting(
- titleId = R.string.gpu_driver_settings,
- descriptionId = R.string.freedreno_settings_title,
- iconId = R.drawable.ic_graphics,
- menuKey = MenuTag.SECTION_FREEDRENO
- )
- )
- }
add(
SubmenuSetting(
titleId = R.string.applets_menu,
@@ -1084,27 +1071,6 @@ class SettingsFragmentPresenter(
add(HeaderSetting(R.string.theme_and_color))
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
- add(
- SingleChoiceSetting(
- theme,
- titleId = R.string.change_app_theme,
- choicesId = R.array.themeEntriesA12,
- valuesId = R.array.themeValuesA12
- )
- )
- } else {
- add(
- SingleChoiceSetting(
- theme,
- titleId = R.string.change_app_theme,
- choicesId = R.array.themeEntries,
- valuesId = R.array.themeValues
- )
- )
- }
-
val themeMode: AbstractIntSetting = object : AbstractIntSetting {
override fun getInt(needsGlobal: Boolean): Int = IntSetting.THEME_MODE.getInt()
override fun setInt(value: Int) {
@@ -1126,6 +1092,35 @@ class SettingsFragmentPresenter(
}
}
+ add(
+ SingleChoiceSetting(
+ themeMode,
+ titleId = R.string.change_theme_mode,
+ choicesId = R.array.themeModeEntries,
+ valuesId = R.array.themeModeValues
+ )
+ )
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ add(
+ SingleChoiceSetting(
+ theme,
+ titleId = R.string.change_app_theme,
+ choicesId = R.array.themeEntriesA12,
+ valuesId = R.array.themeValuesA12
+ )
+ )
+ } else {
+ add(
+ SingleChoiceSetting(
+ theme,
+ titleId = R.string.change_app_theme,
+ choicesId = R.array.themeEntries,
+ valuesId = R.array.themeValues
+ )
+ )
+ }
+
val staticThemeColor: AbstractIntSetting = object : AbstractIntSetting {
override fun getInt(needsGlobal: Boolean): Int =
IntSetting.STATIC_THEME_COLOR.getInt(needsGlobal)
@@ -1149,15 +1144,6 @@ class SettingsFragmentPresenter(
}
}
- add(
- SingleChoiceSetting(
- themeMode,
- titleId = R.string.change_theme_mode,
- choicesId = R.array.themeModeEntries,
- valuesId = R.array.themeModeValues
- )
- )
-
if (IntSetting.THEME.getInt() != 1) {
add(
SingleChoiceSetting(
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
index 9745970c5b..7fec413b66 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
@@ -1,7 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.fragments
@@ -54,8 +51,8 @@ class AboutFragment : Fragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
homeViewModel.setStatusBarShadeVisibility(visible = false)
-
binding.toolbarAbout.setNavigationOnClickListener {
binding.root.findNavController().popBackStack()
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt
index 525fbd9f91..e2b652dc60 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt
@@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentDriverFetcherBinding
import org.yuzu.yuzu_emu.features.fetcher.DriverGroupAdapter
import org.yuzu.yuzu_emu.model.DriverViewModel
+import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import java.io.IOException
@@ -87,6 +88,7 @@ class DriverFetcherFragment : Fragment() {
private lateinit var driverGroupAdapter: DriverGroupAdapter
private val driverViewModel: DriverViewModel by activityViewModels()
+ private val homeViewModel: HomeViewModel by activityViewModels()
private fun parseAdrenoModel(): Int {
if (gpuModel == null) {
@@ -138,7 +140,7 @@ class DriverFetcherFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
+ homeViewModel.setStatusBarShadeVisibility(visible = false)
binding.toolbarDrivers.setNavigationOnClickListener {
binding.root.findNavController().popBackStack()
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt
index 40111272d5..2eb77690ca 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt
@@ -22,6 +22,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentFreedrenoSettingsBinding
import org.yuzu.yuzu_emu.model.Game
import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig
import org.yuzu.yuzu_emu.utils.FreedrenoPresets
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class FreedrenoSettingsFragment : Fragment() {
@@ -74,10 +75,15 @@ class FreedrenoSettingsFragment : Fragment() {
binding.toolbarFreedreno.setNavigationOnClickListener {
requireActivity().onBackPressedDispatcher.onBackPressed()
}
- if (isPerGameConfig) {
- binding.toolbarFreedreno.title = getString(R.string.freedreno_per_game_title)
- binding.toolbarFreedreno.subtitle = game!!.title
- }
+
+ binding.toolbarFreedreno.title = getString(
+ if (isPerGameConfig) {
+ R.string.freedreno_per_game_title
+ } else {
+ R.string.freedreno_settings_title
+ }
+ )
+ binding.toolbarFreedreno.subtitle = null
}
private fun setupAdapters() {
@@ -175,17 +181,19 @@ class FreedrenoSettingsFragment : Fragment() {
private fun setupWindowInsets() {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
- val systemInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- binding.root.updatePadding(
- left = systemInsets.left,
- right = systemInsets.right,
- bottom = systemInsets.bottom
- )
+ val barInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ val cutoutInsets = insets.getInsets(WindowInsetsCompat.Type.displayCutout())
+
+ val leftInsets = barInsets.left + cutoutInsets.left
+ val rightInsets = barInsets.right + cutoutInsets.right
+
+ binding.appbarFreedreno.updateMargins(left = leftInsets, right = rightInsets)
+ binding.scrollFreedreno.updateMargins(left = leftInsets, right = rightInsets)
+ binding.scrollFreedreno.updatePadding(bottom = barInsets.bottom)
insets
}
}
-
- private fun showSnackbar(message: String) {
+private fun showSnackbar(message: String) {
Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
index 97b0470feb..9e55297846 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.fragments
@@ -310,6 +310,21 @@ class GamePropertiesFragment : Fragment() {
)
)
+ if (!args.game.isHomebrew) {
+ add(
+ SubmenuProperty(
+ R.string.add_ons,
+ R.string.add_ons_description,
+ R.drawable.ic_edit,
+ action = {
+ val action = GamePropertiesFragmentDirections
+ .actionPerGamePropertiesFragmentToAddonsFragment(args.game)
+ binding.root.findNavController().navigate(action)
+ }
+ )
+ )
+ }
+
if (GpuDriverHelper.supportsCustomDriverLoading()) {
add(
SubmenuProperty(
@@ -341,18 +356,6 @@ class GamePropertiesFragment : Fragment() {
}
if (!args.game.isHomebrew) {
- add(
- SubmenuProperty(
- R.string.add_ons,
- R.string.add_ons_description,
- R.drawable.ic_edit,
- action = {
- val action = GamePropertiesFragmentDirections
- .actionPerGamePropertiesFragmentToAddonsFragment(args.game)
- binding.root.findNavController().navigate(action)
- }
- )
- )
add(
InstallableProperty(
R.string.save_data,
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
index 918478bf85..6f4bf858ea 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
@@ -1,9 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
package org.yuzu.yuzu_emu.fragments
import android.Manifest
@@ -44,7 +41,9 @@ import org.yuzu.yuzu_emu.model.HomeSetting
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.ui.main.MainActivity
import org.yuzu.yuzu_emu.utils.FileUtil
+import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.Log
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class HomeSettingsFragment : Fragment() {
private var _binding: FragmentHomeSettingsBinding? = null
@@ -71,8 +70,12 @@ class HomeSettingsFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- homeViewModel.setStatusBarShadeVisibility(visible = true)
+ homeViewModel.setStatusBarShadeVisibility(visible = false)
mainActivity = requireActivity() as MainActivity
+ binding.toolbarHomeSettings.setNavigationOnClickListener {
+ findNavController().popBackStack()
+ }
+ binding.toolbarHomeSettings.title = getString(R.string.preferences_settings)
val optionsList: MutableList = mutableListOf().apply {
add(
@@ -144,6 +147,18 @@ class HomeSettingsFragment : Fragment() {
driverViewModel.selectedDriverTitle
)
)
+ if (GpuDriverHelper.isAdrenoGpu()) {
+ add(
+ HomeSetting(
+ R.string.freedreno_settings_title,
+ R.string.gpu_driver_settings,
+ R.drawable.ic_graphics,
+ {
+ binding.root.findNavController().navigate(R.id.freedrenoSettingsFragment)
+ }
+ )
+ )
+ }
add(
HomeSetting(
R.string.multiplayer,
@@ -465,19 +480,22 @@ class HomeSettingsFragment : Fragment() {
}
private fun setInsets() =
- ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets ->
+ ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
+ binding.appbarHomeSettings.updateMargins(
+ left = barInsets.left + cutoutInsets.left,
+ right = barInsets.right + cutoutInsets.right
+ )
+
binding.scrollViewSettings.updatePadding(
- top = barInsets.top
+ bottom = barInsets.bottom
)
binding.homeSettingsList.updatePadding(
left = barInsets.left + cutoutInsets.left,
- top = cutoutInsets.top,
- right = barInsets.right + cutoutInsets.right,
- bottom = barInsets.bottom
+ right = barInsets.right + cutoutInsets.right
)
windowInsets
diff --git a/src/android/app/src/main/res/drawable/item_release_box.xml b/src/android/app/src/main/res/drawable/item_release_box.xml
index 2f2ada1961..0e692713a8 100644
--- a/src/android/app/src/main/res/drawable/item_release_box.xml
+++ b/src/android/app/src/main/res/drawable/item_release_box.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/src/android/app/src/main/res/layout-land/dialog_lobby_browser.xml b/src/android/app/src/main/res/layout-land/dialog_lobby_browser.xml
new file mode 100644
index 0000000000..88d06d4873
--- /dev/null
+++ b/src/android/app/src/main/res/layout-land/dialog_lobby_browser.xml
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/android/app/src/main/res/layout-land/dialog_multiplayer_connect.xml b/src/android/app/src/main/res/layout-land/dialog_multiplayer_connect.xml
new file mode 100644
index 0000000000..7a9064f9b9
--- /dev/null
+++ b/src/android/app/src/main/res/layout-land/dialog_multiplayer_connect.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/android/app/src/main/res/layout-land/fragment_games.xml b/src/android/app/src/main/res/layout-land/fragment_games.xml
index da778eab69..4d492c6c4b 100644
--- a/src/android/app/src/main/res/layout-land/fragment_games.xml
+++ b/src/android/app/src/main/res/layout-land/fragment_games.xml
@@ -44,7 +44,12 @@
style="@style/EdenCard"
android:layout_width="match_parent"
android:layout_height="48dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="24dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="4dp"
>
@@ -103,7 +108,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
@@ -127,7 +137,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
@@ -151,7 +166,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
diff --git a/src/android/app/src/main/res/layout-w1000dp/card_installable_icon.xml b/src/android/app/src/main/res/layout-w1000dp/card_installable_icon.xml
index 59ee1aad30..6fe4256c49 100644
--- a/src/android/app/src/main/res/layout-w1000dp/card_installable_icon.xml
+++ b/src/android/app/src/main/res/layout-w1000dp/card_installable_icon.xml
@@ -12,70 +12,83 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:orientation="horizontal"
- android:gravity="center_vertical"
+ android:orientation="vertical"
android:paddingHorizontal="24dp"
android:paddingVertical="16dp">
-
-
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
-
+
-
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+
+
+
+
+
-
+ android:layout_marginTop="10dp"
+ android:gravity="end|center_vertical"
+ android:orientation="horizontal">
-
+
+
+
+
+
diff --git a/src/android/app/src/main/res/layout-w600dp/fragment_about.xml b/src/android/app/src/main/res/layout-w600dp/fragment_about.xml
index 4e3c738be5..ae2b3e3637 100644
--- a/src/android/app/src/main/res/layout-w600dp/fragment_about.xml
+++ b/src/android/app/src/main/res/layout-w600dp/fragment_about.xml
@@ -5,6 +5,7 @@
android:id="@+id/coordinator_about"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:background="?attr/colorSurface"
>
+ android:focusable="true"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
+ android:layout_marginVertical="12dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardCornerRadius="16dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
+ android:paddingTop="4dp"
+ android:paddingLeft="4dp"
+ android:paddingRight="4dp"
+ android:paddingBottom="2dp">
+ android:paddingTop="3dp"
+ android:paddingLeft="4dp"
+ android:paddingRight="4dp"
+ android:paddingBottom="3dp">
+ app:cardCornerRadius="16dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
+ android:layout_marginVertical="12dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardCornerRadius="16dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
-
+ android:gravity="center_horizontal"
+ android:orientation="vertical">
-
+
+
+
+
+
diff --git a/src/android/app/src/main/res/layout/card_installable_icon.xml b/src/android/app/src/main/res/layout/card_installable_icon.xml
index 4ae5423b10..6313b7fbaf 100644
--- a/src/android/app/src/main/res/layout/card_installable_icon.xml
+++ b/src/android/app/src/main/res/layout/card_installable_icon.xml
@@ -6,63 +6,75 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
- android:layout_marginVertical="12dp">
+ android:layout_marginVertical="12dp"
+ android:background="@android:color/transparent"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
-
-
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
-
+
-
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+
+
+
+
+
+ android:layout_marginTop="10dp"
+ android:gravity="end|center_vertical"
+ android:orientation="horizontal">
diff --git a/src/android/app/src/main/res/layout/dialog_lobby_browser.xml b/src/android/app/src/main/res/layout/dialog_lobby_browser.xml
index 7ecbb17340..724fe266ea 100644
--- a/src/android/app/src/main/res/layout/dialog_lobby_browser.xml
+++ b/src/android/app/src/main/res/layout/dialog_lobby_browser.xml
@@ -8,16 +8,14 @@
+ android:layout_height="wrap_content">
+ android:orientation="vertical">
+ app:iconPadding="12dp"
+ app:iconTint="?attr/colorOnPrimary"
+ android:textColor="?attr/colorOnPrimary" />
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardCornerRadius="16dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardCornerRadius="16dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardCornerRadius="16dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp">
diff --git a/src/android/app/src/main/res/layout/fragment_addons.xml b/src/android/app/src/main/res/layout/fragment_addons.xml
index b029b4209f..1a206d58a6 100644
--- a/src/android/app/src/main/res/layout/fragment_addons.xml
+++ b/src/android/app/src/main/res/layout/fragment_addons.xml
@@ -8,6 +8,7 @@
-
+ android:touchscreenBlocksFocus="false">
+ android:touchscreenBlocksFocus="false">
+ android:touchscreenBlocksFocus="false">
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ android:touchscreenBlocksFocus="false"
+ app:navigationIcon="@drawable/ic_back" />
@@ -63,8 +52,12 @@
android:id="@+id/list_freedreno_presets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="6dp"
+ android:clipToPadding="false"
android:orientation="horizontal"
+ android:paddingBottom="8dp"
android:scrollbars="horizontal"
+ android:scrollbarStyle="outsideInset"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
@@ -135,22 +128,23 @@
+ android:orientation="horizontal">
+ style="?attr/materialButtonOutlinedStyle"
+ android:text="@string/freedreno_clear_all" />
@@ -161,6 +155,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
+ app:cardBackgroundColor="@android:color/transparent"
app:cardElevation="0dp"
app:strokeWidth="1dp"
app:strokeColor="?attr/colorOutline">
diff --git a/src/android/app/src/main/res/layout/fragment_game_properties.xml b/src/android/app/src/main/res/layout/fragment_game_properties.xml
index 9a3437404f..d2b5fc6793 100644
--- a/src/android/app/src/main/res/layout/fragment_game_properties.xml
+++ b/src/android/app/src/main/res/layout/fragment_game_properties.xml
@@ -33,9 +33,12 @@
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:backgroundTint="@android:color/transparent"
app:icon="@drawable/ic_back"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -44,9 +47,12 @@
style="?attr/materialIconButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:backgroundTint="@android:color/transparent"
app:icon="@drawable/ic_shortcut"
app:iconSize="24dp"
app:iconTint="?attr/colorOnSurface"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/src/android/app/src/main/res/layout/fragment_games.xml b/src/android/app/src/main/res/layout/fragment_games.xml
index 921625e42b..e316b3d59f 100644
--- a/src/android/app/src/main/res/layout/fragment_games.xml
+++ b/src/android/app/src/main/res/layout/fragment_games.xml
@@ -37,7 +37,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
@@ -61,7 +66,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
@@ -85,7 +95,12 @@
style="@style/EdenCard"
android:layout_width="42dp"
android:layout_height="42dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="21dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="8dp"
>
@@ -117,7 +132,12 @@
style="@style/EdenCard"
android:layout_width="match_parent"
android:layout_height="48dp"
+ android:background="@android:color/transparent"
app:cardCornerRadius="24dp"
+ app:cardBackgroundColor="@android:color/transparent"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:padding="4dp"
>
diff --git a/src/android/app/src/main/res/layout/fragment_home_settings.xml b/src/android/app/src/main/res/layout/fragment_home_settings.xml
index 5e1cf52d78..a52ae09477 100644
--- a/src/android/app/src/main/res/layout/fragment_home_settings.xml
+++ b/src/android/app/src/main/res/layout/fragment_home_settings.xml
@@ -1,38 +1,64 @@
-
+ android:background="?attr/colorSurface">
-
+ android:fitsSystemWindows="true"
+ android:touchscreenBlocksFocus="false"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
-
+
-
+
+
+
+
+ android:orientation="vertical"
+ android:paddingHorizontal="16dp"
+ android:paddingTop="16dp">
-
+
-
+
+
+
+
+
diff --git a/src/android/app/src/main/res/layout/fragment_installables.xml b/src/android/app/src/main/res/layout/fragment_installables.xml
index 47ef3869f2..9b728dd5c7 100644
--- a/src/android/app/src/main/res/layout/fragment_installables.xml
+++ b/src/android/app/src/main/res/layout/fragment_installables.xml
@@ -8,6 +8,7 @@
+ android:touchscreenBlocksFocus="false">
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ android:touchscreenBlocksFocus="false"
+ app:navigationIcon="@drawable/ic_back" />
diff --git a/src/android/app/src/main/res/layout/item_secondary_action_button.xml b/src/android/app/src/main/res/layout/item_secondary_action_button.xml
new file mode 100644
index 0000000000..efc4530940
--- /dev/null
+++ b/src/android/app/src/main/res/layout/item_secondary_action_button.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/src/android/app/src/main/res/layout/list_item_addon.xml b/src/android/app/src/main/res/layout/list_item_addon.xml
index 861d98d989..4d654581ff 100644
--- a/src/android/app/src/main/res/layout/list_item_addon.xml
+++ b/src/android/app/src/main/res/layout/list_item_addon.xml
@@ -11,8 +11,11 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
+ app:cardBackgroundColor="@android:color/transparent"
app:cardCornerRadius="12dp"
- app:cardElevation="2dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"
@@ -78,8 +81,11 @@
android:layout_width="48dp"
android:layout_height="0dp"
android:layout_marginEnd="8dp"
+ app:cardBackgroundColor="@android:color/transparent"
app:cardCornerRadius="10dp"
- app:cardElevation="2dp"
+ app:cardElevation="0dp"
+ app:strokeColor="?attr/colorOutline"
+ app:strokeWidth="1dp"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackgroundBorderless"
@@ -100,7 +106,7 @@
android:layout_gravity="center"
android:background="@null"
android:src="@drawable/ic_delete"
- app:tint="@color/eden_border_gradient_end"
+ app:tint="?attr/colorPrimary"
android:contentDescription="@string/delete" />
diff --git a/src/android/app/src/main/res/navigation/emulation_navigation.xml b/src/android/app/src/main/res/navigation/emulation_navigation.xml
index 2adc60a47c..5e6a49501d 100644
--- a/src/android/app/src/main/res/navigation/emulation_navigation.xml
+++ b/src/android/app/src/main/res/navigation/emulation_navigation.xml
@@ -40,6 +40,10 @@
+ app:destination="@id/settingsActivity"
+ app:enterAnim="@anim/nav_default_enter_anim"
+ app:exitAnim="@anim/nav_default_exit_anim"
+ app:popEnterAnim="@anim/nav_default_pop_enter_anim"
+ app:popExitAnim="@anim/nav_default_pop_exit_anim" />
diff --git a/src/android/app/src/main/res/navigation/home_navigation.xml b/src/android/app/src/main/res/navigation/home_navigation.xml
index 873438e7ae..7d04a19f36 100644
--- a/src/android/app/src/main/res/navigation/home_navigation.xml
+++ b/src/android/app/src/main/res/navigation/home_navigation.xml
@@ -101,7 +101,11 @@
+ app:destination="@id/settingsActivity"
+ app:enterAnim="@anim/nav_default_enter_anim"
+ app:exitAnim="@anim/nav_default_exit_anim"
+ app:popEnterAnim="@anim/nav_default_pop_enter_anim"
+ app:popExitAnim="@anim/nav_default_pop_exit_anim" />
@color/eden_primary
- @color/eden_glow_pink
+
+
+
+
+