diff --git a/.codespellrc b/.codespellrc index 59ef89bff..1874359d3 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,4 @@ -; SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +; SPDX-FileCopyrightText: 2023 yuzu Emulator Project ; SPDX-License-Identifier: GPL-2.0-or-later [codespell] diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index cad1bf375..109f2f45e 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # CRLF -> LF diff --git a/.gitattributes b/.gitattributes index a50932458..99172a7f3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later dist/languages/* linguist-vendored diff --git a/.gitignore b/.gitignore index eecf58eaf..fbadb208b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2013 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2013 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Build directory diff --git a/.gitmodules b/.gitmodules index 93a2b44d4..0d8210906 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2014 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later [submodule "enet"] diff --git a/.reuse/dep5 b/.reuse/dep5 index 0078d3aff..e6903c569 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -9,7 +9,7 @@ Files: dist/english_plurals/* dist/qt_themes/*/icons/48x48/sd_card.png dist/qt_themes/*/icons/index.theme dist/qt_themes/default/style.qss -Copyright: yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: yuzu Emulator Project License: GPL-2.0-or-later Files: dist/qt_themes/default/icons/256x256/citron.png @@ -17,7 +17,7 @@ Files: dist/qt_themes/default/icons/256x256/citron.png dist/citron.icns dist/citron.ico dist/citron.svg -Copyright: yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: yuzu Emulator Project License: GPL-2.0-or-later Files: dist/qt_themes/qdarkstyle*/LICENSE.* @@ -109,12 +109,12 @@ Copyright: 2021 Advanced Micro Devices, Inc. License: MIT Files: src/citron/*.ui -Copyright: 2018-2022 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2018-2022 yuzu Emulator Project License: GPL-2.0-or-later Files: src/citron/compatdb.ui src/citron/main.ui -Copyright: 2014-2017 Citra Emulator Project & 2025 Citron Homebrew Project +Copyright: 2014-2017 Citra Emulator Project License: GPL-2.0-or-later Files: src/citron/loading_screen.ui @@ -125,27 +125,27 @@ Files: src/citron/applets/aboutdialog.ui src/citron/applets/qt_software_keyboard.ui src/citron/util/overlay_dialog.ui Copyright: 2020-2021 Its-Rei - 2020-2021 yuzu Emulator Project & 2025 citron Homebrew Project + 2020-2021 yuzu Emulator Project License: GPL-2.0-or-later Files: vcpkg.json -Copyright: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2022 yuzu Emulator Project License: GPL-3.0-or-later Files: .github/ISSUE_TEMPLATE/* -Copyright: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2022 yuzu Emulator Project License: GPL-2.0-or-later Files: src/android/app/src/ea/res/* -Copyright: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2023 yuzu Emulator Project License: GPL-3.0-or-later Files: src/android/app/src/main/res/* -Copyright: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2023 yuzu Emulator Project License: GPL-3.0-or-later Files: src/android/gradle/wrapper/* -Copyright: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2023 yuzu Emulator Project License: GPL-3.0-or-later Files: externals/stb/* @@ -157,5 +157,5 @@ Copyright: Copyright 2017-2019 Feral Interactive License: BSD-3-Clause Files: src/android/app/debug.keystore -Copyright: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +Copyright: 2023 yuzu Emulator Project License: GPL-3.0-or-later diff --git a/CMakeLists.txt b/CMakeLists.txt index 380717cb8..9cde23779 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2025 Citron Homebrew Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later cmake_minimum_required(VERSION 3.22) @@ -12,11 +12,60 @@ include(DownloadExternals) include(CMakeDependentOption) include(CTest) +# Disable Warnings as Errors for MSVC +if (MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-") +endif() + +# PGO Configuration +option(CITRON_ENABLE_PGO_INSTRUMENT "Enable Profile-Guided Optimization instrumentation build" OFF) +option(CITRON_ENABLE_PGO_OPTIMIZE "Enable Profile-Guided Optimization optimization build" OFF) + +if(MSVC) + if(CITRON_ENABLE_PGO_INSTRUMENT) + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL /LTCG:PGINSTRUMENT") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /LTCG:PGINSTRUMENT") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /LTCG:PGINSTRUMENT") + elseif(CITRON_ENABLE_PGO_OPTIMIZE) + string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL /LTCG:PGOPTIMIZE") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /LTCG:PGOPTIMIZE") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /LTCG:PGOPTIMIZE") + endif() +else() + # GCC and Clang PGO flags + if(CITRON_ENABLE_PGO_INSTRUMENT) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-instr-generate") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-instr-generate") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-instr-generate") + else() # GCC + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-generate") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-generate") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-generate") + endif() + elseif(CITRON_ENABLE_PGO_OPTIMIZE) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-instr-use=default.profdata") + else() # GCC + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -fprofile-use") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -fprofile-use") + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -fprofile-use") + endif() + endif() +endif() + +# Check if SDL2::SDL2 target exists; if not, create an alias +if (TARGET SDL2::SDL2-static) + add_library(SDL2::SDL2 ALIAS SDL2::SDL2-static) +elseif (TARGET SDL2::SDL2-shared) + add_library(SDL2::SDL2 ALIAS SDL2::SDL2-shared) +endif() + # Set bundled sdl2/qt as dependent options. -# OFF by default, but if ENABLE_SDL2 and MSVC are true then ON option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) CMAKE_DEPENDENT_OPTION(CITRON_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) -# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion CMAKE_DEPENDENT_OPTION(CITRON_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) @@ -24,8 +73,6 @@ cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" option(ENABLE_OPENGL "Enable OpenGL" ON) mark_as_advanced(FORCE ENABLE_OPENGL) option(ENABLE_QT "Enable the Qt frontend" ON) -option(ENABLE_QT6 "Allow usage of Qt6 to be attempted" OFF) -set(QT6_LOCATION "" CACHE PATH "Additional Location to search for Qt6 libraries like C:/Qt/6.3.1/msvc2019_64/") option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) CMAKE_DEPENDENT_OPTION(CITRON_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) @@ -66,11 +113,18 @@ option(CITRON_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" OFF) option(CITRON_ENABLE_PORTABLE "Allow citron to enable portable mode if a user folder is found in the CWD" ON) +option(CITRON_USE_LLVM_DEMANGLE "Use LLVM Demangle" ON) + CMAKE_DEPENDENT_OPTION(CITRON_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF) set(DEFAULT_ENABLE_OPENSSL ON) +if (ANDROID OR WIN32 OR APPLE) + set(DEFAULT_ENABLE_OPENSSL OFF) +endif() +option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) + if (ANDROID OR WIN32 OR APPLE) # - Windows defaults to the Schannel backend. # - macOS defaults to the SecureTransport backend. @@ -83,21 +137,25 @@ endif() option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) if (ANDROID AND CITRON_DOWNLOAD_ANDROID_VVL) - set(vvl_version "sdk-1.3.261.1") + set(vvl_version "1.4.309.0") set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") - if (NOT EXISTS "${vvl_zip_file}") - # Download and extract validation layer release to externals directory - set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") - file(DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip" - "${vvl_zip_file}" SHOW_PROGRESS) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") - endif() - - # Copy the arm64 binary to src/android/app/main/jniLibs set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") - file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" - DESTINATION "${vvl_lib_path}") + set(vvl_final_lib "${vvl_lib_path}/libVkLayer_khronos_validation.so") + + if (NOT EXISTS "${vvl_final_lib}") + # Download and extract validation layer release to externals directory + if (NOT EXISTS "${vvl_zip_file}") + set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") + file(DOWNLOAD "${vvl_base_url}/vulkan-sdk-${vvl_version}/android-binaries-${vvl_version}.zip" + "${vvl_zip_file}" SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + endif() + + # Copy the arm64 binary to src/android/app/main/jniLibs + file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" + DESTINATION "${vvl_lib_path}") + endif() endif() if (ANDROID) @@ -111,22 +169,39 @@ if (CITRON_USE_BUNDLED_VCPKG) if (CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a") set(VCPKG_TARGET_TRIPLET "arm64-android") + # Detect host system (Windows or Linux) + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(VCPKG_HOST_TRIPLET "x64-windows") + else() + set(VCPKG_HOST_TRIPLET "x64-linux") + endif() # this is to avoid CMake using the host pkg-config to find the host # libraries when building for Android targets set(PKG_CONFIG_EXECUTABLE "aarch64-none-linux-android-pkg-config" CACHE FILEPATH "" FORCE) elseif (CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64") set(VCPKG_TARGET_TRIPLET "x64-android") + # Detect host system (Windows or Linux) + if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(VCPKG_HOST_TRIPLET "x64-windows") + else() + set(VCPKG_HOST_TRIPLET "x64-linux") + endif() set(PKG_CONFIG_EXECUTABLE "x86_64-none-linux-android-pkg-config" CACHE FILEPATH "" FORCE) else() message(FATAL_ERROR "Unsupported Android architecture ${CMAKE_ANDROID_ARCH_ABI}") endif() + + # Add these lines to ensure proper Android toolchain setup + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${ANDROID_NDK}/build/cmake/android.toolchain.cmake") + set(VCPKG_CRT_LINKAGE "dynamic") + set(VCPKG_LIBRARY_LINKAGE "static") endif() if (MSVC) set(VCPKG_DOWNLOADS_PATH ${PROJECT_SOURCE_DIR}/externals/vcpkg/downloads) - set(NASM_VERSION "2.16.01") + set(NASM_VERSION "2.16.03") set(NASM_DESTINATION_PATH ${VCPKG_DOWNLOADS_PATH}/nasm-${NASM_VERSION}-win64.zip) - set(NASM_DOWNLOAD_URL "https://github.com/yuzu-mirror/ext-windows-bin/raw/master/nasm/nasm-${NASM_VERSION}-win64.zip") + set(NASM_DOWNLOAD_URL "https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/win64/nasm-${NASM_VERSION}-win64.zip") if (NOT EXISTS ${NASM_DESTINATION_PATH}) file(DOWNLOAD ${NASM_DOWNLOAD_URL} ${NASM_DESTINATION_PATH} SHOW_PROGRESS STATUS NASM_STATUS) @@ -213,7 +288,7 @@ endif() if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) message(STATUS "Downloading compatibility list for citron...") file(DOWNLOAD - https://api.yuzu-mirror.org/gamedb/ + https://api.citron-emu.org/gamedb/ "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS) endif() if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) @@ -292,22 +367,24 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) # ======================================================================= # Enforce the search mode of non-required packages for better and shorter failure messages -find_package(Boost 1.79.0 REQUIRED context) -find_package(enet 1.3 MODULE) -find_package(fmt 9 REQUIRED) -find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle) +find_package(Boost REQUIRED context) +find_package(enet MODULE) +find_package(fmt 11 REQUIRED) +if (CITRON_USE_LLVM_DEMANGLE) + find_package(LLVM MODULE COMPONENTS Demangle) +endif() find_package(lz4 REQUIRED) -find_package(nlohmann_json 3.8 REQUIRED) -find_package(Opus 1.3 MODULE) +find_package(nlohmann_json REQUIRED) +find_package(Opus MODULE) find_package(RenderDoc MODULE) find_package(SimpleIni MODULE) find_package(stb MODULE) find_package(VulkanMemoryAllocator CONFIG) -find_package(ZLIB 1.2 REQUIRED) -find_package(zstd 1.5 REQUIRED) +find_package(ZLIB REQUIRED) +find_package(zstd REQUIRED) if (NOT CITRON_USE_EXTERNAL_VULKAN_HEADERS) - find_package(VulkanHeaders 1.3.274 REQUIRED) + find_package(VulkanHeaders 1.4.313 REQUIRED) endif() if (NOT CITRON_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) @@ -315,19 +392,19 @@ if (NOT CITRON_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) endif() if (ENABLE_LIBUSB) - find_package(libusb 1.0.24 MODULE) + find_package(libusb MODULE) endif() if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) - find_package(xbyak 6 CONFIG) + find_package(xbyak CONFIG) endif() if (ARCHITECTURE_arm64) - find_package(oaknut 2.0.1 CONFIG) + find_package(oaknut CONFIG) endif() if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) - find_package(dynarmic 6.4.0 CONFIG) + find_package(dynarmic CONFIG) endif() if (ENABLE_CUBEB) @@ -339,12 +416,12 @@ if (USE_DISCORD_PRESENCE) endif() if (ENABLE_WEB_SERVICE) - find_package(cpp-jwt 1.4 CONFIG) - find_package(httplib 0.12 MODULE COMPONENTS OpenSSL) + find_package(cpp-jwt CONFIG) + find_package(httplib MODULE COMPONENTS OpenSSL) endif() if (CITRON_TESTS) - find_package(Catch2 3.0.1 REQUIRED) + find_package(Catch2 REQUIRED) endif() # boost:asio has functions that require AcceptEx et al @@ -353,11 +430,11 @@ if (MINGW) endif() if(ENABLE_OPENSSL) - find_package(OpenSSL 1.1.1 REQUIRED) + find_package(OpenSSL REQUIRED) endif() if (UNIX AND NOT APPLE) - find_package(gamemode 1.7 MODULE) + find_package(gamemode MODULE) endif() # Please consider this as a stub @@ -365,171 +442,11 @@ if(ENABLE_QT6 AND Qt6_LOCATION) list(APPEND CMAKE_PREFIX_PATH "${Qt6_LOCATION}") endif() -function(set_citron_qt_components) - # Best practice is to ask for all components at once, so they are from the same version - set(CITRON_QT_COMPONENTS2 Core Widgets Concurrent) - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - list(APPEND CITRON_QT_COMPONENTS2 DBus) - endif() - if (CITRON_USE_QT_MULTIMEDIA) - list(APPEND CITRON_QT_COMPONENTS2 Multimedia) - endif() - if (CITRON_USE_QT_WEB_ENGINE) - list(APPEND CITRON_QT_COMPONENTS2 WebEngineCore WebEngineWidgets) - endif() - if (ENABLE_QT_TRANSLATION) - list(APPEND CITRON_QT_COMPONENTS2 LinguistTools) - endif() - if (USE_DISCORD_PRESENCE) - list(APPEND CITRON_QT_COMPONENTS2 Network) - endif() - set(CITRON_QT_COMPONENTS ${CITRON_QT_COMPONENTS2} PARENT_SCOPE) -endfunction(set_citron_qt_components) - -# Qt5 requires that we find components, so it doesn't fit our pretty little find package function -if(ENABLE_QT) - set(QT_VERSION 5.15) - # These are used to specify minimum versions - set(QT5_VERSION 5.15) - set(QT6_VERSION 6.3.1) - - set_citron_qt_components() - if (ENABLE_QT6) - find_package(Qt6 ${QT6_VERSION} COMPONENTS ${CITRON_QT_COMPONENTS}) - endif() - if (Qt6_FOUND) - message(STATUS "citron/CMakeLists.txt: Qt6Widgets_VERSION ${Qt6Widgets_VERSION}, setting QT_VERSION") - set(QT_VERSION ${Qt6Widgets_VERSION}) - set(QT_MAJOR_VERSION 6) - # Qt6 sets cxx_std_17 and we need to undo that - set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") - else() - message(STATUS "citron/CMakeLists.txt: Qt6 not found/not selected, trying for Qt5") - # When Qt6 partially found, need this set to use Qt5 when not specifying version - set(QT_DEFAULT_MAJOR_VERSION 5) - set(QT_MAJOR_VERSION 5) - - set(CITRON_USE_QT_MULTIMEDIA ON) - # Check for system Qt on Linux, fallback to bundled Qt - if (UNIX AND NOT APPLE) - if (NOT CITRON_USE_BUNDLED_QT) - find_package(Qt5 ${QT5_VERSION} COMPONENTS Widgets DBus Multimedia) - endif() - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND (NOT Qt5_FOUND OR CITRON_USE_BUNDLED_QT)) - # Check for dependencies, then enable bundled Qt download - - # Check that the system GLIBCXX version is compatible - find_program(OBJDUMP objdump) - if (NOT OBJDUMP) - message(FATAL_ERROR "Required program `objdump` not found.") - endif() - find_library(LIBSTDCXX libstdc++.so.6) - execute_process( - COMMAND - ${OBJDUMP} -T ${LIBSTDCXX} - COMMAND - grep GLIBCXX_3.4.28 - COMMAND - sed "s/[0-9a-f]*.* //" - COMMAND - sed "s/ .*//" - COMMAND - sort -u - OUTPUT_VARIABLE - GLIBCXX_MET - ) - if (NOT GLIBCXX_MET) - message(FATAL_ERROR "Qt too old or not found, and bundled Qt package is not \ - compatible with this system. Either install Qt ${QT_VERSION}, or provide the path \ - to Qt by setting the variable Qt5_ROOT.") - endif() - - # Check for headers - find_package(PkgConfig REQUIRED) - pkg_check_modules(QT_DEP_GLU QUIET glu>=9.0.0) - if (NOT QT_DEP_GLU_FOUND) - message(FATAL_ERROR "Qt bundled package dependency `glu` not found. \ - Perhaps `libglu1-mesa-dev` needs to be installed?") - endif() - pkg_check_modules(QT_DEP_MESA QUIET dri>=20.0.8) - if (NOT QT_DEP_MESA_FOUND) - message(FATAL_ERROR "Qt bundled package dependency `dri` not found. \ - Perhaps `mesa-common-dev` needs to be installed?") - endif() - - # Check for X libraries - set(BUNDLED_QT_REQUIREMENTS - libxcb-icccm.so.4 - libxcb-image.so.0 - libxcb-keysyms.so.1 - libxcb-randr.so.0 - libxcb-render-util.so.0 - libxcb-render.so.0 - libxcb-shape.so.0 - libxcb-shm.so.0 - libxcb-sync.so.1 - libxcb-xfixes.so.0 - libxcb-xinerama.so.0 - libxcb-xkb.so.1 - libxcb.so.1 - libxkbcommon-x11.so.0 - libxkbcommon.so.0 - ) - set(UNRESOLVED_QT_DEPS "") - foreach (REQUIREMENT ${BUNDLED_QT_REQUIREMENTS}) - find_library(BUNDLED_QT_${REQUIREMENT} ${REQUIREMENT}) - if (NOT BUNDLED_QT_${REQUIREMENT}) - set(UNRESOLVED_QT_DEPS ${UNRESOLVED_QT_DEPS} ${REQUIREMENT}) - endif() - unset(BUNDLED_QT_${REQUIREMENT}) - endforeach() - unset(BUNDLED_QT_REQUIREMENTS) - - if (NOT "${UNRESOLVED_QT_DEPS}" STREQUAL "") - message(FATAL_ERROR "Bundled Qt package missing required dependencies: ${UNRESOLVED_QT_DEPS}") - endif() - - set(CITRON_USE_BUNDLED_QT ON CACHE BOOL "Download bundled Qt" FORCE) - endif() - if (CITRON_USE_BUNDLED_QT) - # Binary package currently does not support Qt webengine, so make sure it's disabled - set(CITRON_USE_QT_WEB_ENGINE OFF CACHE BOOL "Use Qt Webengine" FORCE) - endif() - endif() - - set(CITRON_QT_NO_CMAKE_SYSTEM_PATH) - - if(CITRON_USE_BUNDLED_QT) - if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) - set(QT_BUILD qt-5.15.2-msvc2019_64) - elseif ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND NOT MINGW AND ARCHITECTURE_x86_64) - set(QT_BUILD qt5_5_15_2) - else() - message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable CITRON_USE_BUNDLED_QT and provide your own.") - endif() - - if (DEFINED QT_BUILD) - download_bundled_external("qt/" ${QT_BUILD} QT_PREFIX) - endif() - - set(QT_PREFIX_HINT HINTS "${QT_PREFIX}") - - set(CITRON_QT_NO_CMAKE_SYSTEM_PATH "NO_CMAKE_SYSTEM_PATH") - # Binary package for Qt5 has Qt Multimedia - set(CITRON_USE_QT_MULTIMEDIA ON CACHE BOOL "Use Qt Multimedia" FORCE) - endif() - - set_citron_qt_components() - find_package(Qt5 ${QT5_VERSION} COMPONENTS ${CITRON_QT_COMPONENTS} ${QT_PREFIX_HINT} ${CITRON_QT_NO_CMAKE_SYSTEM_PATH}) - endif() - -endif() - # find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the citron_find_package if (ENABLE_SDL2) if (CITRON_USE_BUNDLED_SDL2) # Detect toolchain and platform - if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) + if ((MSVC_VERSION GREATER_EQUAL 1920) AND ARCHITECTURE_x86_64) set(SDL2_VER "SDL2-2.28.2") else() message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable CITRON_USE_BUNDLED_SDL2 and provide your own.") @@ -554,22 +471,90 @@ if (ENABLE_SDL2) endif() endif() -# List of all FFmpeg components required -set(FFmpeg_COMPONENTS +add_subdirectory(externals) + +if (USE_DISCORD_PRESENCE) + target_compile_options(discord-rpc PRIVATE -fpermissive) +endif() + +if (ENABLE_QT) + if (NOT USE_SYSTEM_QT) + download_qt(6.8.2) + endif() + + find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia Concurrent Network) + + if (UNIX AND NOT APPLE) + find_package(Qt6 REQUIRED COMPONENTS DBus) + endif() + + if (ENABLE_QT_TRANSLATION) + find_package(Qt6 REQUIRED COMPONENTS LinguistTools) + endif() + + if (NOT DEFINED QT_TARGET_PATH) + get_target_property(qtcore_path Qt6::Core LOCATION_Release) + string(FIND "${qtcore_path}" "/bin/" qtcore_path_bin_pos REVERSE) + string(FIND "${qtcore_path}" "/lib/" qtcore_path_lib_pos REVERSE) + if (qtcore_path_bin_pos GREATER qtcore_path_lib_pos) + string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_bin_pos} QT_TARGET_PATH) + else() + string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_lib_pos} QT_TARGET_PATH) + endif() + endif() + + if (NOT DEFINED QT_HOST_PATH) + set(QT_HOST_PATH "${QT_TARGET_PATH}") + endif() + message(STATUS "Using target Qt at ${QT_TARGET_PATH}") + message(STATUS "Using host Qt at ${QT_HOST_PATH}") +endif() + +function(set_citron_qt_components) +# Best practice is to ask for all components at once, so they are from the same version +set(CITRON_QT_COMPONENTS2 Core Widgets Concurrent) +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") +list(APPEND CITRON_QT_COMPONENTS2 DBus) +endif() +if (CITRON_USE_QT_MULTIMEDIA) +list(APPEND CITRON_QT_COMPONENTS2 Multimedia) + endif() + if (CITRON_USE_QT_WEB_ENGINE) + list(APPEND CITRON_QT_COMPONENTS2 WebEngineCore WebEngineWidgets) + endif() + if (ENABLE_QT_TRANSLATION) + list(APPEND CITRON_QT_COMPONENTS2 LinguistTools) + endif() + if (USE_DISCORD_PRESENCE) + list(APPEND CITRON_QT_COMPONENTS2 Network) + endif() + set(CITRON_QT_COMPONENTS ${CITRON_QT_COMPONENTS2} PARENT_SCOPE) + endfunction(set_citron_qt_components) + + # List of all FFmpeg components required + set(FFmpeg_COMPONENTS avcodec avfilter avutil swscale) -if (UNIX AND NOT APPLE AND NOT ANDROID) + if (UNIX AND NOT APPLE AND NOT ANDROID) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBVA libva) endif() if (NOT CITRON_USE_BUNDLED_FFMPEG) # Use system installed FFmpeg - find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) + find_package(FFmpeg REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) endif() +if(ENABLE_QT) + set_citron_qt_components() + find_package(Qt6 REQUIRED COMPONENTS ${CITRON_QT_COMPONENTS}) + set(QT_MAJOR_VERSION 6) + # Qt6 sets cxx_std_17 and we need to undo that + set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") + endif() + if (WIN32 AND CITRON_CRASH_DUMPS) set(BREAKPAD_VER "breakpad-c89f9dd") download_bundled_external("breakpad/" ${BREAKPAD_VER} BREAKPAD_PREFIX) @@ -700,7 +685,25 @@ if (CITRON_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif() -add_subdirectory(externals) +# Set runtime library to MD/MDd for all configurations +if(MSVC) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") + + # Force all projects (including external dependencies) to use the same runtime + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd") + + # Add this to ensure Cubeb uses the same runtime + add_compile_options( + $<$:/MDd> + $<$:/MD> + $<$:/MD> + $<$:/MD> + ) +endif() + add_subdirectory(src) # Set citron project or citron-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not diff --git a/CMakeModules/CopyCitronFFmpegDeps.cmake b/CMakeModules/CopyCitronFFmpegDeps.cmake index 10f8dcf5b..f8413b574 100644 --- a/CMakeModules/CopyCitronFFmpegDeps.cmake +++ b/CMakeModules/CopyCitronFFmpegDeps.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2020 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2020 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_citron_FFmpeg_deps target_dir) diff --git a/CMakeModules/CopyCitronQt5Deps.cmake b/CMakeModules/CopyCitronQt5Deps.cmake index c8f9e1dbe..af58151d7 100644 --- a/CMakeModules/CopyCitronQt5Deps.cmake +++ b/CMakeModules/CopyCitronQt5Deps.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_citron_Qt5_deps target_dir) diff --git a/CMakeModules/CopyCitronQt6Deps.cmake b/CMakeModules/CopyCitronQt6Deps.cmake new file mode 100644 index 000000000..3d354a495 --- /dev/null +++ b/CMakeModules/CopyCitronQt6Deps.cmake @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: 2024 Citron HomeBrew Emulator Project + +function(copy_citron_Qt6_deps target_dir) + include(WindowsCopyFiles) + if (MSVC) + set(DLL_DEST "$/") + set(Qt6_DLL_DIR "${Qt6_DIR}/../../../bin") + else() + set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/") + set(Qt6_DLL_DIR "${Qt6_DIR}/../../../lib/") + endif() + set(Qt6_PLATFORMS_DIR "${Qt6_DIR}/../../../plugins/platforms/") + set(Qt6_STYLES_DIR "${Qt6_DIR}/../../../plugins/styles/") + set(Qt6_IMAGEFORMATS_DIR "${Qt6_DIR}/../../../plugins/imageformats/") + set(Qt6_RESOURCES_DIR "${Qt6_DIR}/../../../resources/") + set(PLATFORMS ${DLL_DEST}plugins/platforms/) + set(STYLES ${DLL_DEST}plugins/styles/) + set(IMAGEFORMATS ${DLL_DEST}plugins/imageformats/) + + if (MSVC) + windows_copy_files(${target_dir} ${Qt6_DLL_DIR} ${DLL_DEST} + Qt6Core$<$:d>.* + Qt6Gui$<$:d>.* + Qt6Widgets$<$:d>.* + Qt6Network$<$:d>.* + ) + if (CITRON_USE_QT_MULTIMEDIA) + windows_copy_files(${target_dir} ${Qt6_DLL_DIR} ${DLL_DEST} + Qt6Multimedia$<$:d>.* + ) + endif() + if (CITRON_USE_QT_WEB_ENGINE) + windows_copy_files(${target_dir} ${Qt6_DLL_DIR} ${DLL_DEST} + Qt6WebEngineCore$<$:d>.* + Qt6WebEngineWidgets$<$:d>.* + QtWebEngineProcess$<$:d>.* + ) + windows_copy_files(${target_dir} ${Qt6_RESOURCES_DIR} ${DLL_DEST} + icudtl.dat + qtwebengine_devtools_resources.pak + qtwebengine_resources.pak + qtwebengine_resources_100p.pak + qtwebengine_resources_200p.pak + ) + endif() + windows_copy_files(citron ${Qt6_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$:d>.*) + windows_copy_files(citron ${Qt6_STYLES_DIR} ${STYLES} qwindowsvistastyle$<$:d>.*) + windows_copy_files(citron ${Qt6_IMAGEFORMATS_DIR} ${IMAGEFORMATS} + qjpeg$<$:d>.* + qgif$<$:d>.* + ) + else() + # Update for non-MSVC platforms if needed + endif() + + # Create an empty qt.conf file + add_custom_command(TARGET citron POST_BUILD + COMMAND ${CMAKE_COMMAND} -E touch ${DLL_DEST}qt.conf + ) +endfunction(copy_citron_Qt6_deps) diff --git a/CMakeModules/CopyCitronSDLDeps.cmake b/CMakeModules/CopyCitronSDLDeps.cmake index 1ce39a3a0..a07f6f8c7 100644 --- a/CMakeModules/CopyCitronSDLDeps.cmake +++ b/CMakeModules/CopyCitronSDLDeps.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_citron_SDL_deps target_dir) diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 12b337997..d237876e6 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -1,10 +1,11 @@ -# SPDX-FileCopyrightText: 2017 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2025 Citron Homebrew Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # This function downloads a binary library package from our external repo. # Params: # remote_path: path to the file to download, relative to the remote repository root # prefix_var: name of a variable which will be set with the path to the extracted contents +set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR}) function(download_bundled_external remote_path lib_name prefix_var) set(package_base_url "https://github.com/yuzu-mirror/") @@ -16,7 +17,7 @@ if (WIN32) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(package_repo "ext-linux-bin/raw/main/") set(package_extension ".tar.xz") -elseif (ANDROID) +elseif (ANDROID) set(package_repo "ext-android-bin/raw/main/") set(package_extension ".tar.xz") else() @@ -54,3 +55,172 @@ function(download_moltenvk_external platform version) list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}") set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) endfunction() + +# Determine installation parameters for OS, architecture, and compiler +function(determine_qt_parameters target host_out type_out arch_out arch_path_out host_type_out host_arch_out host_arch_path_out) + if (WIN32) + set(host "windows") + set(type "desktop") + + if (NOT tool) + if (MINGW) + set(arch "win64_mingw") + set(arch_path "mingw_64") + elseif (MSVC) + if ("arm64" IN_LIST ARCHITECTURE) + set(arch_path "msvc2022_arm64") + elseif ("x86_64" IN_LIST ARCHITECTURE) + set(arch_path "msvc2022_64") + else() + message(FATAL_ERROR "Unsupported bundled Qt architecture. Enable USE_SYSTEM_QT and provide your own.") + endif() + set(arch "win64_${arch_path}") + + if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64") + set(host_arch_path "msvc2022_64") + elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "ARM64") + set(host_arch_path "msvc2022_64") + endif() + set(host_arch "win64_${host_arch_path}") + else() + message(FATAL_ERROR "Unsupported bundled Qt toolchain. Enable USE_SYSTEM_QT and provide your own.") + endif() + endif() + elseif (APPLE) + set(host "mac") + set(type "desktop") + set(arch "clang_64") + set(arch_path "macos") + else() + set(host "linux") + set(type "desktop") + set(arch "gcc_64") + set(arch_path "linux") + endif() + + set(${host_out} "${host}" PARENT_SCOPE) + set(${type_out} "${type}" PARENT_SCOPE) + set(${arch_out} "${arch}" PARENT_SCOPE) + set(${arch_path_out} "${arch_path}" PARENT_SCOPE) + if (DEFINED host_type) + set(${host_type_out} "${host_type}" PARENT_SCOPE) + else() + set(${host_type_out} "${type}" PARENT_SCOPE) + endif() + if (DEFINED host_arch) + set(${host_arch_out} "${host_arch}" PARENT_SCOPE) + else() + set(${host_arch_out} "${arch}" PARENT_SCOPE) + endif() + if (DEFINED host_arch_path) + set(${host_arch_path_out} "${host_arch_path}" PARENT_SCOPE) + else() + set(${host_arch_path_out} "${arch_path}" PARENT_SCOPE) + endif() +endfunction() + +# Download Qt binaries for a specific configuration. +function(download_qt_configuration prefix_out target host type arch arch_path base_path) + if (target MATCHES "tools_.*") + set(tool ON) + else() + set(tool OFF) + endif() + + set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini") + if (tool) + set(prefix "${base_path}/Tools") + set(install_args ${install_args} install-tool --outputdir ${base_path} ${host} desktop ${target}) + else() + set(prefix "${base_path}/${target}/${arch_path}") + set(install_args ${install_args} install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch} + -m all) + endif() + + if (NOT EXISTS "${prefix}") + message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}") + set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.2.0") + if (WIN32) + set(aqt_path "${base_path}/aqt.exe") + if (NOT EXISTS "${aqt_path}") + file(DOWNLOAD + ${AQT_PREBUILD_BASE_URL}/aqt.exe + ${aqt_path} SHOW_PROGRESS) + endif() + execute_process(COMMAND ${aqt_path} ${install_args} + WORKING_DIRECTORY ${base_path}) + elseif (APPLE) + set(aqt_path "${base_path}/aqt-macos") + if (NOT EXISTS "${aqt_path}") + file(DOWNLOAD + ${AQT_PREBUILD_BASE_URL}/aqt-macos + ${aqt_path} SHOW_PROGRESS) + endif() + execute_process(COMMAND chmod +x ${aqt_path}) + execute_process(COMMAND ${aqt_path} ${install_args} + WORKING_DIRECTORY ${base_path}) + else() + set(aqt_install_path "${base_path}/aqt") + file(MAKE_DIRECTORY "${aqt_install_path}") + + execute_process(COMMAND python3 -m pip install --target=${aqt_install_path} aqtinstall + WORKING_DIRECTORY ${base_path}) + execute_process(COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${aqt_install_path} python3 -m aqt ${install_args} + WORKING_DIRECTORY ${base_path}) + endif() + + message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}") + endif() + + set(${prefix_out} "${prefix}" PARENT_SCOPE) +endfunction() + +# This function downloads Qt using aqt. +# The path of the downloaded content will be added to the CMAKE_PREFIX_PATH. +# QT_TARGET_PATH is set to the Qt for the compile target platform. +# QT_HOST_PATH is set to a host-compatible Qt, for running tools. +# Params: +# target: Qt dependency to install. Specify a version number to download Qt, or "tools_(name)" for a specific build tool. +function(download_qt target) + determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path) + + get_external_prefix(qt base_path) + file(MAKE_DIRECTORY "${base_path}") + + download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}") + if (DEFINED host_arch_path AND NOT "${host_arch_path}" STREQUAL "${arch_path}") + download_qt_configuration(host_prefix "${target}" "${host}" "${host_type}" "${host_arch}" "${host_arch_path}" "${base_path}") + else() + set(host_prefix "${prefix}") + endif() + + set(QT_TARGET_PATH "${prefix}" CACHE STRING "") + set(QT_HOST_PATH "${host_prefix}" CACHE STRING "") + + list(APPEND CMAKE_PREFIX_PATH "${prefix}") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) +endfunction() + +function(download_moltenvk) +set(MOLTENVK_PLATFORM "macOS") + +set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") +set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") +if (NOT EXISTS ${MOLTENVK_DIR}) +if (NOT EXISTS ${MOLTENVK_TAR}) + file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.10-rc2/MoltenVK-all.tar + ${MOLTENVK_TAR} SHOW_PROGRESS) +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") +endif() + +# Add the MoltenVK library path to the prefix so find_library can locate it. +list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${MOLTENVK_PLATFORM}") +set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) +endfunction() + +function(get_external_prefix lib_name prefix_var) + set(${prefix_var} "${CMAKE_BINARY_DIR}/externals/${lib_name}" PARENT_SCOPE) +endfunction() diff --git a/CMakeModules/FindFFmpeg.cmake b/CMakeModules/FindFFmpeg.cmake index c88b19c15..5cb1f3c8a 100644 --- a/CMakeModules/FindFFmpeg.cmake +++ b/CMakeModules/FindFFmpeg.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2019 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2019 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # FindFFmpeg diff --git a/CMakeModules/FindOpus.cmake b/CMakeModules/FindOpus.cmake index 76b5de287..25a44fd87 100644 --- a/CMakeModules/FindOpus.cmake +++ b/CMakeModules/FindOpus.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later find_package(PkgConfig QUIET) diff --git a/CMakeModules/Findgamemode.cmake b/CMakeModules/Findgamemode.cmake index 5c9e04955..aa2f36683 100644 --- a/CMakeModules/Findgamemode.cmake +++ b/CMakeModules/Findgamemode.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later find_package(PkgConfig QUIET) diff --git a/CMakeModules/Findlz4.cmake b/CMakeModules/Findlz4.cmake index 36a2b5228..7a9a02d4e 100644 --- a/CMakeModules/Findlz4.cmake +++ b/CMakeModules/Findlz4.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later include(FindPackageHandleStandardArgs) diff --git a/CMakeModules/Findzstd.cmake b/CMakeModules/Findzstd.cmake index e3676079e..ae3ea0865 100644 --- a/CMakeModules/Findzstd.cmake +++ b/CMakeModules/Findzstd.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later include(FindPackageHandleStandardArgs) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 43b482f42..3f5ce0f34 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2019 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Gets a UTC timestamp and sets the provided variable to it diff --git a/CMakeModules/MSVCCache.cmake b/CMakeModules/MSVCCache.cmake index 56c77ae11..ba0d22d9e 100644 --- a/CMakeModules/MSVCCache.cmake +++ b/CMakeModules/MSVCCache.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # buildcache wrapper diff --git a/CMakeModules/MinGWClangCross.cmake b/CMakeModules/MinGWClangCross.cmake index 08be04a62..286a59a7a 100644 --- a/CMakeModules/MinGWClangCross.cmake +++ b/CMakeModules/MinGWClangCross.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later set(MINGW_PREFIX /usr/x86_64-w64-mingw32/) diff --git a/CMakeModules/WindowsCopyFiles.cmake b/CMakeModules/WindowsCopyFiles.cmake index 92abf37e7..08b598365 100644 --- a/CMakeModules/WindowsCopyFiles.cmake +++ b/CMakeModules/WindowsCopyFiles.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # This file provides the function windows_copy_files. diff --git a/CMakeModules/aqt_config.ini b/CMakeModules/aqt_config.ini new file mode 100644 index 000000000..2ea6096e4 --- /dev/null +++ b/CMakeModules/aqt_config.ini @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2024 Citron HomeBrew Emulator Project + +[aqt] +concurrency: 2 + +[mirrors] +trusted_mirrors: + https://download.qt.io +blacklist: + https://qt.mirror.constant.com + https://mirrors.ocf.berkeley.edu + https://mirrors.ustc.edu.cn + https://mirrors.tuna.tsinghua.edu.cn + https://mirrors.geekpie.club + https://mirrors-wan.geekpie.club + https://mirrors.sjtug.sjtu.edu.cn +fallbacks: + https://qtproject.mirror.liquidtelecom.com/ + https://mirrors.aliyun.com/qt/ + https://ftp.jaist.ac.jp/pub/qtproject/ + https://ftp.yz.yamagata-u.ac.jp/pub/qtproject/ + https://qt-mirror.dannhauer.de/ + https://ftp.fau.de/qtproject/ + https://mirror.netcologne.de/qtproject/ + https://mirrors.dotsrc.org/qtproject/ + https://www.nic.funet.fi/pub/mirrors/download.qt-project.org/ + https://master.qt.io/ + https://mirrors.ukfast.co.uk/sites/qt.io/ + https://ftp2.nluug.nl/languages/qt/ + https://ftp1.nluug.nl/languages/qt/ diff --git a/appimage-builder.sh b/appimage-builder.sh new file mode 100755 index 000000000..2c29d9aa5 --- /dev/null +++ b/appimage-builder.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# reg_server, 2024-01-09 + +set -e + +# check arguments +if [[ $# != 2 ]]; then + >&2 echo "Invalid arguments!" + echo "Usage: $0 torzu|citron " + exit 1 +fi + +BUILD_APP="$1" +if [[ "${BUILD_APP}" != "torzu" && "${BUILD_APP}" != "citron" ]]; then + >&2 echo "Invalid arguments!" + echo "Usage: $0 torzu|citron " + exit 1 +fi + +BUILD_DIR=$(realpath "$2") +if [[ ! -d "${BUILD_DIR}" ]]; then + >&2 echo "Invalid arguments!" + echo "'$2' is not a directory" + exit 1 +fi + +DEPLOY_LINUX_FOLDER="${BUILD_DIR}/deploy-linux" +DEPLOY_LINUX_APPDIR_FOLDER="${BUILD_DIR}/deploy-linux/AppDir" +BIN_FOLDER="${BUILD_DIR}/bin" +BIN_EXE="${BIN_FOLDER}/${BUILD_APP//torzu/yuzu}" + +CPU_ARCH=$(uname -m) + +#export DISPLAYVERSION="1.2.3" # before cmake + +BIN_EXE_MIME_TYPE=$(file -b --mime-type "${BIN_EXE}") +if [[ "${BIN_EXE_MIME_TYPE}" != "application/x-pie-executable" && "${BIN_EXE_MIME_TYPE}" != "application/x-executable" ]]; then + >&2 echo "Invalid or missing main executable (${BIN_EXE})!" + exit 1 +fi + +mkdir -p "${DEPLOY_LINUX_FOLDER}" +rm -rf "${DEPLOY_LINUX_APPDIR_FOLDER}" + +cd "${BUILD_DIR}" + +# deploy/install to deploy-linux/AppDir +DESTDIR="${DEPLOY_LINUX_APPDIR_FOLDER}" ninja install + +cd "${DEPLOY_LINUX_FOLDER}" + +# remove -cmd executable, not needed for AppImage +rm -fv "${DEPLOY_LINUX_APPDIR_FOLDER}"/usr/bin/"${BUILD_APP//torzu/yuzu}"-cmd + +curl -fsSLo ./linuxdeploy "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-${CPU_ARCH}.AppImage" +chmod +x ./linuxdeploy + +curl -fsSLo ./linuxdeploy-plugin-qt "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-${CPU_ARCH}.AppImage" +chmod +x ./linuxdeploy-plugin-qt + +curl -fsSLo ./linuxdeploy-plugin-checkrt.sh https://github.com/darealshinji/linuxdeploy-plugin-checkrt/releases/download/continuous/linuxdeploy-plugin-checkrt.sh +chmod +x ./linuxdeploy-plugin-checkrt.sh + +# Add Qt 6 specific environment variables +export QT_QPA_PLATFORM="wayland;xcb" +export EXTRA_PLATFORM_PLUGINS="libqwayland-egl.so;libqwayland-generic.so;libqxcb.so" +export EXTRA_QT_PLUGINS="svg;wayland-decoration-client;wayland-graphics-integration-client;wayland-shell-integration;waylandcompositor;xcb-gl-integration;platformthemes/libqt6ct.so" + +# Update linuxdeploy commands for Qt 6 +export QMAKE="/usr/bin/qmake6" +export QT_SELECT=6 + +# remove NO_STRIP=1 if linuxdeploy is updated, see: https://github.com/linuxdeploy/linuxdeploy/issues/272 +NO_STRIP=1 APPIMAGE_EXTRACT_AND_RUN=1 ./linuxdeploy --appdir ./AppDir --plugin qt --plugin checkrt + +# remove libwayland-client because it has platform-dependent exports and breaks other OSes +rm -fv ./AppDir/usr/lib/libwayland-client.so* + +# remove libvulkan because it causes issues with gamescope +rm -fv ./AppDir/usr/lib/libvulkan.so* + +rm -rf ./linuxdeploy-squashfs-root +./linuxdeploy --appimage-extract +mv -v ./squashfs-root/ ./linuxdeploy-squashfs-root/ + +./linuxdeploy-squashfs-root/plugins/linuxdeploy-plugin-appimage/usr/bin/appimagetool ./AppDir -g + +#APPIMAGE_SUFFIX="linux_${CPU_ARCH}" +APPIMAGE_SUFFIX="${CPU_ARCH}" +#COMM_TAG="${DISPLAYVERSION}" +COMM_COUNT="$(git rev-list --count HEAD)" +COMM_HASH="$(git rev-parse --short=9 HEAD)" +BUILD_DATE=$(date +"%Y%m%d") +#APPIMAGE_NAME="${BUILD_APP}-v${COMM_TAG}-${BUILD_DATE}-${COMM_COUNT}-${COMM_HASH}-${APPIMAGE_SUFFIX}.AppImage" +APPIMAGE_NAME="${BUILD_APP}-nightly-${BUILD_DATE}-${COMM_COUNT}-${COMM_HASH}-${APPIMAGE_SUFFIX}.AppImage" + +LATEST_APPIMAGE=$(ls -1t ${BUILD_APP}*.AppImage | head -n 1) # find the most recent AppImage +if [[ -z "${LATEST_APPIMAGE}" ]]; then + >&2 echo "Error: No AppImage found for ${BUILD_APP}" + exit 1 +fi + +mv -v "${LATEST_APPIMAGE}" "${APPIMAGE_NAME}" + +FILESIZE=$(stat -c %s "./${APPIMAGE_NAME}") +SHA256SUM=$(sha256sum "./${APPIMAGE_NAME}" | awk '{ print $1 }') + +echo "${APPIMAGE_NAME}" +echo "${SHA256SUM};${FILESIZE}B" diff --git a/dist/72-citron-input.rules b/dist/72-citron-input.rules index ab6474033..df051ca28 100644 --- a/dist/72-citron-input.rules +++ b/dist/72-citron-input.rules @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-FileCopyrightText: 2025 citron Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Allow systemd-logind to manage user access to hidraw with this file @@ -7,13 +8,13 @@ # Switch Pro Controller (USB/Bluetooth) KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="2009", MODE="0660", TAG+="uaccess" -KERNEL=="hidraw*", KERNELS=="*057e:2009*", MODE="0660", TAG+="uaccess" +KERNEL=="hidraw*", KERNELS=="*057E:2009*", MODE="0660", TAG+="uaccess" # Joy-Con L (Bluetooth) -KERNEL=="hidraw*", KERNELS=="*057e:2006*", MODE="0660", TAG+="uaccess" +KERNEL=="hidraw*", KERNELS=="*057E:2006*", MODE="0660", TAG+="uaccess" # Joy-Con R (Bluetooth) -KERNEL=="hidraw*", KERNELS=="*057e:2007*", MODE="0660", TAG+="uaccess" +KERNEL=="hidraw*", KERNELS=="*057E:2007*", MODE="0660", TAG+="uaccess" # Joy-Con Charging Grip (USB) KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="200e", MODE="0660", TAG+="uaccess" diff --git a/dist/citron.manifest b/dist/citron.manifest index 033913b59..f2c8639a2 100644 --- a/dist/citron.manifest +++ b/dist/citron.manifest @@ -1,7 +1,7 @@ diff --git a/dist/compatibility_list/compatibility_list.qrc b/dist/compatibility_list/compatibility_list.qrc index f23105ecf..3b1359a8e 100644 --- a/dist/compatibility_list/compatibility_list.qrc +++ b/dist/compatibility_list/compatibility_list.qrc @@ -1,5 +1,5 @@ diff --git a/dist/icons/controller/controller.qrc b/dist/icons/controller/controller.qrc index ffe80fd8f..8d5261c38 100644 --- a/dist/icons/controller/controller.qrc +++ b/dist/icons/controller/controller.qrc @@ -1,5 +1,5 @@ diff --git a/dist/icons/overlay/overlay.qrc b/dist/icons/overlay/overlay.qrc index 0d421ab09..8d7833aca 100644 --- a/dist/icons/overlay/overlay.qrc +++ b/dist/icons/overlay/overlay.qrc @@ -1,5 +1,5 @@ diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index b890f4f97..68102e044 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">موقعنا</span></a>|<a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">رماز المصدر</span></a>|<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">المساهمون</span></a>|<a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">الرخصة</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">موقعنا</span></a>|<a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">رماز المصدر</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">المساهمون</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">الرخصة</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6074,7 +6074,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii تحرير التطبيق الصغير diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 474332d76..5af1aba76 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Pàgina web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Codi Font</span></a>|<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuïdors</span></a>|<a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Llicència</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Pàgina web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Codi Font</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuïdors</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Llicència</span></a></p></body></html> @@ -407,7 +407,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6111,7 +6111,7 @@ Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index cf18ed420..3a5929a9e 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Webové stránky</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Zdrojový kód</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Přispěvatelé</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Webové stránky</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Zdrojový kód</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Přispěvatelé</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> @@ -407,7 +407,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6095,7 +6095,7 @@ Tuto funkci prosím používejte pouze k instalaci aktualizací a DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/da.ts b/dist/languages/da.ts index c5b86b640..29bc75823 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/">Netsted<span style=" text-decoration: underline; color:#039be5;"></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsydere</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/">Netsted<span style=" text-decoration: underline; color:#039be5;"></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsydere</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> @@ -409,7 +409,7 @@ Dette vil bandlyse både vedkommendes forum-brugernavn og IP-adresse. - Mii Edit + Mii Editor @@ -6101,7 +6101,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/de.ts b/dist/languages/de.ts index a2497ff7e..ad9ca87c2 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Webseite</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Quellcode</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Mitwirkende</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lizenz</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Webseite</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Quellcode</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Mitwirkende</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lizenz</span></a></p></body></html> @@ -408,7 +408,7 @@ Dies würde deren Forum-Benutzernamen und deren IP-Adresse sperren. - Mii Edit + Mii Editor @@ -6121,7 +6121,7 @@ Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - Mii Edit Applet + Mii Editor Applet Mii-Edit-Applet diff --git a/dist/languages/el.ts b/dist/languages/el.ts index d9c6416d7..9f780c6b4 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Ιστοσελίδα</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Πηγαίος Κώδικας</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Συνεργάτες</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"></span>Άδεια</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Ιστοσελίδα</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Πηγαίος Κώδικας</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Συνεργάτες</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"></span>Άδεια</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6097,7 +6097,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 1bb0eab54..8e3714e42 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Página web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Código fuente</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencia</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Página web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Código fuente</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencia</span></a></p></body></html> @@ -409,7 +409,7 @@ Esto banearía su nombre del foro y su dirección IP. - Mii Edit + Mii Editor Editor de Mii @@ -6167,7 +6167,7 @@ Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - Mii Edit Applet + Mii Editor Applet Applet de Editor de Mii diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 930ac332e..29caf2e5f 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -40,8 +40,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Nettisivu</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Lähdekoodi</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Lahjoittajat</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisenssi</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Nettisivu</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Lähdekoodi</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Lahjoittajat</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisenssi</span></a></p></body></html> diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 6c397c7dc..d42232bb6 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Site Web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Code Source</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributeurs</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Site Web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Code Source</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributeurs</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> @@ -410,7 +410,7 @@ Cela bannirait à la fois son nom d'utilisateur du forum et son adresse IP. - Mii Edit + Mii Editor Édition de Mii @@ -6160,7 +6160,7 @@ Veuillez n'utiliser cette fonctionnalité que pour installer des mises à j - Mii Edit Applet + Mii Editor Applet Applet de l'éditeur Mii diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index ad654452d..641e99064 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Weboldal</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Forráskód</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Közreműködők</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licensz</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Weboldal</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Forráskód</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Közreműködők</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licensz</span></a></p></body></html> @@ -409,7 +409,7 @@ Ez kitiltaná a fórum felhasználóneve és az IP címe alapján. - Mii Edit + Mii Editor Mii szerkesztés @@ -6134,7 +6134,7 @@ Kérjük, csak frissítések és DLC-k telepítéséhez használd ezt a funkció - Mii Edit Applet + Mii Editor Applet Mii szerkesztő applet diff --git a/dist/languages/id.ts b/dist/languages/id.ts index f611be75d..c3aa25018 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Situs web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Kode Sumber</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontributor</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisensi</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Situs web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Kode Sumber</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontributor</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisensi</span></a></p></body></html> @@ -409,7 +409,7 @@ Ini akan melarang nama pengguna forum mereka dan alamat IP mereka. - Mii Edit + Mii Editor Ubah Mii @@ -6154,7 +6154,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/it.ts b/dist/languages/it.ts index e12e40431..73b95b56d 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Sito web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Codice sorgente</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributori</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licenza</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Sito web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Codice sorgente</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributori</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licenza</span></a></p></body></html> @@ -409,7 +409,7 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Mii Edit + Mii Editor @@ -6130,7 +6130,7 @@ Configurazione &gt; Web. - Mii Edit Applet + Mii Editor Applet Editor dei Mii diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 6d56078f1..bef6d8804 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">ウェブサイト</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">ソースコード</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢献者</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">ライセンス</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">ウェブサイト</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">ソースコード</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢献者</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">ライセンス</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6116,7 +6116,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii 編集アプレット diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index ee92addc1..f7cb093d1 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">웹사이트</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">소스 코드</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">기여자</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">라이센스</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">웹사이트</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">소스 코드</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">기여자</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">라이센스</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6115,7 +6115,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index f154082dd..70005af1a 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Nettside</span></a>|<a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a>|<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsytere</span></a>|<a href="https://github.com/citron-emu/citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisens</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Nettside</span></a>|<a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsytere</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisens</span></a></p></body></html> @@ -409,7 +409,7 @@ Dette vil bannlyse både deres forum brukernavn og deres IP adresse. - Mii Edit + Mii Editor @@ -6120,7 +6120,7 @@ Bruk kun denne funksjonen til å installere oppdateringer og DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 66c6e8dc7..15e873d51 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Broncode</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bijdragers</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licentie</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Broncode</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bijdragers</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licentie</span></a></p></body></html> @@ -409,7 +409,7 @@ Dit zou zowel hun forum gebruikersnaam als hun IP-adres verbannen. - Mii Edit + Mii Editor @@ -6108,7 +6108,7 @@ Gebruik deze functie alleen om updates en DLC te installeren. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 915af887a..0313fe654 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Strona</span></a>I<a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Kod Źródłowy</span></a>I<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontrybutorzy</span></a>I<a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencja</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Strona</span></a>I<a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Kod Źródłowy</span></a>I<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontrybutorzy</span></a>I<a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencja</span></a></p></body></html> @@ -409,7 +409,7 @@ To zbanuje jego/jej nick na forum, oraz jego/jej adres IP. - Mii Edit + Mii Editor @@ -6111,7 +6111,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 95525595c..75f62f5c9 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Site</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Código-fonte</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Colaboradores</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Site</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Código-fonte</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Colaboradores</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> @@ -409,7 +409,7 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. - Mii Edit + Mii Editor Editar Mii @@ -6169,7 +6169,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLCs. - Mii Edit Applet + Mii Editor Applet Miniaplicativo Editor de Mii diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 0ccf7654e..2754b99b9 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - Site | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Código fonte | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + Site | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Código fonte | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> @@ -409,7 +409,7 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. - Mii Edit + Mii Editor Editar Mii @@ -6152,7 +6152,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLC. - Mii Edit Applet + Mii Editor Applet Applet Editor de Miis diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 19bcb75c8..ca7239691 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Исходный код</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Контрибьюторы</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Лицензия</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Исходный код</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Контрибьюторы</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Лицензия</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor Mii редактор @@ -6165,8 +6165,8 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet - Mii Edit Applet + Mii Editor Applet + Mii Editor Applet diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 3bca755ab..9a05c255a 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Hemsida</span></a>I<a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Källkod</span></a>I<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsgivare</span></a>I<a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Hemsida</span></a>I<a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Källkod</span></a>I<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsgivare</span></a>I<a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> @@ -409,7 +409,7 @@ Detta kommer bannlysa både dennes användarnamn på forum samt IP-adress. - Mii Edit + Mii Editor @@ -6090,7 +6090,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index b04dce1c6..d39a0ea30 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a>|<a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Kaynak Kodu</span></a>|<a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Katkıda Bulunanlar</span></a>|<a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisans</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a>|<a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Kaynak Kodu</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Katkıda Bulunanlar</span></a>|<a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisans</span></a></p></body></html> @@ -409,7 +409,7 @@ Bu işlem onların hem forum kullanıcı adını hem de IP adresini banlar. - Mii Edit + Mii Editor @@ -6112,7 +6112,7 @@ Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 7a654eb2a..314c0c41f 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Першокод</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Вкладники</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Ліцензія</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Першокод</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Вкладники</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Ліцензія</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6124,7 +6124,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 48ac970e2..f99ccd9fa 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Người đóng góp</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Người đóng góp</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> @@ -409,7 +409,7 @@ Việc này sẽ ban tên người dùng trên diễn đàn và IP của họ lu - Mii Edit + Mii Editor @@ -6117,7 +6117,7 @@ Vui lòng, chỉ sử dụng tính năng này để cài đặt các bản cập - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 9041fa7d6..3e975139c 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Đóng góp</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Đóng góp</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6117,7 +6117,7 @@ Vui lòng, chỉ sử dụng tính năng này để cài các bản cập nhật - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 6ce517c4e..336fc9af1 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">官方网站</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">源代码</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">贡献者</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">许可证</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">官方网站</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">源代码</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">贡献者</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">许可证</span></a></p></body></html> @@ -409,8 +409,8 @@ This would ban both their forum username and their IP address. - Mii Edit - Mii Edit + Mii Editor + Mii Editor @@ -6165,8 +6165,8 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet - Mii Edit 小程序 + Mii Editor Applet + Mii Editor 小程序 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index c21c27797..6842cf9ec 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">官網</span></a> | <a href="https://github.com/citron-emu"><span style=" text-decoration: underline; color:#039be5;">原始碼</span></a> | <a href="https://github.com/citron-emu/citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢獻者</span></a> | <a href="https://github.com/citron-emu/citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">許可證</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://citron-emu.org/"><span style=" text-decoration: underline; color:#039be5;">官網</span></a> | <a href="https://git.citron-emu.org"><span style=" text-decoration: underline; color:#039be5;">原始碼</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢獻者</span></a> | <a href="https://git.citron-emu.org/Citron/Citron/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">許可證</span></a></p></body></html> @@ -409,8 +409,8 @@ This would ban both their forum username and their IP address. - Mii Edit - Mii Edit + Mii Editor + Mii Editor @@ -6161,7 +6161,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii 編輯器小程式 diff --git a/dist/org.citron_emu.citron.desktop b/dist/org.citron_emu.citron.desktop index dc1b1d506..dd4bdab28 100644 --- a/dist/org.citron_emu.citron.desktop +++ b/dist/org.citron_emu.citron.desktop @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later [Desktop Entry] diff --git a/dist/org.citron_emu.citron.metainfo.xml b/dist/org.citron_emu.citron.metainfo.xml index 53bd6f79a..83690eae2 100644 --- a/dist/org.citron_emu.citron.metainfo.xml +++ b/dist/org.citron_emu.citron.metainfo.xml @@ -1,7 +1,7 @@ @@ -25,13 +25,13 @@ SPDX-License-Identifier: CC0-1.0 emulator https://citron-emu.org/ - https://github.com/citron-emu/citron/issues + https://git.citron-emu.org/Citron/Citron/issues https://citron-emu.org/wiki/faq/ https://citron-emu.org/wiki/home/ https://citron-emu.org/donate/ https://www.transifex.com/projects/p/citron https://community.citra-emu.org/ - https://github.com/citron-emu/citron + https://git.citron-emu.org/Citron/Citron https://citron-emu.org/wiki/contributing/ org.citron_emu.citron.desktop diff --git a/dist/org.citron_emu.citron.xml b/dist/org.citron_emu.citron.xml index d5891b7cf..eefe13de6 100644 --- a/dist/org.citron_emu.citron.xml +++ b/dist/org.citron_emu.citron.xml @@ -1,7 +1,7 @@ diff --git a/dist/qt_themes/colorful/style.qrc b/dist/qt_themes/colorful/style.qrc index e63ae3c5d..82cd367be 100644 --- a/dist/qt_themes/colorful/style.qrc +++ b/dist/qt_themes/colorful/style.qrc @@ -1,5 +1,5 @@ diff --git a/dist/qt_themes/colorful_dark/style.qrc b/dist/qt_themes/colorful_dark/style.qrc index ed8e3ad25..72451ef02 100644 --- a/dist/qt_themes/colorful_dark/style.qrc +++ b/dist/qt_themes/colorful_dark/style.qrc @@ -1,5 +1,5 @@ diff --git a/dist/qt_themes/colorful_midnight_blue/style.qrc b/dist/qt_themes/colorful_midnight_blue/style.qrc index 8220d9a43..b9821c672 100644 --- a/dist/qt_themes/colorful_midnight_blue/style.qrc +++ b/dist/qt_themes/colorful_midnight_blue/style.qrc @@ -1,5 +1,5 @@ diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc index 7b2c56c2d..c0c1ba4a5 100644 --- a/dist/qt_themes/default/default.qrc +++ b/dist/qt_themes/default/default.qrc @@ -1,5 +1,5 @@ diff --git a/dist/qt_themes/default/icons/256x256/citron.png b/dist/qt_themes/default/icons/256x256/citron.png index 238adeb89..fc4f080a6 100644 Binary files a/dist/qt_themes/default/icons/256x256/citron.png and b/dist/qt_themes/default/icons/256x256/citron.png differ diff --git a/dist/qt_themes/default_dark/style.qrc b/dist/qt_themes/default_dark/style.qrc index cc5ffbcf8..7de4737c2 100644 --- a/dist/qt_themes/default_dark/style.qrc +++ b/dist/qt_themes/default_dark/style.qrc @@ -1,5 +1,5 @@ diff --git a/dist/qt_themes/default_dark/style.qss b/dist/qt_themes/default_dark/style.qss index ccb99ab63..ca6daa2d5 100644 --- a/dist/qt_themes/default_dark/style.qss +++ b/dist/qt_themes/default_dark/style.qss @@ -1,5 +1,5 @@ /* -* SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +* SPDX-FileCopyrightText: 2018 yuzu Emulator Project * SPDX-License-Identifier: GPL-2.0-or-later */ QAbstractSpinBox { diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index a9b026c04..117683423 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Dynarmic has cmake_minimum_required(3.12) and we may want to override diff --git a/externals/SDL b/externals/SDL index cc016b004..2359383fc 160000 --- a/externals/SDL +++ b/externals/SDL @@ -1 +1 @@ -Subproject commit cc016b0046d563287f0aa9f09b958b5e70d43696 +Subproject commit 2359383fc187386204c3bb22de89655a494cd128 diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers index d4a196d8c..e2e53a724 160000 --- a/externals/Vulkan-Headers +++ b/externals/Vulkan-Headers @@ -1 +1 @@ -Subproject commit d4a196d8c84e032d27f999adcea3075517c1c97f +Subproject commit e2e53a724677f6eba8ff0ce1ccb64ee321785cbd diff --git a/externals/Vulkan-Utility-Libraries b/externals/Vulkan-Utility-Libraries index 5a88b6042..4e246c56e 160000 --- a/externals/Vulkan-Utility-Libraries +++ b/externals/Vulkan-Utility-Libraries @@ -1 +1 @@ -Subproject commit 5a88b6042edb8f03eefc8de73bd73a899989373f +Subproject commit 4e246c56ec5afb5ad66b9b04374d39ac04675c8e diff --git a/externals/VulkanMemoryAllocator b/externals/VulkanMemoryAllocator index 3bab69249..539c0a8d8 160000 --- a/externals/VulkanMemoryAllocator +++ b/externals/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit 3bab6924988e5f19bf36586a496156cf72f70d9f +Subproject commit 539c0a8d8e3733c9f25ea9a184c85c77504f1653 diff --git a/externals/cpp-httplib b/externals/cpp-httplib index a609330e4..39a64fb4e 160000 --- a/externals/cpp-httplib +++ b/externals/cpp-httplib @@ -1 +1 @@ -Subproject commit a609330e4c6374f741d3b369269f7848255e1954 +Subproject commit 39a64fb4e7e42216f14f0ec51ccc5fa85e651432 diff --git a/externals/cpp-jwt b/externals/cpp-jwt index 10ef5735d..4a970bc30 160000 --- a/externals/cpp-jwt +++ b/externals/cpp-jwt @@ -1 +1 @@ -Subproject commit 10ef5735d842b31025f1257ae78899f50a40fb14 +Subproject commit 4a970bc302d671476122cbc6b43cc89fbf4a96ec diff --git a/externals/enet b/externals/enet index 39a72ab19..657eaf97d 160000 --- a/externals/enet +++ b/externals/enet @@ -1 +1 @@ -Subproject commit 39a72ab1990014eb399cee9d538fd529df99c6a0 +Subproject commit 657eaf97d9d335917c58484a4a4b5e03838ebd8e diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index cb3471c36..790f7c8de 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2021 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later if (NOT WIN32 AND NOT ANDROID) diff --git a/externals/ffmpeg/ffmpeg b/externals/ffmpeg/ffmpeg index 9c1294ead..99e2af4e7 160000 --- a/externals/ffmpeg/ffmpeg +++ b/externals/ffmpeg/ffmpeg @@ -1 +1 @@ -Subproject commit 9c1294eaddb88cb0e044c675ccae059a85fc9c6c +Subproject commit 99e2af4e7837ca09b97d93a562dc12947179fc48 diff --git a/externals/libadrenotools b/externals/libadrenotools index 5cd3f5c5c..8fae8ce25 160000 --- a/externals/libadrenotools +++ b/externals/libadrenotools @@ -1 +1 @@ -Subproject commit 5cd3f5c5ceea6d9e9d435ccdd922d9b99e55d10b +Subproject commit 8fae8ce254dfc1344527e05301e43f37dea2df80 diff --git a/externals/libusb/CMakeLists.txt b/externals/libusb/CMakeLists.txt index c0a23c998..1d50c9f8c 100644 --- a/externals/libusb/CMakeLists.txt +++ b/externals/libusb/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2020 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2020 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE) diff --git a/externals/libusb/config.h.in b/externals/libusb/config.h.in index 5cf076a03..42ae5a5e8 100644 --- a/externals/libusb/config.h.in +++ b/externals/libusb/config.h.in @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020 yuzu Emulator Project & 2025 citron Homebrew Project + * SPDX-FileCopyrightText: 2020 yuzu Emulator Project * SPDX-License-Identifier: GPL-2.0-or-later */ diff --git a/externals/libusb/libusb b/externals/libusb/libusb index c060e9ce3..de38189e8 160000 --- a/externals/libusb/libusb +++ b/externals/libusb/libusb @@ -1 +1 @@ -Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7 +Subproject commit de38189e8014fa393f4d8c1d9d3fdf5e2a95899d diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt index 8bca08083..9fe251c1d 100644 --- a/externals/nx_tzdb/CMakeLists.txt +++ b/externals/nx_tzdb/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") diff --git a/externals/nx_tzdb/ListFilesInDirectory.cmake b/externals/nx_tzdb/ListFilesInDirectory.cmake index 634f7aea0..35a9e726a 100644 --- a/externals/nx_tzdb/ListFilesInDirectory.cmake +++ b/externals/nx_tzdb/ListFilesInDirectory.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # CMake does not have a way to list the files in a specific directory, diff --git a/externals/nx_tzdb/NxTzdbCreateHeader.cmake b/externals/nx_tzdb/NxTzdbCreateHeader.cmake index 6eb02cc72..95606d862 100644 --- a/externals/nx_tzdb/NxTzdbCreateHeader.cmake +++ b/externals/nx_tzdb/NxTzdbCreateHeader.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later set(ZONE_PATH ${CMAKE_ARGV3}) diff --git a/externals/nx_tzdb/include/nx_tzdb.h b/externals/nx_tzdb/include/nx_tzdb.h index 5cef8d701..1f7c6069a 100644 --- a/externals/nx_tzdb/include/nx_tzdb.h +++ b/externals/nx_tzdb/include/nx_tzdb.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/externals/nx_tzdb/tzdb_template.h.in b/externals/nx_tzdb/tzdb_template.h.in index 26e69d6d8..289d002ea 100644 --- a/externals/nx_tzdb/tzdb_template.h.in +++ b/externals/nx_tzdb/tzdb_template.h.in @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/externals/oaknut b/externals/oaknut index 9d091109d..94c726ce0 160000 --- a/externals/oaknut +++ b/externals/oaknut @@ -1 +1 @@ -Subproject commit 9d091109deb445bc6e9289c6195a282b7c993d49 +Subproject commit 94c726ce0338b054eb8cb5ea91de8fe6c19f4392 diff --git a/externals/opus b/externals/opus index 101a71e03..734aed05d 160000 --- a/externals/opus +++ b/externals/opus @@ -1 +1 @@ -Subproject commit 101a71e03bbf860aaafb7090a0e440675cb27660 +Subproject commit 734aed05d09af3d2690f8cb5aafa97f052746daf diff --git a/externals/simpleini b/externals/simpleini index 382ddbb4b..6048871ea 160000 --- a/externals/simpleini +++ b/externals/simpleini @@ -1 +1 @@ -Subproject commit 382ddbb4b92c0b26aa1b32cefba2002119a5b1f2 +Subproject commit 6048871ea9ee0ec24be5bd099d161a10567d7dc2 diff --git a/externals/tz/tz/tz.cpp b/externals/tz/tz/tz.cpp index 729a14e47..04fa6cc8a 100644 --- a/externals/tz/tz/tz.cpp +++ b/externals/tz/tz/tz.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 1996 Arthur David Olson // SPDX-License-Identifier: BSD-2-Clause diff --git a/externals/tz/tz/tz.h b/externals/tz/tz/tz.h index d4dac33a7..dae4459bc 100644 --- a/externals/tz/tz/tz.h +++ b/externals/tz/tz/tz.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 1996 Arthur David Olson // SPDX-License-Identifier: BSD-2-Clause diff --git a/externals/vcpkg b/externals/vcpkg index a42af01b7..96d5fb3de 160000 --- a/externals/vcpkg +++ b/externals/vcpkg @@ -1 +1 @@ -Subproject commit a42af01b72c28a8e1d7b48107b33e4f286a55ef6 +Subproject commit 96d5fb3de135b86d7222c53f2352ca92827a156b diff --git a/hooks/pre-commit b/hooks/pre-commit index 2ae0d36a4..855af6dca 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,6 +1,6 @@ #!/bin/sh -# SPDX-FileCopyrightText: 2015 Citra Emulator Project & 2025 Citron Homebrew Project +# SPDX-FileCopyrightText: 2015 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Enforce citron's whitespace policy diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0effad625..6f57af126 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Enable modules to include each other's files diff --git a/src/android/.gitignore b/src/android/.gitignore index a9745be18..ff7121acd 100644 --- a/src/android/.gitignore +++ b/src/android/.gitignore @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # Built application files diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 4965b9564..b0537f50c 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later import android.annotation.SuppressLint @@ -27,20 +28,20 @@ val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toIn android { namespace = "org.citron.citron_emu" - compileSdkVersion = "android-34" - ndkVersion = "26.1.10909125" + compileSdkVersion = "android-35" + ndkVersion = "29.0.13113456 rc1" // "26.1.10909125" buildFeatures { viewBinding = true } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } packaging { @@ -56,7 +57,8 @@ android { // TODO If this is ever modified, change application_id in strings.xml applicationId = "org.citron.citron_emu" minSdk = 30 - targetSdk = 34 + //noinspection EditedTargetSdkVersion + targetSdk = 35 versionName = getGitVersion() versionCode = if (System.getenv("AUTO_VERSIONED") == "true") { @@ -103,11 +105,14 @@ android { signingConfigs.getByName("default") } - resValue("string", "app_name_suffixed", "citron") + resValue("string", "app_name_suffixed", "Citron") + isDefault = true isMinifyEnabled = true + isShrinkResources = true + isJniDebuggable = false isDebuggable = false proguardFiles( - getDefaultProguardFile("proguard-android.txt"), + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } @@ -115,13 +120,11 @@ android { // builds a release build that doesn't need signing // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. register("relWithDebInfo") { - isDefault = true - resValue("string", "app_name_suffixed", "citron Debug Release") + resValue("string", "app_name_suffixed", "Citron Debug Release") signingConfig = signingConfigs.getByName("default") - isMinifyEnabled = true isDebuggable = true proguardFiles( - getDefaultProguardFile("proguard-android.txt"), + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) versionNameSuffix = "-relWithDebInfo" @@ -133,7 +136,7 @@ android { // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. debug { signingConfig = signingConfigs.getByName("default") - resValue("string", "app_name_suffixed", "citron Debug") + resValue("string", "app_name_suffixed", "Citron Debug") isDebuggable = true isJniDebuggable = true versionNameSuffix = "-debug" @@ -146,7 +149,7 @@ android { create("mainline") { isDefault = true dimension = "version" - buildConfigField("Boolean", "PREMIUM", "false") + buildConfigField("Boolean", "PREMIUM", "true") } create("ea") { @@ -158,7 +161,7 @@ android { externalNativeBuild { cmake { - version = "3.22.1" + version = "4.0.1" path = file("../../../CMakeLists.txt") } } @@ -175,10 +178,12 @@ android { "-DCITRON_USE_BUNDLED_VCPKG=ON", "-DCITRON_USE_BUNDLED_FFMPEG=ON", "-DCITRON_ENABLE_LTO=ON", - "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON" + "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", + "-DCMAKE_POLICY_VERSION_MINIMUM=3.5" ) - abiFilters("arm64-v8a", "x86_64") + abiFilters("arm64-v8a") // , "x86_64") } } } @@ -191,7 +196,7 @@ tasks.create("ktlintReset") { val showFormatHelp = { logger.lifecycle( "If this check fails, please try running \"gradlew ktlintFormat\" for automatic " + - "codestyle fixes" + "codestyle fixes" ) } tasks.getByPath("ktlintKotlinScriptCheck").doFirst { showFormatHelp.invoke() } @@ -236,7 +241,6 @@ dependencies { implementation("io.coil-kt:coil:2.2.2") implementation("androidx.core:core-splashscreen:1.0.1") implementation("androidx.window:window:1.2.0-beta03") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.navigation:navigation-fragment-ktx:2.7.4") implementation("androidx.navigation:navigation-ui-ktx:2.7.4") diff --git a/src/android/app/proguard-rules.pro b/src/android/app/proguard-rules.pro index 228daf8e5..6b1a4a2e5 100644 --- a/src/android/app/proguard-rules.pro +++ b/src/android/app/proguard-rules.pro @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # To get usable stack traces @@ -22,3 +22,10 @@ -dontwarn java.beans.Introspector -dontwarn java.beans.VetoableChangeListener -dontwarn java.beans.VetoableChangeSupport + +# LicenseVerifier protection +-keep class org.citron.citron_emu.utils.LicenseVerifier { *; } +-keepnames class org.citron.citron_emu.utils.LicenseVerifier +-dontskipnonpubliclibraryclasses +-dontoptimize +-dontpreverify diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index fb9243079..e58b93ddd 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ @@ -14,6 +14,7 @@ SPDX-License-Identifier: GPL-3.0-or-later + { + val interfaceList = mutableListOf() + try { + NetworkInterface.getNetworkInterfaces()?.toList()?.forEach { iface -> + if (iface.isUp && !iface.isLoopback) { + iface.inetAddresses.toList() + .filterNot { it.isLoopbackAddress } + .forEach { addr -> + interfaceList.add("${iface.name};${addr.hostAddress}") + } + } + } + } catch (e: Exception) { + Log.error("[NativeLibrary] Failed to enumerate network interfaces: ${e.message}") + } + + // Always ensure we have at least a loopback interface + if (interfaceList.isEmpty()) { + Log.warning("[NativeLibrary] No interfaces found, adding loopback fallback") + interfaceList.add("lo;127.0.0.1") + } + + return interfaceList.toTypedArray() + } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt index 5dfee80c0..c4c2c1ed1 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt @@ -1,9 +1,10 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.activities import android.annotation.SuppressLint +import android.app.AlertDialog import android.app.PendingIntent import android.app.PictureInPictureParams import android.app.RemoteAction @@ -39,12 +40,14 @@ import org.citron.citron_emu.NativeLibrary import org.citron.citron_emu.R import org.citron.citron_emu.CitronApplication import org.citron.citron_emu.databinding.ActivityEmulationBinding +import org.citron.citron_emu.dialogs.NetPlayDialog import org.citron.citron_emu.features.input.NativeInput import org.citron.citron_emu.features.settings.model.BooleanSetting import org.citron.citron_emu.features.settings.model.IntSetting import org.citron.citron_emu.features.settings.model.Settings import org.citron.citron_emu.model.EmulationViewModel import org.citron.citron_emu.model.Game +import org.citron.citron_emu.network.NetPlayManager import org.citron.citron_emu.utils.InputHandler import org.citron.citron_emu.utils.Log import org.citron.citron_emu.utils.MemoryUtil @@ -52,6 +55,7 @@ import org.citron.citron_emu.utils.NativeConfig import org.citron.citron_emu.utils.NfcReader import org.citron.citron_emu.utils.ParamPackage import org.citron.citron_emu.utils.ThemeHelper +import org.citron.citron_emu.utils.LicenseVerifier import java.text.NumberFormat import kotlin.math.roundToInt @@ -79,6 +83,22 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { super.onCreate(savedInstanceState) + // Check if firmware is available + if (!NativeLibrary.isFirmwareAvailable()) { + AlertDialog.Builder(this) + .setTitle(R.string.firmware_missing_title) + .setMessage(R.string.firmware_missing_message) + .setPositiveButton(R.string.ok) { _, _ -> + finish() + } + .setCancelable(false) + .show() + return + } + + // Add license verification at the start + LicenseVerifier.verifyLicense(this) + InputHandler.updateControllerData() val players = NativeConfig.getInputSettings(true) var hasConfiguredControllers = false @@ -405,6 +425,16 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { setPictureInPictureParams(pictureInPictureParamsBuilder.build()) } + fun displayMultiplayerDialog() { + val dialog = NetPlayDialog(this) + dialog.show() + } + + fun addNetPlayMessages(type: Int, msg: String) { + NetPlayManager.addNetPlayMessage(type, msg) + } + + private var pictureInPictureReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { if (intent.action == actionPlay) { diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractDiffAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractDiffAdapter.kt index aa78fa3a3..9d45971db 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractDiffAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractDiffAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractListAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractListAdapter.kt index 01cd974bf..aed3fb569 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractListAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractListAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractSingleSelectionList.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractSingleSelectionList.kt index ade634177..965b28f98 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractSingleSelectionList.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AbstractSingleSelectionList.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AddonAdapter.kt index c0260ccea..29c9113f7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AppletAdapter.kt index 19b6978f4..57d222713 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/AppletAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/CabinetLauncherDialogAdapter.kt index 6c8b952f7..16254670c 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/DriverAdapter.kt index a5362c668..2d59efefc 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/DriverAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/FolderAdapter.kt index b0af974ce..450f6171f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/FolderAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/GameAdapter.kt index 2a568b4ab..9adf45c14 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/GameAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/GamePropertiesAdapter.kt index 3e6bae380..cf504dca8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/GamePropertiesAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/HomeSettingAdapter.kt index 89a612233..0cb7944a4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/HomeSettingAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/InstallableAdapter.kt index bfa173f9c..c136c3e92 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/InstallableAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/LicenseAdapter.kt index ee30b5075..6af14c5b8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/LicenseAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters diff --git a/src/android/app/src/main/java/org/citron/citron_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/adapters/SetupAdapter.kt index 0fe2443b7..5c4f51f64 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/adapters/SetupAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.adapters @@ -31,7 +31,7 @@ class SetupAdapter(val activity: AppCompatActivity, pages: List) : override fun bind(model: SetupPage) { if (model.stepCompleted.invoke() == StepState.COMPLETE) { binding.buttonAction.setVisible(visible = false, gone = false) - binding.textConfirmation.setVisible(true) + binding.textConfirmation?.setVisible(true) } binding.icon.setImageDrawable( @@ -68,7 +68,7 @@ class SetupAdapter(val activity: AppCompatActivity, pages: List) : override fun onStepCompleted() { ViewUtils.hideView(binding.buttonAction, 200) - ViewUtils.showView(binding.textConfirmation, 200) + binding.textConfirmation?.let { ViewUtils.showView(it, 200) } ViewModelProvider(activity)[HomeViewModel::class.java].setShouldPageForward(true) } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/SoftwareKeyboard.kt index 31c8e0845..517695a45 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/SoftwareKeyboard.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.applets.keyboard diff --git a/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/ui/KeyboardDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/ui/KeyboardDialogFragment.kt index c775a86dc..31b61cd0b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/ui/KeyboardDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/applets/keyboard/ui/KeyboardDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.applets.keyboard.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/dialogs/ChatDialog.kt b/src/android/app/src/main/java/org/citron/citron_emu/dialogs/ChatDialog.kt new file mode 100644 index 000000000..c3bce5676 --- /dev/null +++ b/src/android/app/src/main/java/org/citron/citron_emu/dialogs/ChatDialog.kt @@ -0,0 +1,133 @@ +package org.citron.citron_emu.dialogs + +import android.content.Context +import android.content.res.Configuration +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import org.citron.citron_emu.R +import org.citron.citron_emu.databinding.DialogChatBinding +import org.citron.citron_emu.databinding.ItemChatMessageBinding +import org.citron.citron_emu.network.NetPlayManager +import java.text.SimpleDateFormat +import java.util.* + +class ChatMessage( + val nickname: String, // This is the common name youll see on private servers + val username: String, // Username is the community/forum username + val message: String, + val timestamp: String = SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date()) +) { +} + +class ChatDialog(context: Context) : BottomSheetDialog(context) { + private lateinit var binding: DialogChatBinding + private lateinit var chatAdapter: ChatAdapter + private val handler = Handler(Looper.getMainLooper()) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DialogChatBinding.inflate(LayoutInflater.from(context)) + setContentView(binding.root) + + NetPlayManager.setChatOpen(true) + setupRecyclerView() + + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + + + handler.post { + chatAdapter.notifyDataSetChanged() + binding.chatRecyclerView.post { + scrollToBottom() + } + } + + NetPlayManager.setOnMessageReceivedListener { type, message -> + handler.post { + chatAdapter.notifyDataSetChanged() + scrollToBottom() + } + } + + binding.sendButton.setOnClickListener { + val message = binding.chatInput.text.toString() + if (message.isNotBlank()) { + sendMessage(message) + binding.chatInput.text?.clear() + } + } + } + + override fun dismiss() { + NetPlayManager.setChatOpen(false) + super.dismiss() + } + + private fun sendMessage(message: String) { + val username = NetPlayManager.getUsername(context) + NetPlayManager.netPlaySendMessage(message) + + val chatMessage = ChatMessage( + nickname = username, + username = "", + message = message, + timestamp = SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date()) + ) + + NetPlayManager.addChatMessage(chatMessage) + chatAdapter.notifyDataSetChanged() + scrollToBottom() + } + + private fun setupRecyclerView() { + chatAdapter = ChatAdapter(NetPlayManager.getChatMessages()) + binding.chatRecyclerView.layoutManager = LinearLayoutManager(context).apply { + stackFromEnd = true + } + binding.chatRecyclerView.adapter = chatAdapter + } + + private fun scrollToBottom() { + binding.chatRecyclerView.scrollToPosition(chatAdapter.itemCount - 1) + } +} + +class ChatAdapter(private val messages: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder { + val binding = ItemChatMessageBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + return ChatViewHolder(binding) + } + + override fun getItemCount(): Int = messages.size + + override fun onBindViewHolder(holder: ChatViewHolder, position: Int) { + holder.bind(messages[position]) + } + + inner class ChatViewHolder(private val binding: ItemChatMessageBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(message: ChatMessage) { + binding.usernameText.text = message.nickname + binding.messageText.text = message.message + binding.userIcon.setImageResource(when (message.nickname) { + "System" -> R.drawable.ic_system + else -> R.drawable.ic_user + }) + } + } +} diff --git a/src/android/app/src/main/java/org/citron/citron_emu/dialogs/NetPlayDialog.kt b/src/android/app/src/main/java/org/citron/citron_emu/dialogs/NetPlayDialog.kt new file mode 100644 index 000000000..13ba8360a --- /dev/null +++ b/src/android/app/src/main/java/org/citron/citron_emu/dialogs/NetPlayDialog.kt @@ -0,0 +1,397 @@ +// Copyright 2024 Mandarine Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citron.citron_emu.dialogs + +import android.content.Context +import org.citron.citron_emu.R +import android.content.res.Configuration +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.PopupMenu +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.citron.citron_emu.CitronApplication +import org.citron.citron_emu.databinding.DialogMultiplayerConnectBinding +import org.citron.citron_emu.databinding.DialogMultiplayerLobbyBinding +import org.citron.citron_emu.databinding.DialogMultiplayerRoomBinding +import org.citron.citron_emu.databinding.ItemBanListBinding +import org.citron.citron_emu.databinding.ItemButtonNetplayBinding +import org.citron.citron_emu.databinding.ItemTextNetplayBinding +import org.citron.citron_emu.utils.CompatUtils +import org.citron.citron_emu.network.NetPlayManager + +class NetPlayDialog(context: Context) : BottomSheetDialog(context) { + private lateinit var adapter: NetPlayAdapter + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + + when { + NetPlayManager.netPlayIsJoined() -> DialogMultiplayerLobbyBinding.inflate(layoutInflater) + .apply { + setContentView(root) + adapter = NetPlayAdapter() + listMultiplayer.layoutManager = LinearLayoutManager(context) + listMultiplayer.adapter = adapter + adapter.loadMultiplayerMenu() + btnLeave.setOnClickListener { + NetPlayManager.netPlayLeaveRoom() + dismiss() + } + btnChat.setOnClickListener { + ChatDialog(context).show() + } + + refreshAdapterItems() + + btnModeration.visibility = if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE + btnModeration.setOnClickListener { + showModerationDialog() + } + + } + else -> { + DialogMultiplayerConnectBinding.inflate(layoutInflater).apply { + setContentView(root) + btnCreate.setOnClickListener { + showNetPlayInputDialog(true) + dismiss() + } + btnJoin.setOnClickListener { + showNetPlayInputDialog(false) + dismiss() + } + } + } + } + } + + data class NetPlayItems( + val option: Int, + val name: String, + val type: Int, + val id: Int = 0 + ) { + companion object { + const val MULTIPLAYER_ROOM_TEXT = 1 + const val MULTIPLAYER_ROOM_MEMBER = 2 + const val MULTIPLAYER_SEPARATOR = 3 + const val MULTIPLAYER_ROOM_COUNT = 4 + const val TYPE_BUTTON = 0 + const val TYPE_TEXT = 1 + const val TYPE_SEPARATOR = 2 + } + } + + inner class NetPlayAdapter : RecyclerView.Adapter() { + val netPlayItems = mutableListOf() + + abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { + init { + itemView.setOnClickListener(this) + } + abstract fun bind(item: NetPlayItems) + } + + inner class TextViewHolder(private val binding: ItemTextNetplayBinding) : NetPlayViewHolder(binding.root) { + private lateinit var netPlayItem: NetPlayItems + + override fun onClick(clicked: View) {} + + override fun bind(item: NetPlayItems) { + netPlayItem = item + binding.itemTextNetplayName.text = item.name + binding.itemIcon.apply { + val iconRes = when (item.option) { + NetPlayItems.MULTIPLAYER_ROOM_TEXT -> R.drawable.ic_system + NetPlayItems.MULTIPLAYER_ROOM_COUNT -> R.drawable.ic_joined + else -> 0 + } + visibility = if (iconRes != 0) { + setImageResource(iconRes) + View.VISIBLE + } else View.GONE + } + } + } + + inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) : NetPlayViewHolder(binding.root) { + private lateinit var netPlayItems: NetPlayItems + private val isModerator = NetPlayManager.netPlayIsModerator() + + init { + binding.itemButtonMore.apply { + visibility = View.VISIBLE + setOnClickListener { showPopupMenu(it) } + } + } + + override fun onClick(clicked: View) {} + + + private fun showPopupMenu(view: View) { + PopupMenu(view.context, view).apply { + menuInflater.inflate(R.menu.menu_netplay_member, menu) + menu.findItem(R.id.action_kick).isEnabled = isModerator && + netPlayItems.name != NetPlayManager.getUsername(context) + menu.findItem(R.id.action_ban).isEnabled = isModerator && + netPlayItems.name != NetPlayManager.getUsername(context) + setOnMenuItemClickListener { item -> + if (item.itemId == R.id.action_kick) { + NetPlayManager.netPlayKickUser(netPlayItems.name) + true + } else if (item.itemId == R.id.action_ban) { + NetPlayManager.netPlayBanUser(netPlayItems.name) + true + } else false + } + show() + } + } + + override fun bind(item: NetPlayItems) { + netPlayItems = item + binding.itemButtonNetplayName.text = netPlayItems.name + } + } + + fun loadMultiplayerMenu() { + val infos = NetPlayManager.netPlayRoomInfo() + if (infos.isNotEmpty()) { + val roomInfo = infos[0].split("|") + netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_TEXT, roomInfo[0], NetPlayItems.TYPE_TEXT)) + netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_COUNT, "${infos.size - 1}/${roomInfo[1]}", NetPlayItems.TYPE_TEXT)) + netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_SEPARATOR, "", NetPlayItems.TYPE_SEPARATOR)) + for (i in 1 until infos.size) { + netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_MEMBER, infos[i], NetPlayItems.TYPE_BUTTON)) + } + } + } + + override fun getItemViewType(position: Int) = netPlayItems[position].type + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NetPlayViewHolder { + val inflater = LayoutInflater.from(parent.context) + return when (viewType) { + NetPlayItems.TYPE_TEXT -> TextViewHolder(ItemTextNetplayBinding.inflate(inflater, parent, false)) + NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(ItemButtonNetplayBinding.inflate(inflater, parent, false)) + NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(inflater.inflate(R.layout.item_separator_netplay, parent, false)) { + override fun bind(item: NetPlayItems) {} + override fun onClick(clicked: View) {} + } + else -> throw IllegalStateException("Unsupported view type") + } + } + + override fun onBindViewHolder(holder: NetPlayViewHolder, position: Int) { + holder.bind(netPlayItems[position]) + } + + override fun getItemCount() = netPlayItems.size + } + + fun refreshAdapterItems() { + val handler = Handler(Looper.getMainLooper()) + + NetPlayManager.setOnAdapterRefreshListener() { type, msg -> + handler.post { + adapter.netPlayItems.clear() + adapter.loadMultiplayerMenu() + adapter.notifyDataSetChanged() + } + } + } + + private fun showNetPlayInputDialog(isCreateRoom: Boolean) { + val activity = CompatUtils.findActivity(context) + val dialog = BottomSheetDialog(activity) + + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + + + val binding = DialogMultiplayerRoomBinding.inflate(LayoutInflater.from(activity)) + dialog.setContentView(binding.root) + + binding.textTitle.text = activity.getString( + if (isCreateRoom) R.string.multiplayer_create_room + else R.string.multiplayer_join_room + ) + + binding.ipAddress.setText( + if (isCreateRoom) NetPlayManager.getIpAddressByWifi(activity) + else NetPlayManager.getRoomAddress(activity) + ) + binding.ipPort.setText(NetPlayManager.getRoomPort(activity)) + binding.username.setText(NetPlayManager.getUsername(activity)) + + binding.roomName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE + binding.maxPlayersContainer.visibility = if (isCreateRoom) View.VISIBLE else View.GONE + binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, binding.maxPlayers.value.toInt()) + + binding.maxPlayers.addOnChangeListener { _, value, _ -> + binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, value.toInt()) + } + + binding.btnConfirm.setOnClickListener { + binding.btnConfirm.isEnabled = false + binding.btnConfirm.text = activity.getString(R.string.disabled_button_text) + + val ipAddress = binding.ipAddress.text.toString() + val username = binding.username.text.toString() + val portStr = binding.ipPort.text.toString() + val password = binding.password.text.toString() + val port = portStr.toIntOrNull() ?: run { + Toast.makeText(activity, R.string.multiplayer_port_invalid, Toast.LENGTH_LONG).show() + binding.btnConfirm.isEnabled = true + binding.btnConfirm.text = activity.getString(R.string.original_button_text) + return@setOnClickListener + } + val roomName = binding.roomName.text.toString() + val maxPlayers = binding.maxPlayers.value.toInt() + + if (isCreateRoom && (roomName.length !in 3..20)) { + Toast.makeText(activity, R.string.multiplayer_room_name_invalid, Toast.LENGTH_LONG).show() + binding.btnConfirm.isEnabled = true + binding.btnConfirm.text = activity.getString(R.string.original_button_text) + return@setOnClickListener + } + + if (ipAddress.length < 7 || username.length < 5) { + Toast.makeText(activity, R.string.multiplayer_input_invalid, Toast.LENGTH_LONG).show() + binding.btnConfirm.isEnabled = true + binding.btnConfirm.text = activity.getString(R.string.original_button_text) + } else { + Handler(Looper.getMainLooper()).post { + val result = if (isCreateRoom) { + NetPlayManager.netPlayCreateRoom(ipAddress, port, username, password, roomName, maxPlayers) + } else { + NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password) + } + + if (result == 0) { + NetPlayManager.setUsername(activity, username) + NetPlayManager.setRoomPort(activity, portStr) + if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress) + Toast.makeText( + CitronApplication.appContext, + if (isCreateRoom) R.string.multiplayer_create_room_success + else R.string.multiplayer_join_room_success, + Toast.LENGTH_LONG + ).show() + dialog.dismiss() + } else { + Toast.makeText(activity, R.string.multiplayer_could_not_connect, Toast.LENGTH_LONG).show() + binding.btnConfirm.isEnabled = true + binding.btnConfirm.text = activity.getString(R.string.original_button_text) + } + } + } + } + + dialog.show() + } + + private fun showModerationDialog() { + val activity = CompatUtils.findActivity(context) + val dialog = MaterialAlertDialogBuilder(activity) + dialog.setTitle(R.string.multiplayer_moderation_title) + + val banList = NetPlayManager.getBanList() + if (banList.isEmpty()) { + dialog.setMessage(R.string.multiplayer_no_bans) + dialog.setPositiveButton(R.string.ok, null) + dialog.show() + return + } + + val view = LayoutInflater.from(context).inflate(R.layout.dialog_ban_list, null) + val recyclerView = view.findViewById(R.id.ban_list_recycler) + recyclerView.layoutManager = LinearLayoutManager(context) + + lateinit var adapter: BanListAdapter + + val onUnban: (String) -> Unit = { bannedItem -> + MaterialAlertDialogBuilder(activity) + .setTitle(R.string.multiplayer_unban_title) + .setMessage(activity.getString(R.string.multiplayer_unban_message, bannedItem)) + .setPositiveButton(R.string.multiplayer_unban) { _, _ -> + NetPlayManager.netPlayUnbanUser(bannedItem) + adapter.removeBan(bannedItem) + } + .setNegativeButton(R.string.cancel, null) + .show() + } + + adapter = BanListAdapter(banList, onUnban) + recyclerView.adapter = adapter + + dialog.setView(view) + dialog.setPositiveButton(R.string.ok, null) + dialog.show() + } + + private class BanListAdapter( + banList: List, + private val onUnban: (String) -> Unit + ) : RecyclerView.Adapter() { + + private val usernameBans = banList.filter { !it.contains(".") }.toMutableList() + private val ipBans = banList.filter { it.contains(".") }.toMutableList() + + class ViewHolder(val binding: ItemBanListBinding) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = ItemBanListBinding.inflate( + LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val isUsername = position < usernameBans.size + val item = if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size] + + holder.binding.apply { + banText.text = item + icon.setImageResource(if (isUsername) R.drawable.ic_user else R.drawable.ic_ip) + btnUnban.setOnClickListener { onUnban(item) } + } + } + + override fun getItemCount() = usernameBans.size + ipBans.size + + fun removeBan(bannedItem: String) { + val position = if (bannedItem.contains(".")) { + ipBans.indexOf(bannedItem).let { if (it >= 0) it + usernameBans.size else it } + } else { + usernameBans.indexOf(bannedItem) + } + + if (position >= 0) { + if (bannedItem.contains(".")) { + ipBans.remove(bannedItem) + } else { + usernameBans.remove(bannedItem) + } + notifyItemRemoved(position) + } + } + + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citron/citron_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/org/citron/citron_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 68fa86530..0ce5a1841 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.disk_shader_cache diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/DocumentProvider.kt index b42169654..980fe1975 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/DocumentProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: MPL-2.0 diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronInputDevice.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronInputDevice.kt index b164503e3..14ff2dcc3 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronInputDevice.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronInputDevice.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronVibrator.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronVibrator.kt index c746260de..c4f86595b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronVibrator.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/CitronVibrator.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/NativeInput.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/NativeInput.kt index d847bdc47..a64590484 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/NativeInput.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/NativeInput.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/AnalogDirection.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/AnalogDirection.kt index 8728ed470..97b834ad3 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/AnalogDirection.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/AnalogDirection.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/ButtonName.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/ButtonName.kt index fbaeb05b3..a91c11869 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/ButtonName.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/ButtonName.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/InputType.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/InputType.kt index d073cfe54..7d97d1a51 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/InputType.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/InputType.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeAnalog.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeAnalog.kt index dda57408f..daafb0291 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeAnalog.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeAnalog.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeButton.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeButton.kt index 380c30faf..2ab3cf30b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeButton.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeButton.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeTrigger.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeTrigger.kt index fd53ecf82..9b3392b26 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeTrigger.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NativeTrigger.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NpadStyleIndex.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NpadStyleIndex.kt index c518a9e29..16127d79a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NpadStyleIndex.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/NpadStyleIndex.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/PlayerInput.kt index 2c905c9b7..26b0e382d 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/PlayerInput.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/input/model/PlayerInput.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.input.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractBooleanSetting.kt index a2f98f88e..df03f5fe7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractByteSetting.kt index 1d2997bdb..63c5dcc5e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractFloatSetting.kt index 62d54bab8..376405419 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractIntSetting.kt index a95a64ebc..ee112d570 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractIntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractLongSetting.kt index 7cbab013e..9e10dd016 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractLongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractSetting.kt index 664ac4af6..dfbac1dfd 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractShortSetting.kt index fb428f2a2..219b6ebba 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractStringSetting.kt index 5c3d5155d..32fbc3737 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/AbstractStringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/BooleanSetting.kt index 776d08101..1297b6852 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/BooleanSetting.kt @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 Citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model @@ -17,6 +18,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"), RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), RENDERER_DEBUG("debug"), + RENDERER_ENHANCED_SHADER_BUILDING("use_enhanced_shader_building"), PICTURE_IN_PICTURE("picture_in_picture"), USE_CUSTOM_RTC("custom_rtc_enabled"), BLACK_BACKGROUNDS("black_backgrounds"), @@ -26,7 +28,9 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"), SHOW_INPUT_OVERLAY("show_input_overlay"), TOUCHSCREEN("touchscreen"), - SHOW_THERMAL_OVERLAY("show_thermal_overlay"); + SHOW_THERMAL_OVERLAY("show_thermal_overlay"), + SHOW_RAM_OVERLAY("show_ram_overlay"), + USE_AUTO_STUB("use_auto_stub"); override fun getBoolean(needsGlobal: Boolean): Boolean = NativeConfig.getBoolean(key, needsGlobal) diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ByteSetting.kt index 3f31bd606..984eb5cd4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt index 343fc2782..b2d7d8b2b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt index 7d059bc35..f1cf5df75 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/LongSetting.kt index 65e8dca72..994decb60 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/LongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/Settings.kt index 8a4e66dca..7ae4a7c00 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/Settings.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ShortSetting.kt index c12456e8f..721f8cb76 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/ShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/StringSetting.kt index 0a879f5f9..34379e445 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/StringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/AnalogInputSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/AnalogInputSetting.kt index 626744b26..0e8fce32f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/AnalogInputSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/AnalogInputSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ButtonInputSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ButtonInputSetting.kt index ee9cce937..4d3cec898 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ButtonInputSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ButtonInputSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/DateTimeSetting.kt index de41abbdb..89779e566 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/HeaderSetting.kt index e91a3b05b..cff7d0128 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/HeaderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputProfileSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputProfileSetting.kt index 3fb9ed7bf..cc78ad399 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputProfileSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputProfileSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputSetting.kt index 6c6dc0e7c..0210e4b11 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/InputSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/IntSingleChoiceSetting.kt index d23925870..1dcaab7b2 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ModifierInputSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ModifierInputSetting.kt index a768df7b8..856e1ccf4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ModifierInputSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/ModifierInputSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/RunnableSetting.kt index 2b90378ea..dee8e7bc4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/RunnableSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt index fea45965a..8a0b12f14 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view @@ -386,6 +386,14 @@ abstract class SettingsItem( override fun reset() = setBoolean(defaultValue) } put(SwitchSetting(fastmem, R.string.fastmem)) + + put( + SwitchSetting( + BooleanSetting.USE_AUTO_STUB, + titleId = R.string.use_auto_stub, + descriptionId = R.string.use_auto_stub_description + ) + ) } } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SingleChoiceSetting.kt index 468d85b34..2a01aa52d 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt index 2916ba1e7..6d7f079da 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringInputSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringInputSetting.kt index 645b958c4..c22a22f9e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringInputSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringInputSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringSingleChoiceSetting.kt index c12aae307..91744a558 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SubmenuSetting.kt index 9d03914b0..c19140c30 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SwitchSetting.kt index 5a18f9aac..dd6947c6b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SwitchSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputDialogFragment.kt index 18652ff75..584d71174 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileAdapter.kt index dda8a8a90..b911c6632 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileDialogFragment.kt index 236f6b77b..2f68c2430 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/InputProfileDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/NewInputProfileDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/NewInputProfileDialogFragment.kt index 11e020e02..45dafc3b1 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/NewInputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/NewInputProfileDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsActivity.kt index 0c6eaf9c6..cece76e69 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsAdapter.kt index e4066897a..0f060c478 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsDialogFragment.kt index 4e8fd7b57..d10856e30 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragment.kt index 9105c645b..7323f114b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt index d4ef0486d..763bf8c35 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui @@ -158,6 +158,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key) add(ShortSetting.RENDERER_SPEED_LIMIT.key) add(BooleanSetting.USE_DOCKED_MODE.key) + add(BooleanSetting.USE_AUTO_STUB.key) add(IntSetting.REGION_INDEX.key) add(IntSetting.LANGUAGE_INDEX.key) add(BooleanSetting.USE_CUSTOM_RTC.key) diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsSearchFragment.kt index 9f89e707a..2f28ca765 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsViewModel.kt index e3bc9b6f0..d6256512d 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index 03352f90c..af2a5233a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index dfb04089f..c4bbac824 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt index f8ddf93b1..88d53cac3 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputViewHolder.kt index beff9441b..5704bccae 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/InputViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index b6ac6cdf5..cf82be211 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SettingViewHolder.kt index a481c06af..dcf077ac8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index a8b457978..8a59b4d29 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SliderViewHolder.kt index 5400ea0b3..ed7a9ac7f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/StringInputViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/StringInputViewHolder.kt index c286e92db..e4dbf85d5 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/StringInputViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/StringInputViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index 961726586..90f25b8ab 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index 4077fe2b0..1879b6208 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/utils/SettingsFile.kt index 76851f23c..6d8a83dd8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/utils/SettingsFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.features.settings.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AboutFragment.kt index 80e916c4b..1bb7c8583 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AboutFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddGameFolderDialogFragment.kt index 774038023..fbeb2177b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddonsFragment.kt index 59416f203..22a66892b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AppletLauncherFragment.kt index dcde69f14..c53395b57 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/AppletLauncherFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/CabinetLauncherDialogFragment.kt index 28b79cdd5..ce4f3f6be 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ContentTypeSelectionDialogFragment.kt index 7c6fead5a..4ca7c05bb 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/CoreErrorDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/CoreErrorDialogFragment.kt index 4c48a2316..1b1de4994 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/CoreErrorDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/CoreErrorDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriverManagerFragment.kt index ea7167800..78b50ccab 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriverManagerFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriversLoadingDialogFragment.kt index e7893c45f..dae4ee968 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EarlyAccessFragment.kt index 32a472851..8351b84ea 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EarlyAccessFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt index aa255a942..68b4166ee 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 Citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments @@ -7,10 +8,15 @@ import android.annotation.SuppressLint import android.app.AlertDialog import android.content.Context import android.content.DialogInterface +import android.content.Intent +import android.content.IntentFilter import android.content.pm.ActivityInfo import android.content.res.Configuration +import android.graphics.Color import android.net.Uri +import android.os.BatteryManager import android.os.Bundle +import android.os.Debug import android.os.Handler import android.os.Looper import android.os.PowerManager @@ -65,6 +71,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private var emulationActivity: EmulationActivity? = null private var perfStatsUpdater: (() -> Unit)? = null private var thermalStatsUpdater: (() -> Unit)? = null + private var ramStatsUpdater: (() -> Unit)? = null private var _binding: FragmentEmulationBinding? = null private val binding get() = _binding!! @@ -80,6 +87,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private lateinit var powerManager: PowerManager + private val ramStatsUpdateHandler = Handler(Looper.myLooper()!!) + override fun onAttach(context: Context) { super.onAttach(context) if (context is EmulationActivity) { @@ -262,6 +271,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { true } + + R.id.menu_multiplayer -> { + emulationActivity?.displayMultiplayerDialog() + true + } + + R.id.menu_controls -> { val action = HomeNavigationDirections.actionGlobalSettingsActivity( null, @@ -373,6 +389,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { // Setup overlays updateShowFpsOverlay() updateThermalOverlay() + updateRamOverlay() } } emulationViewModel.isEmulationStopping.collect(viewLifecycleOwner) { @@ -467,6 +484,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { override fun onDestroyView() { super.onDestroyView() + if (ramStatsUpdater != null) { + ramStatsUpdateHandler.removeCallbacks(ramStatsUpdater!!) + } _binding = null } @@ -499,10 +519,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val cpuBackend = NativeLibrary.getCpuBackend() val gpuDriver = NativeLibrary.getGpuDriver() if (_binding != null) { + // Calculate color based on FPS (red at 0, green at 60) + val fps = perfStats[FPS].toFloat() + val normalizedFps = (fps / 60f).coerceIn(0f, 1f) + + // Interpolate between red (0xFFFF0000) and green (0xFF00FF00) + val red = ((1f - normalizedFps) * 255).toInt() + val green = (normalizedFps * 255).toInt() + val color = android.graphics.Color.rgb(red, green, 0) + + binding.showFpsText.setTextColor(color) binding.showFpsText.text = - String.format("FPS: %.1f\n%s/%s", perfStats[FPS], cpuBackend, gpuDriver) + String.format("FPS: %.1f\n%s/%s", fps, cpuBackend, gpuDriver) } - perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800) + perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 1000) } } perfStatsUpdateHandler.post(perfStatsUpdater!!) @@ -521,19 +551,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (emulationViewModel.emulationStarted.value && !emulationViewModel.isEmulationStopping.value ) { - val thermalStatus = when (powerManager.currentThermalStatus) { - PowerManager.THERMAL_STATUS_LIGHT -> "😥" - PowerManager.THERMAL_STATUS_MODERATE -> "🥵" - PowerManager.THERMAL_STATUS_SEVERE -> "🔥" - PowerManager.THERMAL_STATUS_CRITICAL, - PowerManager.THERMAL_STATUS_EMERGENCY, - PowerManager.THERMAL_STATUS_SHUTDOWN -> "☢️" - - else -> "🙂" - } - if (_binding != null) { - binding.showThermalsText.text = thermalStatus - } + val temperature = getBatteryTemperature(requireContext()) + updateThermalOverlay(temperature) thermalStatsUpdateHandler.postDelayed(thermalStatsUpdater!!, 1000) } } @@ -545,6 +564,77 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + private fun updateThermalOverlay(temperature: Float) { + if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean() && + emulationViewModel.emulationStarted.value && + !emulationViewModel.isEmulationStopping.value + ) { + // Get thermal status for color + val thermalStatus = when (powerManager.currentThermalStatus) { + PowerManager.THERMAL_STATUS_NONE -> 0f + PowerManager.THERMAL_STATUS_LIGHT -> 0.25f + PowerManager.THERMAL_STATUS_MODERATE -> 0.5f + PowerManager.THERMAL_STATUS_SEVERE -> 0.75f + PowerManager.THERMAL_STATUS_CRITICAL, + PowerManager.THERMAL_STATUS_EMERGENCY, + PowerManager.THERMAL_STATUS_SHUTDOWN -> 1.0f + else -> 0f + } + + // Convert to Fahrenheit + val fahrenheit = (temperature * 9f / 5f) + 32f + + // Color based on thermal status (green to red) + val red = (thermalStatus * 255).toInt() + val green = ((1f - thermalStatus) * 255).toInt() + val color = android.graphics.Color.rgb(red, green, 0) + + binding.showThermalsText.setTextColor(color) + binding.showThermalsText.text = String.format("%.1f°C • %.1f°F", temperature, fahrenheit) + } + } + + private fun updateRamOverlay() { + val showOverlay = BooleanSetting.SHOW_RAM_OVERLAY.getBoolean() + binding.showRamText.setVisible(showOverlay) + if (showOverlay) { + ramStatsUpdater = { + if (emulationViewModel.emulationStarted.value && + !emulationViewModel.isEmulationStopping.value + ) { + val runtime = Runtime.getRuntime() + val nativeHeapSize = Debug.getNativeHeapSize() + val nativeHeapFreeSize = Debug.getNativeHeapFreeSize() + val nativeHeapUsed = nativeHeapSize - nativeHeapFreeSize + + val usedMemInMB = nativeHeapUsed / 1048576L + val maxMemInMB = nativeHeapSize / 1048576L + val percentUsed = (nativeHeapUsed.toFloat() / nativeHeapSize.toFloat() * 100f) + + // Color interpolation from green to red based on usage percentage + val normalizedUsage = (percentUsed / 100f).coerceIn(0f, 1f) + val red = (normalizedUsage * 255).toInt() + val green = ((1f - normalizedUsage) * 255).toInt() + val color = Color.rgb(red, green, 0) + + binding.showRamText.setTextColor(color) + binding.showRamText.text = String.format( + "\nRAM: %d/%d MB (%.1f%%)", + usedMemInMB, + maxMemInMB, + percentUsed + ) + ramStatsUpdateHandler.postDelayed(ramStatsUpdater!!, 1000) + } + } + ramStatsUpdateHandler.post(ramStatsUpdater!!) + } else { + if (ramStatsUpdater != null) { + ramStatsUpdateHandler.removeCallbacks(ramStatsUpdater!!) + } + } + } + @SuppressLint("SourceLockedOrientationActivity") private fun updateOrientation() { emulationActivity?.let { @@ -674,6 +764,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean() findItem(R.id.thermal_indicator).isChecked = BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean() + findItem(R.id.ram_meter).apply { + isChecked = BooleanSetting.SHOW_RAM_OVERLAY.getBoolean() + isEnabled = false // This grays out the option + } findItem(R.id.menu_rel_stick_center).isChecked = BooleanSetting.JOYSTICK_REL_CENTER.getBoolean() findItem(R.id.menu_dpad_slide).isChecked = BooleanSetting.DPAD_SLIDE.getBoolean() @@ -700,6 +794,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { true } + R.id.ram_meter -> { + // Do nothing since it's disabled + true + } + R.id.menu_edit_overlay -> { binding.drawerLayout.close() binding.surfaceInputOverlay.requestFocus() @@ -1045,4 +1144,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) private val thermalStatsUpdateHandler = Handler(Looper.myLooper()!!) } + + private fun getBatteryTemperature(context: Context): Float { + try { + val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) + // Temperature in tenths of a degree Celsius + val temperature = batteryIntent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0 + // Convert to degrees Celsius + return temperature / 10.0f + } catch (e: Exception) { + Log.error("[EmulationFragment] Failed to get battery temperature: ${e.message}") + return 0.0f + } + } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFolderPropertiesDialogFragment.kt index 7d73d4a72..220e33fd9 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFoldersFragment.kt index 1081ffb65..771ae292b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameFoldersFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameInfoFragment.kt index 193e332b3..221175855 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GameInfoFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GamePropertiesFragment.kt index 7a9def5b8..203cbd70a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/GamePropertiesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/HomeSettingsFragment.kt index 2c159f259..b92fc5afd 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/HomeSettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments @@ -119,6 +119,16 @@ class HomeSettingsFragment : Fragment() { driverViewModel.selectedDriverTitle ) ) + add( + HomeSetting( + R.string.multiplayer, + R.string.multiplayer_description, + R.drawable.ic_multiplayer, + { + val action = mainActivity.displayMultiplayerDialog() + }, + ) + ) add( HomeSetting( R.string.applets, diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/InstallableFragment.kt index 47980cd9a..90f15f8ed 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/InstallableFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LaunchGameDialogFragment.kt index 37dffc928..da6a5dd4a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LaunchGameDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicenseBottomSheetDialogFragment.kt index a032d0256..af6eebb21 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicensesFragment.kt index 9b9c46ed9..48b76c6bb 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/LicensesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/MessageDialogFragment.kt index fb3049a3a..4b27adffb 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/MessageDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/PermissionDeniedDialogFragment.kt index c1dd710c1..fdf8f253a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ProgressDialogFragment.kt index a64b0716f..84ee7aabb 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ProgressDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ResetSettingsDialogFragment.kt index 152c1c6fe..d1b761884 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SearchFragment.kt index c8308d427..657025ea4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt index 817210d48..962fa709a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments @@ -98,6 +98,19 @@ class SetupFragment : Fragment() { val pages = mutableListOf() pages.apply { + add( + SetupPage( + R.drawable.ic_check, + R.string.disclaimer_title, + R.string.disclaimer_description, + 0, + true, + R.string.accept_and_continue, + { pageForward() }, + false + ) + ) + add( SetupPage( R.drawable.ic_citron_title, @@ -167,6 +180,62 @@ class SetupFragment : Fragment() { } ) ) + + // Add title.keys installation page + add( + SetupPage( + R.drawable.ic_key, + R.string.install_title_keys, + R.string.install_title_keys_description, + R.drawable.ic_add, + true, + R.string.select_keys, + { + titleKeyCallback = it + getTitleKey.launch(arrayOf("*/*")) + }, + true, + R.string.install_title_keys_warning, + R.string.install_title_keys_warning_description, + R.string.install_title_keys_warning_help, + { + val file = File(DirectoryInitialization.userDirectory + "/keys/title.keys") + if (file.exists()) { + StepState.COMPLETE + } else { + StepState.INCOMPLETE + } + } + ) + ) + + // Add firmware installation page (mandatory) + add( + SetupPage( + R.drawable.ic_key, + R.string.install_firmware, + R.string.install_firmware_description, + R.drawable.ic_add, + true, + R.string.select_firmware, + { + firmwareCallback = it + getFirmware.launch(arrayOf("application/zip")) + }, + true, + R.string.install_firmware_warning, + R.string.install_firmware_warning_description, + R.string.install_firmware_warning_help, + { + if (NativeLibrary.isFirmwareAvailable()) { + StepState.COMPLETE + } else { + StepState.INCOMPLETE + } + } + ) + ) + add( SetupPage( R.drawable.ic_controller, @@ -255,6 +324,18 @@ class SetupFragment : Fragment() { return@setOnClickListener } + // Special handling for firmware page - don't allow skipping + if (currentPage.titleId == R.string.install_firmware && !NativeLibrary.isFirmwareAvailable()) { + SetupWarningDialogFragment.newInstance( + currentPage.warningTitleId, + currentPage.warningDescriptionId, + currentPage.warningHelpLinkId, + index, + allowSkip = false + ).show(childFragmentManager, SetupWarningDialogFragment.TAG) + return@setOnClickListener + } + if (!hasBeenWarned[index]) { SetupWarningDialogFragment.newInstance( currentPage.warningTitleId, @@ -333,6 +414,30 @@ class SetupFragment : Fragment() { } } + private lateinit var titleKeyCallback: SetupCallback + + val getTitleKey = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + mainActivity.processTitleKey(result) + titleKeyCallback.onStepCompleted() + } + } + + private lateinit var firmwareCallback: SetupCallback + + val getFirmware = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + mainActivity.getFirmware.launch(arrayOf("application/zip")) + binding.root.postDelayed({ + if (NativeLibrary.isFirmwareAvailable()) { + firmwareCallback.onStepCompleted() + } + }, 1000) + } + } + private lateinit var gamesDirCallback: SetupCallback val getGamesDirectory = diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupWarningDialogFragment.kt index 583cd8854..7104917c6 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/SetupWarningDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.fragments @@ -17,6 +17,7 @@ class SetupWarningDialogFragment : DialogFragment() { private var descriptionId: Int = 0 private var helpLinkId: Int = 0 private var page: Int = 0 + private var allowSkip: Boolean = true private lateinit var setupFragment: SetupFragment @@ -26,17 +27,24 @@ class SetupWarningDialogFragment : DialogFragment() { descriptionId = requireArguments().getInt(DESCRIPTION) helpLinkId = requireArguments().getInt(HELP_LINK) page = requireArguments().getInt(PAGE) + allowSkip = requireArguments().getBoolean(ALLOW_SKIP, true) setupFragment = requireParentFragment() as SetupFragment } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = MaterialAlertDialogBuilder(requireContext()) - .setPositiveButton(R.string.warning_skip) { _: DialogInterface?, _: Int -> + + if (allowSkip) { + builder.setPositiveButton(R.string.warning_skip) { _: DialogInterface?, _: Int -> setupFragment.pageForward() setupFragment.setPageWarned(page) } - .setNegativeButton(R.string.warning_cancel, null) + builder.setNegativeButton(R.string.warning_cancel, null) + } else { + // For mandatory steps, only show an OK button that dismisses the dialog + builder.setPositiveButton(R.string.ok, null) + } if (titleId != 0) { builder.setTitle(titleId) @@ -48,7 +56,7 @@ class SetupWarningDialogFragment : DialogFragment() { } if (helpLinkId != 0) { builder.setNeutralButton(R.string.warning_help) { _: DialogInterface?, _: Int -> - val helpLink = resources.getString(R.string.install_prod_keys_warning_help) + val helpLink = resources.getString(helpLinkId) val intent = Intent(Intent.ACTION_VIEW, Uri.parse(helpLink)) startActivity(intent) } @@ -64,12 +72,14 @@ class SetupWarningDialogFragment : DialogFragment() { private const val DESCRIPTION = "Description" private const val HELP_LINK = "HelpLink" private const val PAGE = "Page" + private const val ALLOW_SKIP = "AllowSkip" fun newInstance( titleId: Int, descriptionId: Int, helpLinkId: Int, - page: Int + page: Int, + allowSkip: Boolean = true ): SetupWarningDialogFragment { val dialog = SetupWarningDialogFragment() val bundle = Bundle() @@ -78,6 +88,7 @@ class SetupWarningDialogFragment : DialogFragment() { putInt(DESCRIPTION, descriptionId) putInt(HELP_LINK, helpLinkId) putInt(PAGE, page) + putBoolean(ALLOW_SKIP, allowSkip) } dialog.arguments = bundle return dialog diff --git a/src/android/app/src/main/java/org/citron/citron_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/org/citron/citron_emu/layout/AutofitGridLayoutManager.kt index 97360b098..9b62459a0 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/layout/AutofitGridLayoutManager.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.layout diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/AddonViewModel.kt index 03f42afdd..3ce91169b 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/AddonViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/Applet.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/Applet.kt index a0d51531f..eefcdc7ad 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/Applet.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/Applet.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/Driver.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/Driver.kt index 7d8773751..33935f752 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/Driver.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/Driver.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/DriverViewModel.kt index 1745360d4..8a7820a86 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/DriverViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/EmulationViewModel.kt index 303a1823b..218437545 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/EmulationViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/Game.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/Game.kt index 5f3ad32cf..dced02d5c 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/Game.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/GameDir.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/GameDir.kt index 3eb925e12..f17fa54e4 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/GameDir.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/GameProperties.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/GameProperties.kt index b7d858e82..ea02789d0 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/GameProperties.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/GameVerificationResult.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/GameVerificationResult.kt index f17c52419..646263278 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/GameVerificationResult.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/GameVerificationResult.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/GamesViewModel.kt index c1dbab0c2..14118e4e6 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/GamesViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/HomeSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/HomeSetting.kt index f2628e3ed..fb615b9d7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/HomeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/HomeViewModel.kt index e8df48f18..616af3394 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/HomeViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/InstallResult.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/InstallResult.kt index 5921bcecf..92b18bbdf 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/InstallResult.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/InstallResult.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/Installable.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/Installable.kt index 28d0fbe7f..10c544ac7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/Installable.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/Installable.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/License.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/License.kt index c61ae7c0d..5b6071372 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/License.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/License.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/MessageDialogViewModel.kt index bace57591..75c5759ff 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/MessageDialogViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/MinimalDocumentFile.kt index e5bc08c7b..de5430b3e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/MinimalDocumentFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/Patch.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/Patch.kt index 678d086c4..da2468687 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/Patch.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/PatchType.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/PatchType.kt index 62dd5e6b7..391ce6da2 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/PatchType.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/SelectableItem.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/SelectableItem.kt index 3080b35e0..11493c1de 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/SelectableItem.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/SelectableItem.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/SetupPage.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/SetupPage.kt index 9063e638e..01a390d5e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/SetupPage.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/citron/citron_emu/model/TaskViewModel.kt index 581d148bc..9a18086bd 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/model/TaskViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/network/NetPlayManager.kt b/src/android/app/src/main/java/org/citron/citron_emu/network/NetPlayManager.kt new file mode 100644 index 000000000..701be9494 --- /dev/null +++ b/src/android/app/src/main/java/org/citron/citron_emu/network/NetPlayManager.kt @@ -0,0 +1,222 @@ +// Copyright 2024 Mandarine Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citron.citron_emu.network + +import android.app.Activity +import android.content.Context +import android.net.wifi.WifiManager +import android.os.Handler +import android.os.Looper +import android.text.format.Formatter +import android.widget.Toast +import androidx.preference.PreferenceManager +import org.citron.citron_emu.CitronApplication +import org.citron.citron_emu.R +import org.citron.citron_emu.dialogs.ChatMessage + +object NetPlayManager { + external fun netPlayCreateRoom(ipAddress: String, port: Int, username: String, password: String, roomName: String, maxPlayers: Int): Int + external fun netPlayJoinRoom(ipAddress: String, port: Int, username: String, password: String): Int + external fun netPlayRoomInfo(): Array + external fun netPlayIsJoined(): Boolean + external fun netPlayIsHostedRoom(): Boolean + external fun netPlaySendMessage(msg: String) + external fun netPlayKickUser(username: String) + external fun netPlayLeaveRoom() + external fun netPlayIsModerator(): Boolean + external fun netPlayGetBanList(): Array + external fun netPlayBanUser(username: String) + external fun netPlayUnbanUser(username: String) + + private var messageListener: ((Int, String) -> Unit)? = null + private var adapterRefreshListener: ((Int, String) -> Unit)? = null + + fun setOnMessageReceivedListener(listener: (Int, String) -> Unit) { + messageListener = listener + } + + fun setOnAdapterRefreshListener(listener: (Int, String) -> Unit) { + adapterRefreshListener = listener + } + + fun getUsername(activity: Context): String { val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + val name = "Citron${(Math.random() * 100).toInt()}" + return prefs.getString("NetPlayUsername", name) ?: name + } + + fun setUsername(activity: Activity, name: String) { + val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + prefs.edit().putString("NetPlayUsername", name).apply() + } + + fun getRoomAddress(activity: Activity): String { + val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + val address = getIpAddressByWifi(activity) + return prefs.getString("NetPlayRoomAddress", address) ?: address + } + + fun setRoomAddress(activity: Activity, address: String) { + val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + prefs.edit().putString("NetPlayRoomAddress", address).apply() + } + + fun getRoomPort(activity: Activity): String { + val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + return prefs.getString("NetPlayRoomPort", "24872") ?: "24872" + } + + fun setRoomPort(activity: Activity, port: String) { + val prefs = PreferenceManager.getDefaultSharedPreferences(activity) + prefs.edit().putString("NetPlayRoomPort", port).apply() + } + + private val chatMessages = mutableListOf() + private var isChatOpen = false + + fun addChatMessage(message: ChatMessage) { + chatMessages.add(message) + } + + fun getChatMessages(): List = chatMessages + + fun clearChat() { + chatMessages.clear() + } + + fun setChatOpen(isOpen: Boolean) { + isChatOpen = isOpen + } + + fun addNetPlayMessage(type: Int, msg: String) { + val context = CitronApplication.appContext + val message = formatNetPlayStatus(context, type, msg) + + when (type) { + NetPlayStatus.CHAT_MESSAGE -> { + val parts = msg.split(":", limit = 2) + if (parts.size == 2) { + val nickname = parts[0].trim() + val chatMessage = parts[1].trim() + addChatMessage(ChatMessage( + nickname = nickname, + username = "", + message = chatMessage + )) + } + } + NetPlayStatus.MEMBER_JOIN, + NetPlayStatus.MEMBER_LEAVE, + NetPlayStatus.MEMBER_KICKED, + NetPlayStatus.MEMBER_BANNED -> { + addChatMessage(ChatMessage( + nickname = "System", + username = "", + message = message + )) + } + } + + + Handler(Looper.getMainLooper()).post { + if (!isChatOpen) { + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + } + + + messageListener?.invoke(type, msg) + adapterRefreshListener?.invoke(type, msg) + } + + private fun formatNetPlayStatus(context: Context, type: Int, msg: String): String { + return when (type) { + NetPlayStatus.NETWORK_ERROR -> context.getString(R.string.multiplayer_network_error) + NetPlayStatus.LOST_CONNECTION -> context.getString(R.string.multiplayer_lost_connection) + NetPlayStatus.NAME_COLLISION -> context.getString(R.string.multiplayer_name_collision) + NetPlayStatus.MAC_COLLISION -> context.getString(R.string.multiplayer_mac_collision) + NetPlayStatus.CONSOLE_ID_COLLISION -> context.getString(R.string.multiplayer_console_id_collision) + NetPlayStatus.WRONG_VERSION -> context.getString(R.string.multiplayer_wrong_version) + NetPlayStatus.WRONG_PASSWORD -> context.getString(R.string.multiplayer_wrong_password) + NetPlayStatus.COULD_NOT_CONNECT -> context.getString(R.string.multiplayer_could_not_connect) + NetPlayStatus.ROOM_IS_FULL -> context.getString(R.string.multiplayer_room_is_full) + NetPlayStatus.HOST_BANNED -> context.getString(R.string.multiplayer_host_banned) + NetPlayStatus.PERMISSION_DENIED -> context.getString(R.string.multiplayer_permission_denied) + NetPlayStatus.NO_SUCH_USER -> context.getString(R.string.multiplayer_no_such_user) + NetPlayStatus.ALREADY_IN_ROOM -> context.getString(R.string.multiplayer_already_in_room) + NetPlayStatus.CREATE_ROOM_ERROR -> context.getString(R.string.multiplayer_create_room_error) + NetPlayStatus.HOST_KICKED -> context.getString(R.string.multiplayer_host_kicked) + NetPlayStatus.UNKNOWN_ERROR -> context.getString(R.string.multiplayer_unknown_error) + NetPlayStatus.ROOM_UNINITIALIZED -> context.getString(R.string.multiplayer_room_uninitialized) + NetPlayStatus.ROOM_IDLE -> context.getString(R.string.multiplayer_room_idle) + NetPlayStatus.ROOM_JOINING -> context.getString(R.string.multiplayer_room_joining) + NetPlayStatus.ROOM_JOINED -> context.getString(R.string.multiplayer_room_joined) + NetPlayStatus.ROOM_MODERATOR -> context.getString(R.string.multiplayer_room_moderator) + NetPlayStatus.MEMBER_JOIN -> context.getString(R.string.multiplayer_member_join, msg) + NetPlayStatus.MEMBER_LEAVE -> context.getString(R.string.multiplayer_member_leave, msg) + NetPlayStatus.MEMBER_KICKED -> context.getString(R.string.multiplayer_member_kicked, msg) + NetPlayStatus.MEMBER_BANNED -> context.getString(R.string.multiplayer_member_banned, msg) + NetPlayStatus.ADDRESS_UNBANNED -> context.getString(R.string.multiplayer_address_unbanned) + NetPlayStatus.CHAT_MESSAGE -> msg + else -> "" + } + } + + fun getIpAddressByWifi(activity: Activity): String { + var ipAddress = 0 + val wifiManager = activity.getSystemService(WifiManager::class.java) + val wifiInfo = wifiManager.connectionInfo + if (wifiInfo != null) { + ipAddress = wifiInfo.ipAddress + } + + if (ipAddress == 0) { + val dhcpInfo = wifiManager.dhcpInfo + if (dhcpInfo != null) { + ipAddress = dhcpInfo.ipAddress + } + } + + return if (ipAddress == 0) { + "192.168.0.1" + } else { + Formatter.formatIpAddress(ipAddress) + } + } + + fun getBanList(): List { + return netPlayGetBanList().toList() + } + + object NetPlayStatus { + const val NO_ERROR = 0 + const val NETWORK_ERROR = 1 + const val LOST_CONNECTION = 2 + const val NAME_COLLISION = 3 + const val MAC_COLLISION = 4 + const val CONSOLE_ID_COLLISION = 5 + const val WRONG_VERSION = 6 + const val WRONG_PASSWORD = 7 + const val COULD_NOT_CONNECT = 8 + const val ROOM_IS_FULL = 9 + const val HOST_BANNED = 10 + const val PERMISSION_DENIED = 11 + const val NO_SUCH_USER = 12 + const val ALREADY_IN_ROOM = 13 + const val CREATE_ROOM_ERROR = 14 + const val HOST_KICKED = 15 + const val UNKNOWN_ERROR = 16 + const val ROOM_UNINITIALIZED = 17 + const val ROOM_IDLE = 18 + const val ROOM_JOINING = 19 + const val ROOM_JOINED = 20 + const val ROOM_MODERATOR = 21 + const val MEMBER_JOIN = 22 + const val MEMBER_LEAVE = 23 + const val MEMBER_KICKED = 24 + const val MEMBER_BANNED = 25 + const val ADDRESS_UNBANNED = 26 + const val CHAT_MESSAGE = 27 + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlay.kt index 4c219b2a1..5e6190a7f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlay.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableButton.kt index de7fd49a5..556ffbc48 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableButton.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableDpad.kt index 26c02fb37..de852e813 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableJoystick.kt index c14222659..b2cba1f2a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControl.kt index a9ee552fd..85053a07a 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControl.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlData.kt index a8b18a9ae..56f105f82 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlData.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlDefault.kt index c101541e6..193827124 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayControlDefault.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayLayout.kt index 1c9ca1e11..effc141f3 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/overlay/model/OverlayLayout.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.overlay.model diff --git a/src/android/app/src/main/java/org/citron/citron_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/ui/GamesFragment.kt index e7b0c4fce..8c73a8d10 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/ui/GamesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.ui diff --git a/src/android/app/src/main/java/org/citron/citron_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citron/citron_emu/ui/main/MainActivity.kt index 9d3bcb42b..8e1d1db78 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/ui/main/MainActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.ui.main @@ -31,6 +31,7 @@ import org.citron.citron_emu.HomeNavigationDirections import org.citron.citron_emu.NativeLibrary import org.citron.citron_emu.R import org.citron.citron_emu.databinding.ActivityMainBinding +import org.citron.citron_emu.dialogs.NetPlayDialog import org.citron.citron_emu.features.settings.model.Settings import org.citron.citron_emu.fragments.AddGameFolderDialogFragment import org.citron.citron_emu.fragments.ProgressDialogFragment @@ -68,6 +69,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady } ThemeHelper.setTheme(this) + NativeLibrary.netPlayInit() super.onCreate(savedInstanceState) @@ -157,6 +159,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { setInsets() } + fun displayMultiplayerDialog() { + val dialog = NetPlayDialog(this) + dialog.show() + } + private fun checkKeys() { if (!NativeLibrary.areKeysPresent()) { MessageDialogFragment.newInstance( @@ -370,6 +377,57 @@ class MainActivity : AppCompatActivity(), ThemeProvider { return false } + val getTitleKey = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + processTitleKey(result) + } + } + + fun processTitleKey(result: Uri): Boolean { + if (FileUtil.getExtension(result) != "keys") { + MessageDialogFragment.newInstance( + this, + titleId = R.string.reading_keys_failure, + descriptionId = R.string.install_title_keys_failure_extension_description + ).show(supportFragmentManager, MessageDialogFragment.TAG) + return false + } + + contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + + val dstPath = DirectoryInitialization.userDirectory + "/keys/" + if (FileUtil.copyUriToInternalStorage( + result, + dstPath, + "title.keys" + ) != null + ) { + if (NativeLibrary.reloadKeys()) { + Toast.makeText( + applicationContext, + R.string.install_keys_success, + Toast.LENGTH_SHORT + ).show() + homeViewModel.setCheckKeys(true) + gamesViewModel.reloadGames(true) + return true + } else { + MessageDialogFragment.newInstance( + this, + titleId = R.string.invalid_keys_error, + descriptionId = R.string.install_keys_failure_description, + helpLinkId = R.string.dumping_keys_quickstart_link + ).show(supportFragmentManager, MessageDialogFragment.TAG) + return false + } + } + return false + } + val getFirmware = registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> if (result == null) { diff --git a/src/android/app/src/main/java/org/citron/citron_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/org/citron/citron_emu/ui/main/ThemeProvider.kt index 4defc7bed..a16dfec32 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/ui/main/ThemeProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.ui.main diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/AddonUtil.kt index 7a9fcea85..d2ef1c7c7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/AddonUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/CompatUtils.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/CompatUtils.kt new file mode 100644 index 000000000..67ab65c74 --- /dev/null +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/CompatUtils.kt @@ -0,0 +1,19 @@ +// Copyright 2024 Mandarine Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citron.citron_emu.utils + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper + +object CompatUtils { + fun findActivity(context: Context): Activity { + return when (context) { + is Activity -> context + is ContextWrapper -> findActivity(context.baseContext) + else -> throw IllegalArgumentException("Context is not an Activity") + } + } +} diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/DirectoryInitialization.kt index 28e310985..97f106a57 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/DirectoryInitialization.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/DocumentsTree.kt index 4ff3d3abb..14adf9650 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/DocumentsTree.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/FileUtil.kt index a64e7bdd4..1f02d313d 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/FileUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameHelper.kt index bba166b42..6edb79226 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameIconUtils.kt index f1cbffb17..3e8a0e12f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameIconUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameMetadata.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameMetadata.kt index a3c035f6f..c89048db3 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/GameMetadata.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/GameMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverHelper.kt index 672d732c4..2112a1666 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverMetadata.kt index fce854616..10112bda0 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/GpuDriverMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/InputHandler.kt index 5d3e2f6cf..3713593a0 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/InputHandler.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/InsetsHelper.kt index 2181dc0fb..1341fe8f7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/InsetsHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/LicenseVerifier.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/LicenseVerifier.kt new file mode 100644 index 000000000..c92046455 --- /dev/null +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/LicenseVerifier.kt @@ -0,0 +1,74 @@ +package org.citron.citron_emu.utils + +import android.app.Activity +import android.app.AlertDialog +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.pm.PackageManager +import android.content.pm.Signature +import android.os.Build +import android.os.Process +import kotlin.system.exitProcess + +object LicenseVerifier { + private const val EXPECTED_PACKAGE = "org.citron.citron_emu" + private const val ALTERNATE_PACKAGE = "com.miHoYo.Yuanshen" + private const val ALTERNATE_PACKAGE_2 = "com.antutu.ABenchMark" + private const val OFFICIAL_HASH = "308202e4308201cc020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b30090603550406130255533020170d3231303831383138303335305a180f32303531303831313138303335305a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b300906035504061302555330820122300d06092a864886f70d01010105000382010f003082010a0282010100803b4ba8d352ed0475a8442032eadb75ea0a865a0c310c59970bc5f011f162733941a17bac932e060a7f6b00e1d87e640d87951753ee396893769a6e4a60baddc2bf896cd46d5a08c8321879b955eeb6d9f43908029ec6e938433432c5a1ba19da26d8b3dba39f919695626fba5c412b4aba03d85f0246e79af54d6d57347aa6b5095fe916a34262e7060ef4d3f436e7ce03093757fb719b7e72267402289b0fd819673ee44b5aee23237be8e46be08df64b42de09be6090c49d6d0d7d301f0729e25c67eae2d862a87db0aa19db25ba291aae60c7740e0b745af0f1f236dadeb81fe29104a0731eb9091249a94bb56a90239b6496977ebaf1d98b6fa9f679cd0203010001300d06092a864886f70d01010505000382010100784d8e8d28b11bbdb09b5d9e7b8b4fac0d6defd2703d43da63ad4702af76f6ac700f5dcc2f480fbbf6fb664daa64132b36eb7a7880ade5be12919a14c8816b5c1da06870344902680e8ace430705d0a08158d44a3dc710fff6d60b6eb5eff4056bb7d462dafed5b8533c815988805c9f529ef1b70c7c10f1e225eded6db08f847ae805d8b37c174fa0b42cbab1053acb629711e60ce469de383173e714ae2ea76a975169785d1dbe330f803f7f12dd6616703dbaae4d4c327c5174bee83f83635e06f8634cf49d63ba5c3a4f865572740cf9e720e7df1d48fd7a4a2a651d7bb9f40d1cc6b6680b384827a6ea2a44cc1e5168218637fc5da0c3739caca8d21a1d" + + fun verifyLicense(activity: Activity) { + val currentPackage = activity.packageName + val isDebugBuild = currentPackage.endsWith(".debug") + val isEaBuild = currentPackage.endsWith(".ea") + + // Check package name + if (!isDebugBuild && !isEaBuild && + currentPackage != EXPECTED_PACKAGE && + currentPackage != ALTERNATE_PACKAGE && + currentPackage != ALTERNATE_PACKAGE_2) { + showViolationDialog(activity) + return + } + + try { + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + activity.packageManager.getPackageInfo( + currentPackage, + PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNATURES.toLong()) + ) + } else { + @Suppress("DEPRECATION") + activity.packageManager.getPackageInfo(currentPackage, PackageManager.GET_SIGNATURES) + } + + if (!verifySignature(packageInfo.signatures)) { + showViolationDialog(activity) + } + + } catch (e: Exception) { + showViolationDialog(activity) + } + } + + private fun verifySignature(signatures: Array?): Boolean { + if (signatures == null || signatures.isEmpty()) return false + val currentSignature = signatures[0].toCharsString() + return currentSignature == OFFICIAL_HASH + } + + private fun showViolationDialog(activity: Activity) { + AlertDialog.Builder(activity) + .setTitle("License Violation") + .setMessage("This appears to be a modified version of Citron Emulator. " + + "Redistributing modified versions without source code violates the GPLv3 License. " + + "The application will now close.") + .setCancelable(false) + .setPositiveButton("Exit") { _, _ -> + activity.finish() + Process.killProcess(Process.myPid()) + exitProcess(1) + } + .show() + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/LifecycleUtils.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/LifecycleUtils.kt index 04cc82cfd..3ce7697d1 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/LifecycleUtils.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/LifecycleUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/Log.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/Log.kt index f29dc05c0..a9a103b59 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/Log.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/Log.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/MemoryUtil.kt index 0669e274b..fa5b797be 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/MemoryUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/NativeConfig.kt index b3c6ee7a5..34cd8abd7 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/NativeConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/NfcReader.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/NfcReader.kt index 4737989ac..b4fca3c96 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/NfcReader.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/ParamPackage.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/ParamPackage.kt index 126f71461..888650c01 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/ParamPackage.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/ParamPackage.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/PreferenceUtil.kt index e570791ac..eab587491 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/PreferenceUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/SerializableHelper.kt index 946ccf6f3..d1ddf6cc8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/SerializableHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/ThemeHelper.kt index 15ccd1f2d..338216dff 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/ThemeHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/citron/citron_emu/utils/ViewUtils.kt index a7d94cd97..bd514cd5f 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/utils/ViewUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.utils diff --git a/src/android/app/src/main/java/org/citron/citron_emu/viewholder/AbstractViewHolder.kt b/src/android/app/src/main/java/org/citron/citron_emu/viewholder/AbstractViewHolder.kt index ad78e4ea3..cdd092e3e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/viewholder/AbstractViewHolder.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/viewholder/AbstractViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.viewholder diff --git a/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt index a2476074d..bb009b32e 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.views diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index 203dc1c96..c9c695125 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later add_library(citron-android SHARED diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index ed03eb9e4..a79a64afb 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/android_config.h b/src/android/app/src/main/jni/android_config.h index 340ea2373..28ef5d0a8 100644 --- a/src/android/app/src/main/jni/android_config.h +++ b/src/android/app/src/main/jni/android_config.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/android/app/src/main/jni/android_settings.cpp b/src/android/app/src/main/jni/android_settings.cpp index 39835ec84..16023a6b0 100644 --- a/src/android/app/src/main/jni/android_settings.cpp +++ b/src/android/app/src/main/jni/android_settings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "android_settings.h" diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index 94e0ce697..f160752ef 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 Citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -51,7 +52,7 @@ struct Values { Settings::Setting theme{linkage, 0, "theme", Settings::Category::Android}; Settings::Setting theme_mode{linkage, -1, "theme_mode", Settings::Category::Android}; - Settings::Setting black_backgrounds{linkage, false, "black_backgrounds", + Settings::Setting black_backgrounds{linkage, true, "black_backgrounds", Settings::Category::Android}; // Input/performance overlay settings @@ -67,8 +68,10 @@ struct Values { Settings::Category::Overlay}; Settings::Setting show_performance_overlay{linkage, true, "show_performance_overlay", Settings::Category::Overlay}; - Settings::Setting show_thermal_overlay{linkage, false, "show_thermal_overlay", + Settings::Setting show_thermal_overlay{linkage, true, "show_thermal_overlay", Settings::Category::Overlay}; + Settings::Setting show_ram_overlay{linkage, false, "show_ram_overlay", + Settings::Category::Overlay}; Settings::Setting show_input_overlay{linkage, true, "show_input_overlay", Settings::Category::Overlay}; Settings::Setting touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay}; diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 85982a52a..06db55369 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/android/app/src/main/jni/emu_window/emu_window.h b/src/android/app/src/main/jni/emu_window/emu_window.h index 4d77b5479..d7b5fc6da 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.h +++ b/src/android/app/src/main/jni/emu_window/emu_window.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index e26b5773c..bac052b5d 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/android/android_common.h" diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 9f99ed608..f2a6a64d4 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -20,6 +20,7 @@ #include #include +#include "common/android/multiplayer/multiplayer.h" #include "common/android/android_common.h" #include "common/android/id_cache.h" #include "common/detached_tasks.h" @@ -870,4 +871,83 @@ jboolean Java_org_citron_citron_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, j return ContentManager::AreKeysPresent(); } +JNIEXPORT jint JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayCreateRoom( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring ipaddress, jint port, + jstring username, jstring password, jstring room_name, jint max_players) { + return static_cast( + NetPlayCreateRoom(Common::Android::GetJString(env, ipaddress), port, + Common::Android::GetJString(env, username), Common::Android::GetJString(env, password), + Common::Android::GetJString(env, room_name), max_players)); +} + +JNIEXPORT jint JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayJoinRoom( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring ipaddress, jint port, + jstring username, jstring password) { + return static_cast( + NetPlayJoinRoom(Common::Android::GetJString(env, ipaddress), port, + Common::Android::GetJString(env, username), Common::Android::GetJString(env, password))); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlayRoomInfo( + JNIEnv* env, [[maybe_unused]] jobject obj) { + return Common::Android::ToJStringArray(env, NetPlayRoomInfo()); +} + +JNIEXPORT jboolean JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlayIsJoined( + [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) { + return NetPlayIsJoined(); +} + +JNIEXPORT jboolean JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlayIsHostedRoom( + [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) { + return NetPlayIsHostedRoom(); +} + +JNIEXPORT void JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlaySendMessage( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring msg) { + NetPlaySendMessage(Common::Android::GetJString(env, msg)); +} + +JNIEXPORT void JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayKickUser( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) { + NetPlayKickUser(Common::Android::GetJString(env, username)); +} + +JNIEXPORT void JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayLeaveRoom( + [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) { + NetPlayLeaveRoom(); +} + +JNIEXPORT jboolean JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlayIsModerator( + [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jobject obj) { + return NetPlayIsModerator(); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_citron_citron_1emu_network_NetPlayManager_netPlayGetBanList( + JNIEnv* env, [[maybe_unused]] jobject obj) { + return Common::Android::ToJStringArray(env, NetPlayGetBanList()); +} + +JNIEXPORT void JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayBanUser( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) { + NetPlayBanUser(Common::Android::GetJString(env, username)); +} + +JNIEXPORT void JNICALL Java_org_citron_citron_1emu_network_NetPlayManager_netPlayUnbanUser( + JNIEnv* env, [[maybe_unused]] jobject obj, jstring username) { + NetPlayUnbanUser(Common::Android::GetJString(env, username)); +} + +JNIEXPORT void JNICALL +Java_org_citron_citron_1emu_NativeLibrary_netPlayInit( + JNIEnv* env, [[maybe_unused]] jobject obj) { + NetworkInit(&EmulationSession::GetInstance().System().GetRoomNetwork()); +} + } // extern "C" diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index bffc82e77..6a4551ada 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 61dbd5bc9..619a1c887 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index 01d08d996..cc7ced780 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native_library.cpp b/src/android/app/src/main/jni/native_library.cpp new file mode 100644 index 000000000..41152ef41 --- /dev/null +++ b/src/android/app/src/main/jni/native_library.cpp @@ -0,0 +1,31 @@ +#include "core/crypto/key_manager.h" +#include "core/hle/service/am/am.h" +#include "core/file_sys/registered_cache.h" +#include "core/file_sys/content_archive.h" +#include "core/system.h" + +extern "C" { + +JNIEXPORT jboolean JNICALL Java_org_citron_citron_1emu_NativeLibrary_isFirmwareAvailable( + JNIEnv* env, jobject obj) { + return Core::Crypto::KeyManager::Instance().IsFirmwareAvailable(); +} + +JNIEXPORT jboolean JNICALL Java_org_citron_citron_1emu_NativeLibrary_checkFirmwarePresence( + JNIEnv* env, jobject obj) { + constexpr u64 MiiEditId = 0x0100000000001009; // Mii Edit applet ID + constexpr u64 QLaunchId = 0x0100000000001000; // Home Menu applet ID + + auto& system = Core::System::GetInstance(); + auto bis_system = system.GetFileSystemController().GetSystemNANDContents(); + if (!bis_system) { + return false; + } + + auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program); + auto qlaunch_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); + + return (mii_applet_nca != nullptr && qlaunch_nca != nullptr); +} + +} // extern "C" \ No newline at end of file diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index bbc1fab2c..e076d4ab2 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2025 citron Homebrew Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/res/drawable/ic_chat.xml b/src/android/app/src/main/res/drawable/ic_chat.xml new file mode 100644 index 000000000..e0efa062b --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_chat.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_citron.png b/src/android/app/src/main/res/drawable/ic_citron.png new file mode 100644 index 000000000..5b6dd81ca Binary files /dev/null and b/src/android/app/src/main/res/drawable/ic_citron.png differ diff --git a/src/android/app/src/main/res/drawable/ic_citron.xml b/src/android/app/src/main/res/drawable/ic_citron.xml deleted file mode 100644 index 5e2a8efd0..000000000 --- a/src/android/app/src/main/res/drawable/ic_citron.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/ic_citron_full.png b/src/android/app/src/main/res/drawable/ic_citron_full.png new file mode 100644 index 000000000..5b6dd81ca Binary files /dev/null and b/src/android/app/src/main/res/drawable/ic_citron_full.png differ diff --git a/src/android/app/src/main/res/drawable/ic_citron_full.xml b/src/android/app/src/main/res/drawable/ic_citron_full.xml deleted file mode 100644 index 04e458400..000000000 --- a/src/android/app/src/main/res/drawable/ic_citron_full.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/ic_citron_title.png b/src/android/app/src/main/res/drawable/ic_citron_title.png new file mode 100644 index 000000000..5b6dd81ca Binary files /dev/null and b/src/android/app/src/main/res/drawable/ic_citron_title.png differ diff --git a/src/android/app/src/main/res/drawable/ic_citron_title.xml b/src/android/app/src/main/res/drawable/ic_citron_title.xml deleted file mode 100644 index b733e5248..000000000 --- a/src/android/app/src/main/res/drawable/ic_citron_title.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/src/android/app/src/main/res/drawable/ic_ip.xml b/src/android/app/src/main/res/drawable/ic_ip.xml new file mode 100644 index 000000000..19f719b39 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_ip.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_joined.xml b/src/android/app/src/main/res/drawable/ic_joined.xml new file mode 100644 index 000000000..c86e96da4 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_joined.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_multiplayer.xml b/src/android/app/src/main/res/drawable/ic_multiplayer.xml new file mode 100644 index 000000000..cf3e49fcc --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_multiplayer.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_network.xml b/src/android/app/src/main/res/drawable/ic_network.xml new file mode 100644 index 000000000..eef8a0b43 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_network.xml @@ -0,0 +1,10 @@ + + + + diff --git a/src/android/app/src/main/res/drawable/ic_send.xml b/src/android/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 000000000..fa2074057 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_system.xml b/src/android/app/src/main/res/drawable/ic_system.xml new file mode 100644 index 000000000..63fd22d7d --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_system.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable/ic_user.xml b/src/android/app/src/main/res/drawable/ic_user.xml new file mode 100644 index 000000000..606e966ca --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/android/app/src/main/res/layout-w600dp/page_setup.xml b/src/android/app/src/main/res/layout-w600dp/page_setup.xml index 9e0ab8ecb..5a8566c0b 100644 --- a/src/android/app/src/main/res/layout-w600dp/page_setup.xml +++ b/src/android/app/src/main/res/layout-w600dp/page_setup.xml @@ -34,28 +34,41 @@ android:gravity="center" android:textColor="?attr/colorOnSurface" android:textStyle="bold" - app:layout_constraintBottom_toTopOf="@+id/text_description" + app:layout_constraintBottom_toTopOf="@+id/scroll_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_weight="2" tools:text="@string/welcome" /> - + app:layout_constraintVertical_weight="2"> + + + + @@ -88,7 +101,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/text_description" + app:layout_constraintTop_toBottomOf="@+id/scroll_description" tools:text="Get started" /> diff --git a/src/android/app/src/main/res/layout/dialog_ban_list.xml b/src/android/app/src/main/res/layout/dialog_ban_list.xml new file mode 100644 index 000000000..eb4082717 --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_ban_list.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/dialog_bottom_sheet.xml b/src/android/app/src/main/res/layout/dialog_bottom_sheet.xml new file mode 100644 index 000000000..6dd10d97b --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_bottom_sheet.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/dialog_chat.xml b/src/android/app/src/main/res/layout/dialog_chat.xml new file mode 100644 index 000000000..d62ef0802 --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_chat.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/dialog_multiplayer_connect.xml b/src/android/app/src/main/res/layout/dialog_multiplayer_connect.xml new file mode 100644 index 000000000..36a77d395 --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_multiplayer_connect.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/dialog_multiplayer_lobby.xml b/src/android/app/src/main/res/layout/dialog_multiplayer_lobby.xml new file mode 100644 index 000000000..19368bc2c --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_multiplayer_lobby.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml b/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml new file mode 100644 index 000000000..53afda931 --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_multiplayer_room.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index df91a08c5..fe028e028 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -171,6 +171,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/item_button_netplay.xml b/src/android/app/src/main/res/layout/item_button_netplay.xml new file mode 100644 index 000000000..494cc8878 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_button_netplay.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_chat_message.xml b/src/android/app/src/main/res/layout/item_chat_message.xml new file mode 100644 index 000000000..f4ce137e7 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_chat_message.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/item_netplay_button.xml b/src/android/app/src/main/res/layout/item_netplay_button.xml new file mode 100644 index 000000000..f324e8e26 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_netplay_button.xml @@ -0,0 +1,25 @@ + + + + + +