diff --git a/docs/Caveats.md b/docs/Caveats.md index 39b5ab15e6..d554f3ff77 100644 --- a/docs/Caveats.md +++ b/docs/Caveats.md @@ -91,7 +91,7 @@ After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg- `-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up. -If clang has errors, try using `g++-11`. +If clang has errors, try using `g++11`. ## FreeBSD @@ -107,6 +107,8 @@ hw.usb.usbhid.enable="0" ## NetBSD +2026-02-07: `vulkan-headers` must not be installed, since the version found in `pkgsrc` is older than required. Either wait for binary packages to update or build newer versions from source. + Install `pkgin` if not already `pkg_add pkgin`, see also the general [pkgsrc guide](https://www.netbsd.org/docs/pkgsrc/using.html). For NetBSD 10.1 provide `echo 'PKG_PATH="https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/10.1/All/"' >/etc/pkg_install.conf`. If `pkgin` is taking too much time consider adding the following to `/etc/rc.conf`: ```sh @@ -116,7 +118,7 @@ ip6addrctl_policy=ipv4_prefer System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Or install `gcc14` (or `gcc15` with current pkgsrc). Provided that, the following CMake commands may work: -- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild` +- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild` (Recommended) - `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc14/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc14/bin/g++ -Bbuild` - `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc15/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc15/bin/g++ -Bbuild` @@ -138,8 +140,12 @@ cmake --install build However, pkgsrc is highly recommended, see [getting pkgsrc](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/pkgsrc.html#getting). You must get `current` not the `2025Q2` version. +`QtCore` on NetBSD is included, but due to misconfigurations(!) we MUST include one of the standard headers that include `bits/c++config.h`, since source_location (required by `QtCore`) isn't properly configured to intake `bits/c++config.h` (none of the experimental library is). This is a bug with NetBSD packaging and not our fault, but alas. + ## DragonFlyBSD +2026-02-07: `vulkan-headers` and `vulkan-utility-libraries` must NOT be uninstalled, since they're too old: `1.3.289`. Either wait for binary packages to update or build newer versions from source. + If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt: ```sh 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"> + + + + + + -