mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2024-12-23 18:15:39 +00:00
Merge branch 'master' into ssbo-align
This commit is contained in:
commit
1d11fe00a3
|
@ -8,8 +8,17 @@ ccache -s
|
||||||
|
|
||||||
BUILD_FLAVOR=mainline
|
BUILD_FLAVOR=mainline
|
||||||
|
|
||||||
|
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||||
|
export ANDROID_KEYSTORE_FILE="${GITHUB_WORKSPACE}/ks.jks"
|
||||||
|
base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > "${ANDROID_KEYSTORE_FILE}"
|
||||||
|
fi
|
||||||
|
|
||||||
cd src/android
|
cd src/android
|
||||||
chmod +x ./gradlew
|
chmod +x ./gradlew
|
||||||
./gradlew "assemble${BUILD_FLAVOR}Release" "bundle${BUILD_FLAVOR}Release"
|
./gradlew "assemble${BUILD_FLAVOR}Release" "bundle${BUILD_FLAVOR}Release"
|
||||||
|
|
||||||
ccache -s
|
ccache -s
|
||||||
|
|
||||||
|
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||||
|
rm "${ANDROID_KEYSTORE_FILE}"
|
||||||
|
fi
|
||||||
|
|
|
@ -13,15 +13,3 @@ cp src/android/app/build/outputs/apk/"${BUILD_FLAVOR}/release/app-${BUILD_FLAVOR
|
||||||
"artifacts/${REV_NAME}.apk"
|
"artifacts/${REV_NAME}.apk"
|
||||||
cp src/android/app/build/outputs/bundle/"${BUILD_FLAVOR}Release"/"app-${BUILD_FLAVOR}-release.aab" \
|
cp src/android/app/build/outputs/bundle/"${BUILD_FLAVOR}Release"/"app-${BUILD_FLAVOR}-release.aab" \
|
||||||
"artifacts/${REV_NAME}.aab"
|
"artifacts/${REV_NAME}.aab"
|
||||||
|
|
||||||
if [ -n "${ANDROID_KEYSTORE_B64}" ]
|
|
||||||
then
|
|
||||||
echo "Signing apk..."
|
|
||||||
base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > ks.jks
|
|
||||||
|
|
||||||
apksigner sign --ks ks.jks \
|
|
||||||
--ks-key-alias "${ANDROID_KEY_ALIAS}" \
|
|
||||||
--ks-pass env:ANDROID_KEYSTORE_PASS "artifacts/${REV_NAME}.apk"
|
|
||||||
else
|
|
||||||
echo "No keystore specified, not signing the APK files."
|
|
||||||
fi
|
|
||||||
|
|
5
.git-blame-ignore-revs
Normal file
5
.git-blame-ignore-revs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
# CRLF -> LF
|
||||||
|
90aa937593e53a5d5e070fb623b228578b0b225f
|
2
.github/workflows/android-build.yml
vendored
2
.github/workflows/android-build.yml
vendored
|
@ -40,11 +40,11 @@ jobs:
|
||||||
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
sudo apt-get install -y ccache apksigner glslang-dev glslang-tools
|
||||||
- name: Build
|
- name: Build
|
||||||
run: ./.ci/scripts/android/build.sh
|
run: ./.ci/scripts/android/build.sh
|
||||||
- name: Copy and sign artifacts
|
|
||||||
env:
|
env:
|
||||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
||||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
||||||
|
- name: Copy artifacts
|
||||||
run: ./.ci/scripts/android/upload.sh
|
run: ./.ci/scripts/android/upload.sh
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|
6
.gitmodules
vendored
6
.gitmodules
vendored
|
@ -4,9 +4,6 @@
|
||||||
[submodule "enet"]
|
[submodule "enet"]
|
||||||
path = externals/enet
|
path = externals/enet
|
||||||
url = https://github.com/lsalzman/enet.git
|
url = https://github.com/lsalzman/enet.git
|
||||||
[submodule "inih"]
|
|
||||||
path = externals/inih/inih
|
|
||||||
url = https://github.com/benhoyt/inih.git
|
|
||||||
[submodule "cubeb"]
|
[submodule "cubeb"]
|
||||||
path = externals/cubeb
|
path = externals/cubeb
|
||||||
url = https://github.com/mozilla/cubeb.git
|
url = https://github.com/mozilla/cubeb.git
|
||||||
|
@ -61,3 +58,6 @@
|
||||||
[submodule "breakpad"]
|
[submodule "breakpad"]
|
||||||
path = externals/breakpad
|
path = externals/breakpad
|
||||||
url = https://github.com/yuzu-emu/breakpad.git
|
url = https://github.com/yuzu-emu/breakpad.git
|
||||||
|
[submodule "simpleini"]
|
||||||
|
path = externals/simpleini
|
||||||
|
url = https://github.com/brofield/simpleini.git
|
||||||
|
|
|
@ -285,12 +285,12 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||||
find_package(Boost 1.79.0 REQUIRED context)
|
find_package(Boost 1.79.0 REQUIRED context)
|
||||||
find_package(enet 1.3 MODULE)
|
find_package(enet 1.3 MODULE)
|
||||||
find_package(fmt 9 REQUIRED)
|
find_package(fmt 9 REQUIRED)
|
||||||
find_package(inih 52 MODULE COMPONENTS INIReader)
|
|
||||||
find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle)
|
find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle)
|
||||||
find_package(lz4 REQUIRED)
|
find_package(lz4 REQUIRED)
|
||||||
find_package(nlohmann_json 3.8 REQUIRED)
|
find_package(nlohmann_json 3.8 REQUIRED)
|
||||||
find_package(Opus 1.3 MODULE)
|
find_package(Opus 1.3 MODULE)
|
||||||
find_package(RenderDoc MODULE)
|
find_package(RenderDoc MODULE)
|
||||||
|
find_package(SimpleIni MODULE)
|
||||||
find_package(stb MODULE)
|
find_package(stb MODULE)
|
||||||
find_package(VulkanMemoryAllocator CONFIG)
|
find_package(VulkanMemoryAllocator CONFIG)
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
find_package(ZLIB 1.2 REQUIRED)
|
||||||
|
|
19
CMakeModules/FindSimpleIni.cmake
Normal file
19
CMakeModules/FindSimpleIni.cmake
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
find_path(SimpleIni_INCLUDE_DIR SimpleIni.h)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(SimpleIni
|
||||||
|
REQUIRED_VARS SimpleIni_INCLUDE_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni)
|
||||||
|
add_library(SimpleIni::SimpleIni INTERFACE IMPORTED)
|
||||||
|
set_target_properties(SimpleIni::SimpleIni PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${SimpleIni_INCLUDE_DIR}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced(SimpleIni_INCLUDE_DIR)
|
|
@ -1,27 +0,0 @@
|
||||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_search_module(INIH QUIET IMPORTED_TARGET inih)
|
|
||||||
if (INIReader IN_LIST inih_FIND_COMPONENTS)
|
|
||||||
pkg_search_module(INIREADER QUIET IMPORTED_TARGET INIReader)
|
|
||||||
if (INIREADER_FOUND)
|
|
||||||
set(inih_INIReader_FOUND TRUE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(inih
|
|
||||||
REQUIRED_VARS INIH_LINK_LIBRARIES
|
|
||||||
VERSION_VAR INIH_VERSION
|
|
||||||
HANDLE_COMPONENTS
|
|
||||||
)
|
|
||||||
|
|
||||||
if (inih_FOUND AND NOT TARGET inih::inih)
|
|
||||||
add_library(inih::inih ALIAS PkgConfig::INIH)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (inih_FOUND AND inih_INIReader_FOUND AND NOT TARGET inih::INIReader)
|
|
||||||
add_library(inih::INIReader ALIAS PkgConfig::INIREADER)
|
|
||||||
endif()
|
|
5
dist/languages/.tx/config
vendored
5
dist/languages/.tx/config
vendored
|
@ -6,3 +6,8 @@ file_filter = <lang>.ts
|
||||||
source_file = en.ts
|
source_file = en.ts
|
||||||
source_lang = en
|
source_lang = en
|
||||||
type = QT
|
type = QT
|
||||||
|
|
||||||
|
[o:yuzu-emulator:p:yuzu:r:yuzu-android]
|
||||||
|
file_filter = ../../src/android/app/src/main/res/values-<lang>/strings.xml
|
||||||
|
source_file = ../../src/android/app/src/main/res/values/strings.xml
|
||||||
|
type = ANDROID
|
||||||
|
|
1695
dist/languages/ar.ts
vendored
1695
dist/languages/ar.ts
vendored
File diff suppressed because it is too large
Load diff
848
dist/languages/ca.ts
vendored
848
dist/languages/ca.ts
vendored
File diff suppressed because it is too large
Load diff
856
dist/languages/cs.ts
vendored
856
dist/languages/cs.ts
vendored
File diff suppressed because it is too large
Load diff
856
dist/languages/da.ts
vendored
856
dist/languages/da.ts
vendored
File diff suppressed because it is too large
Load diff
997
dist/languages/de.ts
vendored
997
dist/languages/de.ts
vendored
File diff suppressed because it is too large
Load diff
856
dist/languages/el.ts
vendored
856
dist/languages/el.ts
vendored
File diff suppressed because it is too large
Load diff
890
dist/languages/es.ts
vendored
890
dist/languages/es.ts
vendored
File diff suppressed because it is too large
Load diff
876
dist/languages/fr.ts
vendored
876
dist/languages/fr.ts
vendored
File diff suppressed because it is too large
Load diff
1685
dist/languages/hu.ts
vendored
1685
dist/languages/hu.ts
vendored
File diff suppressed because it is too large
Load diff
856
dist/languages/id.ts
vendored
856
dist/languages/id.ts
vendored
File diff suppressed because it is too large
Load diff
864
dist/languages/it.ts
vendored
864
dist/languages/it.ts
vendored
File diff suppressed because it is too large
Load diff
928
dist/languages/ja_JP.ts
vendored
928
dist/languages/ja_JP.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/ko_KR.ts
vendored
850
dist/languages/ko_KR.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/nb.ts
vendored
850
dist/languages/nb.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/nl.ts
vendored
850
dist/languages/nl.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/pl.ts
vendored
850
dist/languages/pl.ts
vendored
File diff suppressed because it is too large
Load diff
886
dist/languages/pt_BR.ts
vendored
886
dist/languages/pt_BR.ts
vendored
File diff suppressed because it is too large
Load diff
884
dist/languages/pt_PT.ts
vendored
884
dist/languages/pt_PT.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/ru_RU.ts
vendored
850
dist/languages/ru_RU.ts
vendored
File diff suppressed because it is too large
Load diff
856
dist/languages/sv.ts
vendored
856
dist/languages/sv.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/tr_TR.ts
vendored
850
dist/languages/tr_TR.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/uk.ts
vendored
850
dist/languages/uk.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/vi.ts
vendored
850
dist/languages/vi.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/vi_VN.ts
vendored
850
dist/languages/vi_VN.ts
vendored
File diff suppressed because it is too large
Load diff
868
dist/languages/zh_CN.ts
vendored
868
dist/languages/zh_CN.ts
vendored
File diff suppressed because it is too large
Load diff
850
dist/languages/zh_TW.ts
vendored
850
dist/languages/zh_TW.ts
vendored
File diff suppressed because it is too large
Load diff
10
externals/CMakeLists.txt
vendored
10
externals/CMakeLists.txt
vendored
|
@ -34,11 +34,6 @@ endif()
|
||||||
# Glad
|
# Glad
|
||||||
add_subdirectory(glad)
|
add_subdirectory(glad)
|
||||||
|
|
||||||
# inih
|
|
||||||
if (NOT TARGET inih::INIReader)
|
|
||||||
add_subdirectory(inih)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# mbedtls
|
# mbedtls
|
||||||
add_subdirectory(mbedtls)
|
add_subdirectory(mbedtls)
|
||||||
target_include_directories(mbedtls PUBLIC ./mbedtls/include)
|
target_include_directories(mbedtls PUBLIC ./mbedtls/include)
|
||||||
|
@ -295,3 +290,8 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
|
||||||
target_link_libraries(dump_syms PRIVATE libbreakpad_client ZLIB::ZLIB)
|
target_link_libraries(dump_syms PRIVATE libbreakpad_client ZLIB::ZLIB)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# SimpleIni
|
||||||
|
if (NOT TARGET SimpleIni::SimpleIni)
|
||||||
|
add_subdirectory(simpleini)
|
||||||
|
endif()
|
||||||
|
|
13
externals/inih/CMakeLists.txt
vendored
13
externals/inih/CMakeLists.txt
vendored
|
@ -1,13 +0,0 @@
|
||||||
# SPDX-FileCopyrightText: 2014 Gui Andrade <admin@archshift.com>
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
add_library(inih
|
|
||||||
inih/ini.c
|
|
||||||
inih/ini.h
|
|
||||||
inih/cpp/INIReader.cpp
|
|
||||||
inih/cpp/INIReader.h
|
|
||||||
)
|
|
||||||
|
|
||||||
create_target_directory_groups(inih)
|
|
||||||
target_include_directories(inih INTERFACE inih/cpp)
|
|
||||||
add_library(inih::INIReader ALIAS inih)
|
|
1
externals/inih/inih
vendored
1
externals/inih/inih
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 9cecf0643da0846e77f64d10a126d9f48b9e05e8
|
|
1
externals/simpleini
vendored
Submodule
1
externals/simpleini
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 382ddbb4b92c0b26aa1b32cefba2002119a5b1f2
|
|
@ -21,7 +21,7 @@ if (MSVC)
|
||||||
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
|
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
|
||||||
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
||||||
|
|
||||||
# Ensure that projects build with Unicode support.
|
# Ensure that projects are built with Unicode support.
|
||||||
add_definitions(-DUNICODE -D_UNICODE)
|
add_definitions(-DUNICODE -D_UNICODE)
|
||||||
|
|
||||||
# /W4 - Level 4 warnings
|
# /W4 - Level 4 warnings
|
||||||
|
@ -54,11 +54,11 @@ if (MSVC)
|
||||||
/GT
|
/GT
|
||||||
|
|
||||||
# Modules
|
# Modules
|
||||||
/experimental:module- # Disable module support explicitly due to conflicts with precompiled headers
|
/experimental:module- # Explicitly disable module support due to conflicts with precompiled headers.
|
||||||
|
|
||||||
# External headers diagnostics
|
# External headers diagnostics
|
||||||
/external:anglebrackets # Treats all headers included by #include <header>, where the header file is enclosed in angle brackets (< >), as external headers
|
/external:anglebrackets # Treats all headers included by #include <header>, where the header file is enclosed in angle brackets (< >), as external headers
|
||||||
/external:W0 # Sets the default warning level to 0 for external headers, effectively turning off warnings for external headers
|
/external:W0 # Sets the default warning level to 0 for external headers, effectively disabling warnings for them.
|
||||||
|
|
||||||
# Warnings
|
# Warnings
|
||||||
/W4
|
/W4
|
||||||
|
@ -187,6 +187,7 @@ add_subdirectory(audio_core)
|
||||||
add_subdirectory(video_core)
|
add_subdirectory(video_core)
|
||||||
add_subdirectory(network)
|
add_subdirectory(network)
|
||||||
add_subdirectory(input_common)
|
add_subdirectory(input_common)
|
||||||
|
add_subdirectory(frontend_common)
|
||||||
add_subdirectory(shader_recompiler)
|
add_subdirectory(shader_recompiler)
|
||||||
|
|
||||||
if (YUZU_ROOM)
|
if (YUZU_ROOM)
|
||||||
|
|
|
@ -47,6 +47,10 @@ android {
|
||||||
jniLibs.useLegacyPackaging = true
|
jniLibs.useLegacyPackaging = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
androidResources {
|
||||||
|
generateLocaleConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO If this is ever modified, change application_id in strings.xml
|
// TODO If this is ever modified, change application_id in strings.xml
|
||||||
applicationId = "org.yuzu.yuzu_emu"
|
applicationId = "org.yuzu.yuzu_emu"
|
||||||
|
@ -215,7 +219,6 @@ dependencies {
|
||||||
implementation("io.coil-kt:coil:2.2.2")
|
implementation("io.coil-kt:coil:2.2.2")
|
||||||
implementation("androidx.core:core-splashscreen:1.0.1")
|
implementation("androidx.core:core-splashscreen:1.0.1")
|
||||||
implementation("androidx.window:window:1.2.0-beta03")
|
implementation("androidx.window:window:1.2.0-beta03")
|
||||||
implementation("org.ini4j:ini4j:0.5.4")
|
|
||||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||||
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
||||||
implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
|
implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
|
||||||
|
|
|
@ -26,7 +26,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:isGame="true"
|
android:isGame="true"
|
||||||
android:appCategory="game"
|
android:appCategory="game"
|
||||||
android:localeConfig="@xml/locales_config"
|
|
||||||
android:banner="@drawable/tv_banner"
|
android:banner="@drawable/tv_banner"
|
||||||
android:fullBackupContent="@xml/data_extraction_rules"
|
android:fullBackupContent="@xml/data_extraction_rules"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules_api_31"
|
android:dataExtractionRules="@xml/data_extraction_rules_api_31"
|
||||||
|
|
|
@ -230,8 +230,6 @@ object NativeLibrary {
|
||||||
*/
|
*/
|
||||||
external fun onTouchReleased(finger_id: Int)
|
external fun onTouchReleased(finger_id: Int)
|
||||||
|
|
||||||
external fun reloadSettings()
|
|
||||||
|
|
||||||
external fun initGameIni(gameID: String?)
|
external fun initGameIni(gameID: String?)
|
||||||
|
|
||||||
external fun setAppDirectory(directory: String)
|
external fun setAppDirectory(directory: String)
|
||||||
|
@ -252,7 +250,7 @@ object NativeLibrary {
|
||||||
|
|
||||||
external fun reloadKeys(): Boolean
|
external fun reloadKeys(): Boolean
|
||||||
|
|
||||||
external fun initializeSystem()
|
external fun initializeSystem(reload: Boolean)
|
||||||
|
|
||||||
external fun defaultCPUCore(): Int
|
external fun defaultCPUCore(): Int
|
||||||
|
|
||||||
|
@ -462,12 +460,12 @@ object NativeLibrary {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setEmulationActivity(emulationActivity: EmulationActivity?) {
|
fun setEmulationActivity(emulationActivity: EmulationActivity?) {
|
||||||
Log.verbose("[NativeLibrary] Registering EmulationActivity.")
|
Log.debug("[NativeLibrary] Registering EmulationActivity.")
|
||||||
sEmulationActivity = WeakReference(emulationActivity)
|
sEmulationActivity = WeakReference(emulationActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clearEmulationActivity() {
|
fun clearEmulationActivity() {
|
||||||
Log.verbose("[NativeLibrary] Unregistering EmulationActivity.")
|
Log.debug("[NativeLibrary] Unregistering EmulationActivity.")
|
||||||
sEmulationActivity.clear()
|
sEmulationActivity.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.io.File
|
||||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||||
import org.yuzu.yuzu_emu.utils.DocumentsTree
|
import org.yuzu.yuzu_emu.utils.DocumentsTree
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
|
|
||||||
fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
|
fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
|
||||||
|
|
||||||
|
@ -49,6 +50,7 @@ class YuzuApplication : Application() {
|
||||||
DirectoryInitialization.start()
|
DirectoryInitialization.start()
|
||||||
GpuDriverHelper.initializeDriverParameters()
|
GpuDriverHelper.initializeDriverParameters()
|
||||||
NativeLibrary.logDeviceInfo()
|
NativeLibrary.logDeviceInfo()
|
||||||
|
Log.logDeviceInfo()
|
||||||
|
|
||||||
createNotificationChannels()
|
createNotificationChannels()
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ import org.yuzu.yuzu_emu.model.EmulationViewModel
|
||||||
import org.yuzu.yuzu_emu.model.Game
|
import org.yuzu.yuzu_emu.model.Game
|
||||||
import org.yuzu.yuzu_emu.utils.ForegroundService
|
import org.yuzu.yuzu_emu.utils.ForegroundService
|
||||||
import org.yuzu.yuzu_emu.utils.InputHandler
|
import org.yuzu.yuzu_emu.utils.InputHandler
|
||||||
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
import org.yuzu.yuzu_emu.utils.MemoryUtil
|
import org.yuzu.yuzu_emu.utils.MemoryUtil
|
||||||
import org.yuzu.yuzu_emu.utils.NfcReader
|
import org.yuzu.yuzu_emu.utils.NfcReader
|
||||||
import org.yuzu.yuzu_emu.utils.ThemeHelper
|
import org.yuzu.yuzu_emu.utils.ThemeHelper
|
||||||
|
@ -80,6 +81,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
Log.gameLaunched = true
|
||||||
ThemeHelper.setTheme(this)
|
ThemeHelper.setTheme(this)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -105,7 +107,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
|
|
||||||
val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
||||||
if (!preferences.getBoolean(Settings.PREF_MEMORY_WARNING_SHOWN, false)) {
|
if (!preferences.getBoolean(Settings.PREF_MEMORY_WARNING_SHOWN, false)) {
|
||||||
if (MemoryUtil.isLessThan(MemoryUtil.REQUIRED_MEMORY, MemoryUtil.Gb)) {
|
if (MemoryUtil.isLessThan(MemoryUtil.REQUIRED_MEMORY, MemoryUtil.totalMemory)) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
this,
|
this,
|
||||||
getString(
|
getString(
|
||||||
|
@ -371,8 +373,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
||||||
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
val isEmulationActive = emulationViewModel.emulationStarted.value &&
|
||||||
|
!emulationViewModel.isEmulationStopping.value
|
||||||
pictureInPictureParamsBuilder.setAutoEnterEnabled(
|
pictureInPictureParamsBuilder.setAutoEnterEnabled(
|
||||||
BooleanSetting.PICTURE_IN_PICTURE.boolean
|
BooleanSetting.PICTURE_IN_PICTURE.boolean && isEmulationActive
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
setPictureInPictureParams(pictureInPictureParamsBuilder.build())
|
setPictureInPictureParams(pictureInPictureParamsBuilder.build())
|
||||||
|
|
|
@ -22,12 +22,16 @@ import androidx.core.graphics.drawable.toBitmap
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.recyclerview.widget.ListAdapter
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
import org.yuzu.yuzu_emu.HomeNavigationDirections
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
|
@ -92,28 +96,34 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
||||||
data = Uri.parse(holder.game.path)
|
data = Uri.parse(holder.game.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
val layerDrawable = ResourcesCompat.getDrawable(
|
activity.lifecycleScope.launch {
|
||||||
YuzuApplication.appContext.resources,
|
withContext(Dispatchers.IO) {
|
||||||
R.drawable.shortcut,
|
val layerDrawable = ResourcesCompat.getDrawable(
|
||||||
null
|
YuzuApplication.appContext.resources,
|
||||||
) as LayerDrawable
|
R.drawable.shortcut,
|
||||||
layerDrawable.setDrawableByLayerId(
|
null
|
||||||
R.id.shortcut_foreground,
|
) as LayerDrawable
|
||||||
GameIconUtils.getGameIcon(holder.game).toDrawable(YuzuApplication.appContext.resources)
|
layerDrawable.setDrawableByLayerId(
|
||||||
)
|
R.id.shortcut_foreground,
|
||||||
val inset = YuzuApplication.appContext.resources
|
GameIconUtils.getGameIcon(activity, holder.game)
|
||||||
.getDimensionPixelSize(R.dimen.icon_inset)
|
.toDrawable(YuzuApplication.appContext.resources)
|
||||||
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
|
|
||||||
val shortcut = ShortcutInfoCompat.Builder(YuzuApplication.appContext, holder.game.path)
|
|
||||||
.setShortLabel(holder.game.title)
|
|
||||||
.setIcon(
|
|
||||||
IconCompat.createWithAdaptiveBitmap(
|
|
||||||
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
|
|
||||||
)
|
)
|
||||||
)
|
val inset = YuzuApplication.appContext.resources
|
||||||
.setIntent(openIntent)
|
.getDimensionPixelSize(R.dimen.icon_inset)
|
||||||
.build()
|
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
|
||||||
ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
|
val shortcut =
|
||||||
|
ShortcutInfoCompat.Builder(YuzuApplication.appContext, holder.game.path)
|
||||||
|
.setShortLabel(holder.game.title)
|
||||||
|
.setIcon(
|
||||||
|
IconCompat.createWithAdaptiveBitmap(
|
||||||
|
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.setIntent(openIntent)
|
||||||
|
.build()
|
||||||
|
ShortcutManagerCompat.pushDynamicShortcut(YuzuApplication.appContext, shortcut)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val action = HomeNavigationDirections.actionGlobalEmulationActivity(holder.game)
|
val action = HomeNavigationDirections.actionGlobalEmulationActivity(holder.game)
|
||||||
view.findNavController().navigate(action)
|
view.findNavController().navigate(action)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import android.text.TextUtils
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
|
|
||||||
object Settings {
|
object Settings {
|
||||||
private val context get() = YuzuApplication.appContext
|
private val context get() = YuzuApplication.appContext
|
||||||
|
@ -19,7 +19,7 @@ object Settings {
|
||||||
context.getString(R.string.ini_saved),
|
context.getString(R.string.ini_saved),
|
||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
SettingsFile.saveFile(SettingsFile.FILE_NAME_CONFIG)
|
NativeConfig.saveSettings()
|
||||||
} else {
|
} else {
|
||||||
// TODO: Save custom game settings
|
// TODO: Save custom game settings
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
|
@ -82,7 +82,6 @@ object Settings {
|
||||||
|
|
||||||
enum class MenuTag(val titleId: Int) {
|
enum class MenuTag(val titleId: Int) {
|
||||||
SECTION_ROOT(R.string.advanced_settings),
|
SECTION_ROOT(R.string.advanced_settings),
|
||||||
SECTION_GENERAL(R.string.preferences_general),
|
|
||||||
SECTION_SYSTEM(R.string.preferences_system),
|
SECTION_SYSTEM(R.string.preferences_system),
|
||||||
SECTION_RENDERER(R.string.preferences_graphics),
|
SECTION_RENDERER(R.string.preferences_graphics),
|
||||||
SECTION_AUDIO(R.string.preferences_audio),
|
SECTION_AUDIO(R.string.preferences_audio),
|
||||||
|
|
|
@ -3,10 +3,13 @@
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.model.view
|
package org.yuzu.yuzu_emu.features.settings.model.view
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
|
||||||
class RunnableSetting(
|
class RunnableSetting(
|
||||||
titleId: Int,
|
titleId: Int,
|
||||||
descriptionId: Int,
|
descriptionId: Int,
|
||||||
val isRuntimeRunnable: Boolean,
|
val isRuntimeRunnable: Boolean,
|
||||||
|
@DrawableRes val iconId: Int = 0,
|
||||||
val runnable: () -> Unit
|
val runnable: () -> Unit
|
||||||
) : SettingsItem(emptySetting, titleId, descriptionId) {
|
) : SettingsItem(emptySetting, titleId, descriptionId) {
|
||||||
override val type = TYPE_RUNNABLE
|
override val type = TYPE_RUNNABLE
|
||||||
|
|
|
@ -73,7 +73,7 @@ abstract class SettingsItem(
|
||||||
R.string.frame_limit_slider,
|
R.string.frame_limit_slider,
|
||||||
R.string.frame_limit_slider_description,
|
R.string.frame_limit_slider_description,
|
||||||
1,
|
1,
|
||||||
200,
|
400,
|
||||||
"%"
|
"%"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,11 +3,14 @@
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.model.view
|
package org.yuzu.yuzu_emu.features.settings.model.view
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.annotation.StringRes
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||||
|
|
||||||
class SubmenuSetting(
|
class SubmenuSetting(
|
||||||
titleId: Int,
|
@StringRes titleId: Int,
|
||||||
descriptionId: Int,
|
@StringRes descriptionId: Int,
|
||||||
|
@DrawableRes val iconId: Int,
|
||||||
val menuKey: Settings.MenuTag
|
val menuKey: Settings.MenuTag
|
||||||
) : SettingsItem(emptySetting, titleId, descriptionId) {
|
) : SettingsItem(emptySetting, titleId, descriptionId) {
|
||||||
override val type = TYPE_SUBMENU
|
override val type = TYPE_SUBMENU
|
||||||
|
|
|
@ -21,7 +21,6 @@ import androidx.navigation.navArgs
|
||||||
import com.google.android.material.color.MaterialColors
|
import com.google.android.material.color.MaterialColors
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding
|
import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding
|
||||||
|
@ -165,11 +164,12 @@ class SettingsActivity : AppCompatActivity() {
|
||||||
settingsViewModel.shouldSave = false
|
settingsViewModel.shouldSave = false
|
||||||
|
|
||||||
// Delete settings file because the user may have changed values that do not exist in the UI
|
// Delete settings file because the user may have changed values that do not exist in the UI
|
||||||
|
NativeConfig.unloadConfig()
|
||||||
val settingsFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_CONFIG)
|
val settingsFile = SettingsFile.getSettingsFile(SettingsFile.FILE_NAME_CONFIG)
|
||||||
if (!settingsFile.delete()) {
|
if (!settingsFile.delete()) {
|
||||||
throw IOException("Failed to delete $settingsFile")
|
throw IOException("Failed to delete $settingsFile")
|
||||||
}
|
}
|
||||||
NativeLibrary.reloadSettings()
|
NativeConfig.initializeConfig()
|
||||||
|
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
applicationContext,
|
applicationContext,
|
||||||
|
|
|
@ -20,7 +20,6 @@ import androidx.lifecycle.repeatOnLifecycle
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.google.android.material.divider.MaterialDividerItemDecoration
|
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -68,15 +67,9 @@ class SettingsFragment : Fragment() {
|
||||||
)
|
)
|
||||||
|
|
||||||
binding.toolbarSettingsLayout.title = getString(args.menuTag.titleId)
|
binding.toolbarSettingsLayout.title = getString(args.menuTag.titleId)
|
||||||
val dividerDecoration = MaterialDividerItemDecoration(
|
|
||||||
requireContext(),
|
|
||||||
LinearLayoutManager.VERTICAL
|
|
||||||
)
|
|
||||||
dividerDecoration.isLastItemDecorated = false
|
|
||||||
binding.listSettings.apply {
|
binding.listSettings.apply {
|
||||||
adapter = settingsAdapter
|
adapter = settingsAdapter
|
||||||
layoutManager = LinearLayoutManager(requireContext())
|
layoutManager = LinearLayoutManager(requireContext())
|
||||||
addItemDecoration(dividerDecoration)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.toolbarSettings.setNavigationOnClickListener {
|
binding.toolbarSettings.setNavigationOnClickListener {
|
||||||
|
@ -94,17 +87,6 @@ class SettingsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
launch {
|
|
||||||
settingsViewModel.isUsingSearch.collectLatest {
|
|
||||||
if (it) {
|
|
||||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
|
|
||||||
exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
|
||||||
} else {
|
|
||||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
|
||||||
exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.menuTag == Settings.MenuTag.SECTION_ROOT) {
|
if (args.menuTag == Settings.MenuTag.SECTION_ROOT) {
|
||||||
|
@ -112,8 +94,6 @@ class SettingsFragment : Fragment() {
|
||||||
binding.toolbarSettings.setOnMenuItemClickListener {
|
binding.toolbarSettings.setOnMenuItemClickListener {
|
||||||
when (it.itemId) {
|
when (it.itemId) {
|
||||||
R.id.action_search -> {
|
R.id.action_search -> {
|
||||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
|
|
||||||
exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
|
||||||
view.findNavController()
|
view.findNavController()
|
||||||
.navigate(R.id.action_settingsFragment_to_settingsSearchFragment)
|
.navigate(R.id.action_settingsFragment_to_settingsSearchFragment)
|
||||||
true
|
true
|
||||||
|
@ -129,11 +109,6 @@ class SettingsFragment : Fragment() {
|
||||||
setInsets()
|
setInsets()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
settingsViewModel.setIsUsingSearch(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setInsets() {
|
private fun setInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(
|
ViewCompat.setOnApplyWindowInsetsListener(
|
||||||
binding.root
|
binding.root
|
||||||
|
@ -144,10 +119,9 @@ class SettingsFragment : Fragment() {
|
||||||
val leftInsets = barInsets.left + cutoutInsets.left
|
val leftInsets = barInsets.left + cutoutInsets.left
|
||||||
val rightInsets = barInsets.right + cutoutInsets.right
|
val rightInsets = barInsets.right + cutoutInsets.right
|
||||||
|
|
||||||
val sideMargin = resources.getDimensionPixelSize(R.dimen.spacing_medlarge)
|
|
||||||
val mlpSettingsList = binding.listSettings.layoutParams as MarginLayoutParams
|
val mlpSettingsList = binding.listSettings.layoutParams as MarginLayoutParams
|
||||||
mlpSettingsList.leftMargin = sideMargin + leftInsets
|
mlpSettingsList.leftMargin = leftInsets
|
||||||
mlpSettingsList.rightMargin = sideMargin + rightInsets
|
mlpSettingsList.rightMargin = rightInsets
|
||||||
binding.listSettings.layoutParams = mlpSettingsList
|
binding.listSettings.layoutParams = mlpSettingsList
|
||||||
binding.listSettings.updatePadding(
|
binding.listSettings.updatePadding(
|
||||||
bottom = barInsets.bottom
|
bottom = barInsets.bottom
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui
|
package org.yuzu.yuzu_emu.features.settings.ui
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
@ -32,8 +31,6 @@ class SettingsFragmentPresenter(
|
||||||
private val preferences: SharedPreferences
|
private val preferences: SharedPreferences
|
||||||
get() = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
get() = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
||||||
|
|
||||||
private val context: Context get() = YuzuApplication.appContext
|
|
||||||
|
|
||||||
// Extension for populating settings list based on paired settings
|
// Extension for populating settings list based on paired settings
|
||||||
fun ArrayList<SettingsItem>.add(key: String) {
|
fun ArrayList<SettingsItem>.add(key: String) {
|
||||||
val item = SettingsItem.settingsItems[key]!!
|
val item = SettingsItem.settingsItems[key]!!
|
||||||
|
@ -53,7 +50,6 @@ class SettingsFragmentPresenter(
|
||||||
val sl = ArrayList<SettingsItem>()
|
val sl = ArrayList<SettingsItem>()
|
||||||
when (menuTag) {
|
when (menuTag) {
|
||||||
Settings.MenuTag.SECTION_ROOT -> addConfigSettings(sl)
|
Settings.MenuTag.SECTION_ROOT -> addConfigSettings(sl)
|
||||||
Settings.MenuTag.SECTION_GENERAL -> addGeneralSettings(sl)
|
|
||||||
Settings.MenuTag.SECTION_SYSTEM -> addSystemSettings(sl)
|
Settings.MenuTag.SECTION_SYSTEM -> addSystemSettings(sl)
|
||||||
Settings.MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
|
Settings.MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
|
||||||
Settings.MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
|
Settings.MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
|
||||||
|
@ -75,30 +71,53 @@ class SettingsFragmentPresenter(
|
||||||
|
|
||||||
private fun addConfigSettings(sl: ArrayList<SettingsItem>) {
|
private fun addConfigSettings(sl: ArrayList<SettingsItem>) {
|
||||||
sl.apply {
|
sl.apply {
|
||||||
add(SubmenuSetting(R.string.preferences_general, 0, Settings.MenuTag.SECTION_GENERAL))
|
|
||||||
add(SubmenuSetting(R.string.preferences_system, 0, Settings.MenuTag.SECTION_SYSTEM))
|
|
||||||
add(SubmenuSetting(R.string.preferences_graphics, 0, Settings.MenuTag.SECTION_RENDERER))
|
|
||||||
add(SubmenuSetting(R.string.preferences_audio, 0, Settings.MenuTag.SECTION_AUDIO))
|
|
||||||
add(SubmenuSetting(R.string.preferences_debug, 0, Settings.MenuTag.SECTION_DEBUG))
|
|
||||||
add(
|
add(
|
||||||
RunnableSetting(R.string.reset_to_default, 0, false) {
|
SubmenuSetting(
|
||||||
settingsViewModel.setShouldShowResetSettingsDialog(true)
|
R.string.preferences_system,
|
||||||
}
|
R.string.preferences_system_description,
|
||||||
|
R.drawable.ic_system_settings,
|
||||||
|
Settings.MenuTag.SECTION_SYSTEM
|
||||||
|
)
|
||||||
|
)
|
||||||
|
add(
|
||||||
|
SubmenuSetting(
|
||||||
|
R.string.preferences_graphics,
|
||||||
|
R.string.preferences_graphics_description,
|
||||||
|
R.drawable.ic_graphics,
|
||||||
|
Settings.MenuTag.SECTION_RENDERER
|
||||||
|
)
|
||||||
|
)
|
||||||
|
add(
|
||||||
|
SubmenuSetting(
|
||||||
|
R.string.preferences_audio,
|
||||||
|
R.string.preferences_audio_description,
|
||||||
|
R.drawable.ic_audio,
|
||||||
|
Settings.MenuTag.SECTION_AUDIO
|
||||||
|
)
|
||||||
|
)
|
||||||
|
add(
|
||||||
|
SubmenuSetting(
|
||||||
|
R.string.preferences_debug,
|
||||||
|
R.string.preferences_debug_description,
|
||||||
|
R.drawable.ic_code,
|
||||||
|
Settings.MenuTag.SECTION_DEBUG
|
||||||
|
)
|
||||||
|
)
|
||||||
|
add(
|
||||||
|
RunnableSetting(
|
||||||
|
R.string.reset_to_default,
|
||||||
|
R.string.reset_to_default_description,
|
||||||
|
false,
|
||||||
|
R.drawable.ic_restore
|
||||||
|
) { settingsViewModel.setShouldShowResetSettingsDialog(true) }
|
||||||
)
|
)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addGeneralSettings(sl: ArrayList<SettingsItem>) {
|
|
||||||
sl.apply {
|
|
||||||
add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key)
|
|
||||||
add(ShortSetting.RENDERER_SPEED_LIMIT.key)
|
|
||||||
add(IntSetting.CPU_ACCURACY.key)
|
|
||||||
add(BooleanSetting.PICTURE_IN_PICTURE.key)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addSystemSettings(sl: ArrayList<SettingsItem>) {
|
private fun addSystemSettings(sl: ArrayList<SettingsItem>) {
|
||||||
sl.apply {
|
sl.apply {
|
||||||
|
add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key)
|
||||||
|
add(ShortSetting.RENDERER_SPEED_LIMIT.key)
|
||||||
add(BooleanSetting.USE_DOCKED_MODE.key)
|
add(BooleanSetting.USE_DOCKED_MODE.key)
|
||||||
add(IntSetting.REGION_INDEX.key)
|
add(IntSetting.REGION_INDEX.key)
|
||||||
add(IntSetting.LANGUAGE_INDEX.key)
|
add(IntSetting.LANGUAGE_INDEX.key)
|
||||||
|
@ -116,6 +135,7 @@ class SettingsFragmentPresenter(
|
||||||
add(IntSetting.RENDERER_ANTI_ALIASING.key)
|
add(IntSetting.RENDERER_ANTI_ALIASING.key)
|
||||||
add(IntSetting.RENDERER_SCREEN_LAYOUT.key)
|
add(IntSetting.RENDERER_SCREEN_LAYOUT.key)
|
||||||
add(IntSetting.RENDERER_ASPECT_RATIO.key)
|
add(IntSetting.RENDERER_ASPECT_RATIO.key)
|
||||||
|
add(BooleanSetting.PICTURE_IN_PICTURE.key)
|
||||||
add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
|
add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
|
||||||
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||||
|
@ -249,6 +269,7 @@ class SettingsFragmentPresenter(
|
||||||
add(BooleanSetting.RENDERER_DEBUG.key)
|
add(BooleanSetting.RENDERER_DEBUG.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.cpu))
|
add(HeaderSetting(R.string.cpu))
|
||||||
|
add(IntSetting.CPU_ACCURACY.key)
|
||||||
add(BooleanSetting.CPU_DEBUG_MODE.key)
|
add(BooleanSetting.CPU_DEBUG_MODE.key)
|
||||||
add(SettingsItem.FASTMEM_COMBINED)
|
add(SettingsItem.FASTMEM_COMBINED)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.RunnableSetting
|
||||||
|
@ -16,6 +17,19 @@ class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsA
|
||||||
|
|
||||||
override fun bind(item: SettingsItem) {
|
override fun bind(item: SettingsItem) {
|
||||||
setting = item as RunnableSetting
|
setting = item as RunnableSetting
|
||||||
|
if (item.iconId != 0) {
|
||||||
|
binding.icon.visibility = View.VISIBLE
|
||||||
|
binding.icon.setImageDrawable(
|
||||||
|
ResourcesCompat.getDrawable(
|
||||||
|
binding.icon.resources,
|
||||||
|
item.iconId,
|
||||||
|
binding.icon.context.theme
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
binding.icon.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
binding.textSettingName.setText(item.nameId)
|
binding.textSettingName.setText(item.nameId)
|
||||||
if (item.descriptionId != 0) {
|
if (item.descriptionId != 0) {
|
||||||
binding.textSettingDescription.setText(item.descriptionId)
|
binding.textSettingDescription.setText(item.descriptionId)
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.SubmenuSetting
|
||||||
|
@ -15,6 +16,19 @@ class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAd
|
||||||
|
|
||||||
override fun bind(item: SettingsItem) {
|
override fun bind(item: SettingsItem) {
|
||||||
this.item = item as SubmenuSetting
|
this.item = item as SubmenuSetting
|
||||||
|
if (item.iconId != 0) {
|
||||||
|
binding.icon.visibility = View.VISIBLE
|
||||||
|
binding.icon.setImageDrawable(
|
||||||
|
ResourcesCompat.getDrawable(
|
||||||
|
binding.icon.resources,
|
||||||
|
item.iconId,
|
||||||
|
binding.icon.context.theme
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
binding.icon.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
binding.textSettingName.setText(item.nameId)
|
binding.textSettingName.setText(item.nameId)
|
||||||
if (item.descriptionId != 0) {
|
if (item.descriptionId != 0) {
|
||||||
binding.textSettingDescription.setText(item.descriptionId)
|
binding.textSettingDescription.setText(item.descriptionId)
|
||||||
|
|
|
@ -3,15 +3,8 @@
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.utils
|
package org.yuzu.yuzu_emu.features.settings.utils
|
||||||
|
|
||||||
import android.widget.Toast
|
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import org.ini4j.Wini
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.*
|
|
||||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||||
import org.yuzu.yuzu_emu.utils.Log
|
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains static methods for interacting with .ini files in which settings are stored.
|
* Contains static methods for interacting with .ini files in which settings are stored.
|
||||||
|
@ -19,41 +12,6 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
object SettingsFile {
|
object SettingsFile {
|
||||||
const val FILE_NAME_CONFIG = "config"
|
const val FILE_NAME_CONFIG = "config"
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves a Settings HashMap to a given .ini file on disk. If unsuccessful, outputs an error
|
|
||||||
* telling why it failed.
|
|
||||||
*
|
|
||||||
* @param fileName The target filename without a path or extension.
|
|
||||||
*/
|
|
||||||
fun saveFile(fileName: String) {
|
|
||||||
val ini = getSettingsFile(fileName)
|
|
||||||
try {
|
|
||||||
val wini = Wini(ini)
|
|
||||||
for (specificCategory in Settings.Category.values()) {
|
|
||||||
val categoryHeader = NativeConfig.getConfigHeader(specificCategory.ordinal)
|
|
||||||
for (setting in Settings.settingsList) {
|
|
||||||
if (setting.key!!.isEmpty()) continue
|
|
||||||
|
|
||||||
val settingCategoryHeader =
|
|
||||||
NativeConfig.getConfigHeader(setting.category.ordinal)
|
|
||||||
val iniSetting: String? = wini.get(categoryHeader, setting.key)
|
|
||||||
if (iniSetting != null || settingCategoryHeader == categoryHeader) {
|
|
||||||
wini.put(settingCategoryHeader, setting.key, setting.valueAsString)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wini.store()
|
|
||||||
} catch (e: IOException) {
|
|
||||||
Log.error("[SettingsFile] File not found: " + fileName + ".ini: " + e.message)
|
|
||||||
val context = YuzuApplication.appContext
|
|
||||||
Toast.makeText(
|
|
||||||
context,
|
|
||||||
context.getString(R.string.error_saving, fileName, e.message),
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSettingsFile(fileName: String): File =
|
fun getSettingsFile(fileName: String): File =
|
||||||
File(DirectoryInitialization.userDirectory + "/config/" + fileName + ".ini")
|
File(DirectoryInitialization.userDirectory + "/config/" + fileName + ".ini")
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,10 +114,10 @@ class AboutFragment : Fragment() {
|
||||||
val leftInsets = barInsets.left + cutoutInsets.left
|
val leftInsets = barInsets.left + cutoutInsets.left
|
||||||
val rightInsets = barInsets.right + cutoutInsets.right
|
val rightInsets = barInsets.right + cutoutInsets.right
|
||||||
|
|
||||||
val mlpAppBar = binding.appbarAbout.layoutParams as MarginLayoutParams
|
val mlpToolbar = binding.toolbarAbout.layoutParams as MarginLayoutParams
|
||||||
mlpAppBar.leftMargin = leftInsets
|
mlpToolbar.leftMargin = leftInsets
|
||||||
mlpAppBar.rightMargin = rightInsets
|
mlpToolbar.rightMargin = rightInsets
|
||||||
binding.appbarAbout.layoutParams = mlpAppBar
|
binding.toolbarAbout.layoutParams = mlpToolbar
|
||||||
|
|
||||||
val mlpScrollAbout = binding.scrollAbout.layoutParams as MarginLayoutParams
|
val mlpScrollAbout = binding.scrollAbout.layoutParams as MarginLayoutParams
|
||||||
mlpScrollAbout.leftMargin = leftInsets
|
mlpScrollAbout.leftMargin = leftInsets
|
||||||
|
|
|
@ -10,7 +10,6 @@ import android.content.DialogInterface
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
|
@ -155,7 +154,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.surfaceEmulation.holder.addCallback(this)
|
binding.surfaceEmulation.holder.addCallback(this)
|
||||||
binding.showFpsText.setTextColor(Color.YELLOW)
|
|
||||||
binding.doneControlConfig.setOnClickListener { stopConfiguringControls() }
|
binding.doneControlConfig.setOnClickListener { stopConfiguringControls() }
|
||||||
|
|
||||||
binding.drawerLayout.addDrawerListener(object : DrawerListener {
|
binding.drawerLayout.addDrawerListener(object : DrawerListener {
|
||||||
|
@ -312,6 +310,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
ViewUtils.showView(binding.surfaceInputOverlay)
|
ViewUtils.showView(binding.surfaceInputOverlay)
|
||||||
ViewUtils.hideView(binding.loadingIndicator)
|
ViewUtils.hideView(binding.loadingIndicator)
|
||||||
|
|
||||||
|
emulationState.updateSurface()
|
||||||
|
|
||||||
// Setup overlay
|
// Setup overlay
|
||||||
updateShowFpsOverlay()
|
updateShowFpsOverlay()
|
||||||
}
|
}
|
||||||
|
@ -412,12 +412,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
val FRAMETIME = 2
|
val FRAMETIME = 2
|
||||||
val SPEED = 3
|
val SPEED = 3
|
||||||
perfStatsUpdater = {
|
perfStatsUpdater = {
|
||||||
if (emulationViewModel.emulationStarted.value == true) {
|
if (emulationViewModel.emulationStarted.value) {
|
||||||
val perfStats = NativeLibrary.getPerfStats()
|
val perfStats = NativeLibrary.getPerfStats()
|
||||||
if (perfStats[FPS] > 0 && _binding != null) {
|
if (_binding != null) {
|
||||||
binding.showFpsText.text = String.format("FPS: %.1f", perfStats[FPS])
|
binding.showFpsText.text = String.format("FPS: %.1f", perfStats[FPS])
|
||||||
}
|
}
|
||||||
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 100)
|
perfStatsUpdateHandler.postDelayed(perfStatsUpdater!!, 800)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
perfStatsUpdateHandler.post(perfStatsUpdater!!)
|
perfStatsUpdateHandler.post(perfStatsUpdater!!)
|
||||||
|
@ -462,7 +462,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
if (it.orientation == FoldingFeature.Orientation.HORIZONTAL) {
|
if (it.orientation == FoldingFeature.Orientation.HORIZONTAL) {
|
||||||
// Restrict emulation and overlays to the top of the screen
|
// Restrict emulation and overlays to the top of the screen
|
||||||
binding.emulationContainer.layoutParams.height = it.bounds.top
|
binding.emulationContainer.layoutParams.height = it.bounds.top
|
||||||
binding.overlayContainer.layoutParams.height = it.bounds.top
|
|
||||||
// Restrict input and menu drawer to the bottom of the screen
|
// Restrict input and menu drawer to the bottom of the screen
|
||||||
binding.inputContainer.layoutParams.height = it.bounds.bottom
|
binding.inputContainer.layoutParams.height = it.bounds.bottom
|
||||||
binding.inGameMenu.layoutParams.height = it.bounds.bottom
|
binding.inGameMenu.layoutParams.height = it.bounds.bottom
|
||||||
|
@ -476,7 +475,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
if (!isFolding) {
|
if (!isFolding) {
|
||||||
binding.emulationContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
binding.emulationContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
binding.inputContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
binding.inputContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
binding.overlayContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
|
||||||
binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
isInFoldableLayout = false
|
isInFoldableLayout = false
|
||||||
updateOrientation()
|
updateOrientation()
|
||||||
|
@ -484,7 +482,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
binding.emulationContainer.requestLayout()
|
binding.emulationContainer.requestLayout()
|
||||||
binding.inputContainer.requestLayout()
|
binding.inputContainer.requestLayout()
|
||||||
binding.overlayContainer.requestLayout()
|
|
||||||
binding.inGameMenu.requestLayout()
|
binding.inGameMenu.requestLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,24 +707,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
v.setPadding(left, cutInsets.top, right, 0)
|
v.setPadding(left, cutInsets.top, right, 0)
|
||||||
|
|
||||||
// Ensure FPS text doesn't get cut off by rounded display corners
|
|
||||||
val sidePadding = resources.getDimensionPixelSize(R.dimen.spacing_xtralarge)
|
|
||||||
if (cutInsets.left == 0) {
|
|
||||||
binding.showFpsText.setPadding(
|
|
||||||
sidePadding,
|
|
||||||
cutInsets.top,
|
|
||||||
cutInsets.right,
|
|
||||||
cutInsets.bottom
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
binding.showFpsText.setPadding(
|
|
||||||
cutInsets.left,
|
|
||||||
cutInsets.top,
|
|
||||||
cutInsets.right,
|
|
||||||
cutInsets.bottom
|
|
||||||
)
|
|
||||||
}
|
|
||||||
windowInsets
|
windowInsets
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -804,6 +783,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun updateSurface() {
|
||||||
|
if (surface != null) {
|
||||||
|
NativeLibrary.surfaceChanged(surface)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun clearSurface() {
|
fun clearSurface() {
|
||||||
if (surface == null) {
|
if (surface == null) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
||||||
import org.yuzu.yuzu_emu.utils.FileUtil
|
import org.yuzu.yuzu_emu.utils.FileUtil
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
|
|
||||||
class HomeSettingsFragment : Fragment() {
|
class HomeSettingsFragment : Fragment() {
|
||||||
private var _binding: FragmentHomeSettingsBinding? = null
|
private var _binding: FragmentHomeSettingsBinding? = null
|
||||||
|
@ -84,28 +85,6 @@ class HomeSettingsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
add(
|
|
||||||
HomeSetting(
|
|
||||||
R.string.open_user_folder,
|
|
||||||
R.string.open_user_folder_description,
|
|
||||||
R.drawable.ic_folder_open,
|
|
||||||
{ openFileManager() }
|
|
||||||
)
|
|
||||||
)
|
|
||||||
add(
|
|
||||||
HomeSetting(
|
|
||||||
R.string.preferences_theme,
|
|
||||||
R.string.theme_and_color_description,
|
|
||||||
R.drawable.ic_palette,
|
|
||||||
{
|
|
||||||
val action = HomeNavigationDirections.actionGlobalSettingsActivity(
|
|
||||||
null,
|
|
||||||
Settings.MenuTag.SECTION_THEME
|
|
||||||
)
|
|
||||||
binding.root.findNavController().navigate(action)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.gpu_driver_manager,
|
R.string.gpu_driver_manager,
|
||||||
|
@ -121,17 +100,6 @@ class HomeSettingsFragment : Fragment() {
|
||||||
driverViewModel.selectedDriverMetadata
|
driverViewModel.selectedDriverMetadata
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
add(
|
|
||||||
HomeSetting(
|
|
||||||
R.string.manage_yuzu_data,
|
|
||||||
R.string.manage_yuzu_data_description,
|
|
||||||
R.drawable.ic_install,
|
|
||||||
{
|
|
||||||
binding.root.findNavController()
|
|
||||||
.navigate(R.id.action_homeSettingsFragment_to_installableFragment)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.applets,
|
R.string.applets,
|
||||||
|
@ -146,6 +114,17 @@ class HomeSettingsFragment : Fragment() {
|
||||||
R.string.applets_error_description
|
R.string.applets_error_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
add(
|
||||||
|
HomeSetting(
|
||||||
|
R.string.manage_yuzu_data,
|
||||||
|
R.string.manage_yuzu_data_description,
|
||||||
|
R.drawable.ic_install,
|
||||||
|
{
|
||||||
|
binding.root.findNavController()
|
||||||
|
.navigate(R.id.action_homeSettingsFragment_to_installableFragment)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.select_games_folder,
|
R.string.select_games_folder,
|
||||||
|
@ -170,6 +149,28 @@ class HomeSettingsFragment : Fragment() {
|
||||||
{ shareLog() }
|
{ shareLog() }
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
add(
|
||||||
|
HomeSetting(
|
||||||
|
R.string.open_user_folder,
|
||||||
|
R.string.open_user_folder_description,
|
||||||
|
R.drawable.ic_folder_open,
|
||||||
|
{ openFileManager() }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
add(
|
||||||
|
HomeSetting(
|
||||||
|
R.string.preferences_theme,
|
||||||
|
R.string.theme_and_color_description,
|
||||||
|
R.drawable.ic_palette,
|
||||||
|
{
|
||||||
|
val action = HomeNavigationDirections.actionGlobalSettingsActivity(
|
||||||
|
null,
|
||||||
|
Settings.MenuTag.SECTION_THEME
|
||||||
|
)
|
||||||
|
binding.root.findNavController().navigate(action)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.about,
|
R.string.about,
|
||||||
|
@ -312,19 +313,32 @@ class HomeSettingsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Share the current log if we just returned from a game but share the old log
|
||||||
|
// if we just started the app and the old log exists.
|
||||||
private fun shareLog() {
|
private fun shareLog() {
|
||||||
val file = DocumentFile.fromSingleUri(
|
val currentLog = DocumentFile.fromSingleUri(
|
||||||
mainActivity,
|
mainActivity,
|
||||||
DocumentsContract.buildDocumentUri(
|
DocumentsContract.buildDocumentUri(
|
||||||
DocumentProvider.AUTHORITY,
|
DocumentProvider.AUTHORITY,
|
||||||
"${DocumentProvider.ROOT_ID}/log/yuzu_log.txt"
|
"${DocumentProvider.ROOT_ID}/log/yuzu_log.txt"
|
||||||
)
|
)
|
||||||
)!!
|
)!!
|
||||||
if (file.exists()) {
|
val oldLog = DocumentFile.fromSingleUri(
|
||||||
val intent = Intent(Intent.ACTION_SEND)
|
mainActivity,
|
||||||
.setDataAndType(file.uri, FileUtil.TEXT_PLAIN)
|
DocumentsContract.buildDocumentUri(
|
||||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
DocumentProvider.AUTHORITY,
|
||||||
.putExtra(Intent.EXTRA_STREAM, file.uri)
|
"${DocumentProvider.ROOT_ID}/log/yuzu_log.txt.old.txt"
|
||||||
|
)
|
||||||
|
)!!
|
||||||
|
|
||||||
|
val intent = Intent(Intent.ACTION_SEND)
|
||||||
|
.setDataAndType(currentLog.uri, FileUtil.TEXT_PLAIN)
|
||||||
|
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
if (!Log.gameLaunched && oldLog.exists()) {
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, oldLog.uri)
|
||||||
|
startActivity(Intent.createChooser(intent, getText(R.string.share_log)))
|
||||||
|
} else if (currentLog.exists()) {
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, currentLog.uri)
|
||||||
startActivity(Intent.createChooser(intent, getText(R.string.share_log)))
|
startActivity(Intent.createChooser(intent, getText(R.string.share_log)))
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
|
|
|
@ -21,6 +21,8 @@ import org.yuzu.yuzu_emu.databinding.FragmentInstallablesBinding
|
||||||
import org.yuzu.yuzu_emu.model.HomeViewModel
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
import org.yuzu.yuzu_emu.model.Installable
|
import org.yuzu.yuzu_emu.model.Installable
|
||||||
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
class InstallableFragment : Fragment() {
|
class InstallableFragment : Fragment() {
|
||||||
private var _binding: FragmentInstallablesBinding? = null
|
private var _binding: FragmentInstallablesBinding? = null
|
||||||
|
@ -78,7 +80,15 @@ class InstallableFragment : Fragment() {
|
||||||
R.string.manage_save_data,
|
R.string.manage_save_data,
|
||||||
R.string.import_export_saves_description,
|
R.string.import_export_saves_description,
|
||||||
install = { mainActivity.importSaves.launch(arrayOf("application/zip")) },
|
install = { mainActivity.importSaves.launch(arrayOf("application/zip")) },
|
||||||
export = { mainActivity.exportSave() }
|
export = {
|
||||||
|
mainActivity.exportSaves.launch(
|
||||||
|
"yuzu saves - ${
|
||||||
|
LocalDateTime.now().format(
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
|
||||||
|
)
|
||||||
|
}.zip"
|
||||||
|
)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Installable(
|
Installable(
|
||||||
|
|
|
@ -40,8 +40,10 @@ class SettingsSearchFragment : Fragment() {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
||||||
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
|
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
|
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
|
exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
@ -55,7 +57,6 @@ class SettingsSearchFragment : Fragment() {
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
settingsViewModel.setIsUsingSearch(true)
|
|
||||||
|
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
binding.searchText.setText(savedInstanceState.getString(SEARCH_TEXT))
|
binding.searchText.setText(savedInstanceState.getString(SEARCH_TEXT))
|
||||||
|
|
|
@ -18,8 +18,8 @@ class Game(
|
||||||
val version: String = "",
|
val version: String = "",
|
||||||
val isHomebrew: Boolean = false
|
val isHomebrew: Boolean = false
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
val keyAddedToLibraryTime get() = "${programId}_AddedToLibraryTime"
|
val keyAddedToLibraryTime get() = "${path}_AddedToLibraryTime"
|
||||||
val keyLastPlayedTime get() = "${programId}_LastPlayed"
|
val keyLastPlayedTime get() = "${path}_LastPlayed"
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (other !is Game) {
|
if (other !is Game) {
|
||||||
|
|
|
@ -29,9 +29,6 @@ class SettingsViewModel : ViewModel() {
|
||||||
val shouldReloadSettingsList: StateFlow<Boolean> get() = _shouldReloadSettingsList
|
val shouldReloadSettingsList: StateFlow<Boolean> get() = _shouldReloadSettingsList
|
||||||
private val _shouldReloadSettingsList = MutableStateFlow(false)
|
private val _shouldReloadSettingsList = MutableStateFlow(false)
|
||||||
|
|
||||||
val isUsingSearch: StateFlow<Boolean> get() = _isUsingSearch
|
|
||||||
private val _isUsingSearch = MutableStateFlow(false)
|
|
||||||
|
|
||||||
val sliderProgress: StateFlow<Int> get() = _sliderProgress
|
val sliderProgress: StateFlow<Int> get() = _sliderProgress
|
||||||
private val _sliderProgress = MutableStateFlow(-1)
|
private val _sliderProgress = MutableStateFlow(-1)
|
||||||
|
|
||||||
|
@ -57,10 +54,6 @@ class SettingsViewModel : ViewModel() {
|
||||||
_shouldReloadSettingsList.value = value
|
_shouldReloadSettingsList.value = value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setIsUsingSearch(value: Boolean) {
|
|
||||||
_isUsingSearch.value = value
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setSliderTextValue(value: Float, units: String) {
|
fun setSliderTextValue(value: Float, units: String) {
|
||||||
_sliderProgress.value = value.toInt()
|
_sliderProgress.value = value.toInt()
|
||||||
_sliderTextValue.value = String.format(
|
_sliderTextValue.value = String.format(
|
||||||
|
|
|
@ -6,7 +6,6 @@ package org.yuzu.yuzu_emu.ui.main
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.DocumentsContract
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup.MarginLayoutParams
|
import android.view.ViewGroup.MarginLayoutParams
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
|
@ -20,7 +19,6 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.documentfile.provider.DocumentFile
|
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.lifecycle.repeatOnLifecycle
|
import androidx.lifecycle.repeatOnLifecycle
|
||||||
|
@ -41,7 +39,6 @@ import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.activities.EmulationActivity
|
import org.yuzu.yuzu_emu.activities.EmulationActivity
|
||||||
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
|
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
|
||||||
import org.yuzu.yuzu_emu.features.DocumentProvider
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||||
import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment
|
import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment
|
||||||
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
||||||
|
@ -53,9 +50,6 @@ import org.yuzu.yuzu_emu.model.TaskViewModel
|
||||||
import org.yuzu.yuzu_emu.utils.*
|
import org.yuzu.yuzu_emu.utils.*
|
||||||
import java.io.BufferedInputStream
|
import java.io.BufferedInputStream
|
||||||
import java.io.BufferedOutputStream
|
import java.io.BufferedOutputStream
|
||||||
import java.io.FileOutputStream
|
|
||||||
import java.time.LocalDateTime
|
|
||||||
import java.time.format.DateTimeFormatter
|
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
import java.util.zip.ZipInputStream
|
import java.util.zip.ZipInputStream
|
||||||
|
|
||||||
|
@ -73,7 +67,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
|
|
||||||
// Get first subfolder in saves folder (should be the user folder)
|
// Get first subfolder in saves folder (should be the user folder)
|
||||||
val savesFolderRoot get() = File(savesFolder).listFiles()?.firstOrNull()?.canonicalPath ?: ""
|
val savesFolderRoot get() = File(savesFolder).listFiles()?.firstOrNull()?.canonicalPath ?: ""
|
||||||
private var lastZipCreated: File? = null
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
val splashScreen = installSplashScreen()
|
val splashScreen = installSplashScreen()
|
||||||
|
@ -403,7 +396,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
} else {
|
} else {
|
||||||
firmwarePath.deleteRecursively()
|
firmwarePath.deleteRecursively()
|
||||||
cacheFirmwareDir.copyRecursively(firmwarePath, true)
|
cacheFirmwareDir.copyRecursively(firmwarePath, true)
|
||||||
NativeLibrary.initializeSystem()
|
NativeLibrary.initializeSystem(true)
|
||||||
getString(R.string.save_file_imported_success)
|
getString(R.string.save_file_imported_success)
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -632,6 +625,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear existing user data
|
// Clear existing user data
|
||||||
|
NativeConfig.unloadConfig()
|
||||||
File(DirectoryInitialization.userDirectory!!).deleteRecursively()
|
File(DirectoryInitialization.userDirectory!!).deleteRecursively()
|
||||||
|
|
||||||
// Copy archive to internal storage
|
// Copy archive to internal storage
|
||||||
|
@ -649,82 +643,39 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reinitialize relevant data
|
// Reinitialize relevant data
|
||||||
NativeLibrary.initializeSystem()
|
NativeLibrary.initializeSystem(true)
|
||||||
|
NativeConfig.initializeConfig()
|
||||||
gamesViewModel.reloadGames(false)
|
gamesViewModel.reloadGames(false)
|
||||||
|
|
||||||
return@newInstance getString(R.string.user_data_import_success)
|
return@newInstance getString(R.string.user_data_import_success)
|
||||||
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Zips the save files located in the given folder path and creates a new zip file with the current date and time.
|
|
||||||
* @return true if the zip file is successfully created, false otherwise.
|
|
||||||
*/
|
|
||||||
private fun zipSave(): Boolean {
|
|
||||||
try {
|
|
||||||
val tempFolder = File(getPublicFilesDir().canonicalPath, "temp")
|
|
||||||
tempFolder.mkdirs()
|
|
||||||
val saveFolder = File(savesFolderRoot)
|
|
||||||
val outputZipFile = File(
|
|
||||||
tempFolder,
|
|
||||||
"yuzu saves - ${
|
|
||||||
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))
|
|
||||||
}.zip"
|
|
||||||
)
|
|
||||||
outputZipFile.createNewFile()
|
|
||||||
val result = FileUtil.zipFromInternalStorage(
|
|
||||||
saveFolder,
|
|
||||||
savesFolderRoot,
|
|
||||||
BufferedOutputStream(FileOutputStream(outputZipFile))
|
|
||||||
)
|
|
||||||
if (result == TaskState.Failed) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
lastZipCreated = outputZipFile
|
|
||||||
} catch (e: Exception) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exports the save file located in the given folder path by creating a zip file and sharing it via intent.
|
* Exports the save file located in the given folder path by creating a zip file and sharing it via intent.
|
||||||
*/
|
*/
|
||||||
fun exportSave() {
|
val exportSaves = registerForActivityResult(
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
ActivityResultContracts.CreateDocument("application/zip")
|
||||||
val wasZipCreated = zipSave()
|
) { result ->
|
||||||
val lastZipFile = lastZipCreated
|
if (result == null) {
|
||||||
if (!wasZipCreated || lastZipFile == null) {
|
return@registerForActivityResult
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
Toast.makeText(
|
|
||||||
this@MainActivity,
|
|
||||||
getString(R.string.export_save_failed),
|
|
||||||
Toast.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
return@launch
|
|
||||||
}
|
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
val file = DocumentFile.fromSingleUri(
|
|
||||||
this@MainActivity,
|
|
||||||
DocumentsContract.buildDocumentUri(
|
|
||||||
DocumentProvider.AUTHORITY,
|
|
||||||
"${DocumentProvider.ROOT_ID}/temp/${lastZipFile.name}"
|
|
||||||
)
|
|
||||||
)!!
|
|
||||||
val intent = Intent(Intent.ACTION_SEND)
|
|
||||||
.setDataAndType(file.uri, "application/zip")
|
|
||||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
|
||||||
.putExtra(Intent.EXTRA_STREAM, file.uri)
|
|
||||||
startForResultExportSave.launch(
|
|
||||||
Intent.createChooser(
|
|
||||||
intent,
|
|
||||||
getString(R.string.share_save_file)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IndeterminateProgressDialogFragment.newInstance(
|
||||||
|
this,
|
||||||
|
R.string.save_files_exporting,
|
||||||
|
false
|
||||||
|
) {
|
||||||
|
val zipResult = FileUtil.zipFromInternalStorage(
|
||||||
|
File(savesFolderRoot),
|
||||||
|
savesFolderRoot,
|
||||||
|
BufferedOutputStream(contentResolver.openOutputStream(result))
|
||||||
|
)
|
||||||
|
return@newInstance when (zipResult) {
|
||||||
|
TaskState.Completed -> getString(R.string.export_success)
|
||||||
|
TaskState.Cancelled, TaskState.Failed -> getString(R.string.export_failed)
|
||||||
|
}
|
||||||
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val startForResultExportSave =
|
private val startForResultExportSave =
|
||||||
|
|
|
@ -15,7 +15,8 @@ object DirectoryInitialization {
|
||||||
fun start() {
|
fun start() {
|
||||||
if (!areDirectoriesReady) {
|
if (!areDirectoriesReady) {
|
||||||
initializeInternalStorage()
|
initializeInternalStorage()
|
||||||
NativeLibrary.initializeSystem()
|
NativeLibrary.initializeSystem(false)
|
||||||
|
NativeConfig.initializeConfig()
|
||||||
areDirectoriesReady = true
|
areDirectoriesReady = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,9 @@ import android.graphics.BitmapFactory
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.core.graphics.drawable.toBitmap
|
import androidx.core.graphics.drawable.toBitmap
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.decode.DataSource
|
import coil.decode.DataSource
|
||||||
import coil.executeBlocking
|
|
||||||
import coil.fetch.DrawableResult
|
import coil.fetch.DrawableResult
|
||||||
import coil.fetch.FetchResult
|
import coil.fetch.FetchResult
|
||||||
import coil.fetch.Fetcher
|
import coil.fetch.Fetcher
|
||||||
|
@ -76,12 +76,13 @@ object GameIconUtils {
|
||||||
imageLoader.enqueue(request)
|
imageLoader.enqueue(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getGameIcon(game: Game): Bitmap {
|
suspend fun getGameIcon(lifecycleOwner: LifecycleOwner, game: Game): Bitmap {
|
||||||
val request = ImageRequest.Builder(YuzuApplication.appContext)
|
val request = ImageRequest.Builder(YuzuApplication.appContext)
|
||||||
.data(game)
|
.data(game)
|
||||||
|
.lifecycle(lifecycleOwner)
|
||||||
.error(R.drawable.default_icon)
|
.error(R.drawable.default_icon)
|
||||||
.build()
|
.build()
|
||||||
return imageLoader.executeBlocking(request)
|
return imageLoader.execute(request)
|
||||||
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
|
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,8 @@ object InputHandler {
|
||||||
0x054C -> getInputDS5ButtonKey(event.keyCode)
|
0x054C -> getInputDS5ButtonKey(event.keyCode)
|
||||||
0x057E -> getInputJoyconButtonKey(event.keyCode)
|
0x057E -> getInputJoyconButtonKey(event.keyCode)
|
||||||
0x1532 -> getInputRazerButtonKey(event.keyCode)
|
0x1532 -> getInputRazerButtonKey(event.keyCode)
|
||||||
|
0x3537 -> getInputRedmagicButtonKey(event.keyCode)
|
||||||
|
0x358A -> getInputBackboneLabsButtonKey(event.keyCode)
|
||||||
else -> getInputGenericButtonKey(event.keyCode)
|
else -> getInputGenericButtonKey(event.keyCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +70,7 @@ object InputHandler {
|
||||||
private fun getPlayerNumber(index: Int, deviceId: Int = -1): Int {
|
private fun getPlayerNumber(index: Int, deviceId: Int = -1): Int {
|
||||||
var deviceIndex = index
|
var deviceIndex = index
|
||||||
if (deviceId != -1) {
|
if (deviceId != -1) {
|
||||||
deviceIndex = controllerIds[deviceId]!!
|
deviceIndex = controllerIds[deviceId] ?: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Joycons are handled as different controllers. Find a way to merge them.
|
// TODO: Joycons are handled as different controllers. Find a way to merge them.
|
||||||
|
@ -227,6 +229,42 @@ object InputHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getInputRedmagicButtonKey(key: Int): Int {
|
||||||
|
return when (key) {
|
||||||
|
KeyEvent.KEYCODE_BUTTON_A -> NativeLibrary.ButtonType.BUTTON_B
|
||||||
|
KeyEvent.KEYCODE_BUTTON_B -> NativeLibrary.ButtonType.BUTTON_A
|
||||||
|
KeyEvent.KEYCODE_BUTTON_X -> NativeLibrary.ButtonType.BUTTON_Y
|
||||||
|
KeyEvent.KEYCODE_BUTTON_Y -> NativeLibrary.ButtonType.BUTTON_X
|
||||||
|
KeyEvent.KEYCODE_BUTTON_L1 -> NativeLibrary.ButtonType.TRIGGER_L
|
||||||
|
KeyEvent.KEYCODE_BUTTON_R1 -> NativeLibrary.ButtonType.TRIGGER_R
|
||||||
|
KeyEvent.KEYCODE_BUTTON_L2 -> NativeLibrary.ButtonType.TRIGGER_ZL
|
||||||
|
KeyEvent.KEYCODE_BUTTON_R2 -> NativeLibrary.ButtonType.TRIGGER_ZR
|
||||||
|
KeyEvent.KEYCODE_BUTTON_THUMBL -> NativeLibrary.ButtonType.STICK_L
|
||||||
|
KeyEvent.KEYCODE_BUTTON_THUMBR -> NativeLibrary.ButtonType.STICK_R
|
||||||
|
KeyEvent.KEYCODE_BUTTON_START -> NativeLibrary.ButtonType.BUTTON_PLUS
|
||||||
|
KeyEvent.KEYCODE_BUTTON_SELECT -> NativeLibrary.ButtonType.BUTTON_MINUS
|
||||||
|
else -> -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getInputBackboneLabsButtonKey(key: Int): Int {
|
||||||
|
return when (key) {
|
||||||
|
KeyEvent.KEYCODE_BUTTON_A -> NativeLibrary.ButtonType.BUTTON_B
|
||||||
|
KeyEvent.KEYCODE_BUTTON_B -> NativeLibrary.ButtonType.BUTTON_A
|
||||||
|
KeyEvent.KEYCODE_BUTTON_X -> NativeLibrary.ButtonType.BUTTON_Y
|
||||||
|
KeyEvent.KEYCODE_BUTTON_Y -> NativeLibrary.ButtonType.BUTTON_X
|
||||||
|
KeyEvent.KEYCODE_BUTTON_L1 -> NativeLibrary.ButtonType.TRIGGER_L
|
||||||
|
KeyEvent.KEYCODE_BUTTON_R1 -> NativeLibrary.ButtonType.TRIGGER_R
|
||||||
|
KeyEvent.KEYCODE_BUTTON_L2 -> NativeLibrary.ButtonType.TRIGGER_ZL
|
||||||
|
KeyEvent.KEYCODE_BUTTON_R2 -> NativeLibrary.ButtonType.TRIGGER_ZR
|
||||||
|
KeyEvent.KEYCODE_BUTTON_THUMBL -> NativeLibrary.ButtonType.STICK_L
|
||||||
|
KeyEvent.KEYCODE_BUTTON_THUMBR -> NativeLibrary.ButtonType.STICK_R
|
||||||
|
KeyEvent.KEYCODE_BUTTON_START -> NativeLibrary.ButtonType.BUTTON_PLUS
|
||||||
|
KeyEvent.KEYCODE_BUTTON_SELECT -> NativeLibrary.ButtonType.BUTTON_MINUS
|
||||||
|
else -> -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getInputGenericButtonKey(key: Int): Int {
|
private fun getInputGenericButtonKey(key: Int): Int {
|
||||||
return when (key) {
|
return when (key) {
|
||||||
KeyEvent.KEYCODE_BUTTON_A -> NativeLibrary.ButtonType.BUTTON_A
|
KeyEvent.KEYCODE_BUTTON_A -> NativeLibrary.ButtonType.BUTTON_A
|
||||||
|
|
|
@ -3,38 +3,29 @@
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
import android.util.Log
|
import android.os.Build
|
||||||
import org.yuzu.yuzu_emu.BuildConfig
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains methods that call through to [android.util.Log], but
|
|
||||||
* with the same TAG automatically provided. Also no-ops VERBOSE and DEBUG log
|
|
||||||
* levels in release builds.
|
|
||||||
*/
|
|
||||||
object Log {
|
object Log {
|
||||||
private const val TAG = "Yuzu Frontend"
|
// Tracks whether we should share the old log or the current log
|
||||||
|
var gameLaunched = false
|
||||||
|
|
||||||
fun verbose(message: String) {
|
external fun debug(message: String)
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
Log.v(TAG, message)
|
external fun warning(message: String)
|
||||||
|
|
||||||
|
external fun info(message: String)
|
||||||
|
|
||||||
|
external fun error(message: String)
|
||||||
|
|
||||||
|
external fun critical(message: String)
|
||||||
|
|
||||||
|
fun logDeviceInfo() {
|
||||||
|
info("Device Manufacturer - ${Build.MANUFACTURER}")
|
||||||
|
info("Device Model - ${Build.MODEL}")
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
|
||||||
|
info("SoC Manufacturer - ${Build.SOC_MANUFACTURER}")
|
||||||
|
info("SoC Model - ${Build.SOC_MODEL}")
|
||||||
}
|
}
|
||||||
}
|
info("Total System Memory - ${MemoryUtil.getDeviceRAM()}")
|
||||||
|
|
||||||
fun debug(message: String) {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
Log.d(TAG, message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun info(message: String) {
|
|
||||||
Log.i(TAG, message)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun warning(message: String) {
|
|
||||||
Log.w(TAG, message)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun error(message: String) {
|
|
||||||
Log.e(TAG, message)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ object MemoryUtil {
|
||||||
const val Pb = Tb * 1024
|
const val Pb = Tb * 1024
|
||||||
const val Eb = Pb * 1024
|
const val Eb = Pb * 1024
|
||||||
|
|
||||||
private fun bytesToSizeUnit(size: Float): String =
|
private fun bytesToSizeUnit(size: Float, roundUp: Boolean = false): String =
|
||||||
when {
|
when {
|
||||||
size < Kb -> {
|
size < Kb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
|
@ -39,63 +39,59 @@ object MemoryUtil {
|
||||||
size < Mb -> {
|
size < Mb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Kb).hundredths,
|
if (roundUp) ceil(size / Kb) else (size / Kb).hundredths,
|
||||||
context.getString(R.string.memory_kilobyte)
|
context.getString(R.string.memory_kilobyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
size < Gb -> {
|
size < Gb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Mb).hundredths,
|
if (roundUp) ceil(size / Mb) else (size / Mb).hundredths,
|
||||||
context.getString(R.string.memory_megabyte)
|
context.getString(R.string.memory_megabyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
size < Tb -> {
|
size < Tb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Gb).hundredths,
|
if (roundUp) ceil(size / Gb) else (size / Gb).hundredths,
|
||||||
context.getString(R.string.memory_gigabyte)
|
context.getString(R.string.memory_gigabyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
size < Pb -> {
|
size < Pb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Tb).hundredths,
|
if (roundUp) ceil(size / Tb) else (size / Tb).hundredths,
|
||||||
context.getString(R.string.memory_terabyte)
|
context.getString(R.string.memory_terabyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
size < Eb -> {
|
size < Eb -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Pb).hundredths,
|
if (roundUp) ceil(size / Pb) else (size / Pb).hundredths,
|
||||||
context.getString(R.string.memory_petabyte)
|
context.getString(R.string.memory_petabyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
context.getString(
|
context.getString(
|
||||||
R.string.memory_formatted,
|
R.string.memory_formatted,
|
||||||
(size / Eb).hundredths,
|
if (roundUp) ceil(size / Eb) else (size / Eb).hundredths,
|
||||||
context.getString(R.string.memory_exabyte)
|
context.getString(R.string.memory_exabyte)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Devices are unlikely to have 0.5GB increments of memory so we'll just round up to account for
|
val totalMemory: Float
|
||||||
// the potential error created by memInfo.totalMem
|
|
||||||
private val totalMemory: Float
|
|
||||||
get() {
|
get() {
|
||||||
val memInfo = ActivityManager.MemoryInfo()
|
val memInfo = ActivityManager.MemoryInfo()
|
||||||
with(context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) {
|
with(context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) {
|
||||||
getMemoryInfo(memInfo)
|
getMemoryInfo(memInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ceil(
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
memInfo.advertisedMem.toFloat()
|
||||||
memInfo.advertisedMem.toFloat()
|
} else {
|
||||||
} else {
|
memInfo.totalMem.toFloat()
|
||||||
memInfo.totalMem.toFloat()
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isLessThan(minimum: Int, size: Float): Boolean =
|
fun isLessThan(minimum: Int, size: Float): Boolean =
|
||||||
|
@ -109,5 +105,7 @@ object MemoryUtil {
|
||||||
else -> totalMemory < Kb && totalMemory < minimum
|
else -> totalMemory < Kb && totalMemory < minimum
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDeviceRAM(): String = bytesToSizeUnit(totalMemory)
|
// Devices are unlikely to have 0.5GB increments of memory so we'll just round up to account for
|
||||||
|
// the potential error created by memInfo.totalMem
|
||||||
|
fun getDeviceRAM(): String = bytesToSizeUnit(totalMemory, true)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,30 @@
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
object NativeConfig {
|
object NativeConfig {
|
||||||
|
/**
|
||||||
|
* Creates a Config object and opens the emulation config.
|
||||||
|
*/
|
||||||
|
@Synchronized
|
||||||
|
external fun initializeConfig()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys the stored config object. This automatically saves the existing config.
|
||||||
|
*/
|
||||||
|
@Synchronized
|
||||||
|
external fun unloadConfig()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads values saved to the config file and saves them.
|
||||||
|
*/
|
||||||
|
@Synchronized
|
||||||
|
external fun reloadSettings()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves settings values in memory to disk.
|
||||||
|
*/
|
||||||
|
@Synchronized
|
||||||
|
external fun saveSettings()
|
||||||
|
|
||||||
external fun getBoolean(key: String, getDefault: Boolean): Boolean
|
external fun getBoolean(key: String, getDefault: Boolean): Boolean
|
||||||
external fun setBoolean(key: String, value: Boolean)
|
external fun setBoolean(key: String, value: Boolean)
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,6 @@ add_library(yuzu-android SHARED
|
||||||
android_common/android_common.h
|
android_common/android_common.h
|
||||||
applets/software_keyboard.cpp
|
applets/software_keyboard.cpp
|
||||||
applets/software_keyboard.h
|
applets/software_keyboard.h
|
||||||
config.cpp
|
|
||||||
config.h
|
|
||||||
default_ini.h
|
|
||||||
emu_window/emu_window.cpp
|
emu_window/emu_window.cpp
|
||||||
emu_window/emu_window.h
|
emu_window/emu_window.h
|
||||||
id_cache.cpp
|
id_cache.cpp
|
||||||
|
@ -16,14 +13,17 @@ add_library(yuzu-android SHARED
|
||||||
native.cpp
|
native.cpp
|
||||||
native.h
|
native.h
|
||||||
native_config.cpp
|
native_config.cpp
|
||||||
uisettings.cpp
|
android_settings.cpp
|
||||||
game_metadata.cpp
|
game_metadata.cpp
|
||||||
|
native_log.cpp
|
||||||
|
android_config.cpp
|
||||||
|
android_config.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
||||||
|
|
||||||
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common)
|
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common)
|
||||||
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad inih jnigraphics log)
|
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
|
||||||
if (ARCHITECTURE_arm64)
|
if (ARCHITECTURE_arm64)
|
||||||
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
||||||
endif()
|
endif()
|
||||||
|
|
70
src/android/app/src/main/jni/android_config.cpp
Normal file
70
src/android/app/src/main/jni/android_config.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "android_config.h"
|
||||||
|
#include "android_settings.h"
|
||||||
|
#include "common/settings_setting.h"
|
||||||
|
|
||||||
|
AndroidConfig::AndroidConfig(const std::string& config_name, ConfigType config_type)
|
||||||
|
: Config(config_type) {
|
||||||
|
Initialize(config_name);
|
||||||
|
if (config_type != ConfigType::InputProfile) {
|
||||||
|
ReadAndroidValues();
|
||||||
|
SaveAndroidValues();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidConfig::~AndroidConfig() {
|
||||||
|
if (global) {
|
||||||
|
AndroidConfig::SaveAllValues();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::ReloadAllValues() {
|
||||||
|
Reload();
|
||||||
|
ReadAndroidValues();
|
||||||
|
SaveAndroidValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::SaveAllValues() {
|
||||||
|
Save();
|
||||||
|
SaveAndroidValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::ReadAndroidValues() {
|
||||||
|
if (global) {
|
||||||
|
ReadAndroidUIValues();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::ReadAndroidUIValues() {
|
||||||
|
BeginGroup(Settings::TranslateCategory(Settings::Category::Android));
|
||||||
|
|
||||||
|
ReadCategory(Settings::Category::Android);
|
||||||
|
|
||||||
|
EndGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::SaveAndroidValues() {
|
||||||
|
if (global) {
|
||||||
|
SaveAndroidUIValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteToIni();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidConfig::SaveAndroidUIValues() {
|
||||||
|
BeginGroup(Settings::TranslateCategory(Settings::Category::Android));
|
||||||
|
|
||||||
|
WriteCategory(Settings::Category::Android);
|
||||||
|
|
||||||
|
EndGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Settings::BasicSetting*>& AndroidConfig::FindRelevantList(Settings::Category category) {
|
||||||
|
auto& map = Settings::values.linkage.by_category;
|
||||||
|
if (map.contains(category)) {
|
||||||
|
return Settings::values.linkage.by_category[category];
|
||||||
|
}
|
||||||
|
return AndroidSettings::values.linkage.by_category[category];
|
||||||
|
}
|
41
src/android/app/src/main/jni/android_config.h
Normal file
41
src/android/app/src/main/jni/android_config.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "frontend_common/config.h"
|
||||||
|
|
||||||
|
class AndroidConfig final : public Config {
|
||||||
|
public:
|
||||||
|
explicit AndroidConfig(const std::string& config_name = "config",
|
||||||
|
ConfigType config_type = ConfigType::GlobalConfig);
|
||||||
|
~AndroidConfig() override;
|
||||||
|
|
||||||
|
void ReloadAllValues() override;
|
||||||
|
void SaveAllValues() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void ReadAndroidValues();
|
||||||
|
void ReadAndroidUIValues();
|
||||||
|
void ReadHidbusValues() override {}
|
||||||
|
void ReadDebugControlValues() override {}
|
||||||
|
void ReadPathValues() override {}
|
||||||
|
void ReadShortcutValues() override {}
|
||||||
|
void ReadUIValues() override {}
|
||||||
|
void ReadUIGamelistValues() override {}
|
||||||
|
void ReadUILayoutValues() override {}
|
||||||
|
void ReadMultiplayerValues() override {}
|
||||||
|
|
||||||
|
void SaveAndroidValues();
|
||||||
|
void SaveAndroidUIValues();
|
||||||
|
void SaveHidbusValues() override {}
|
||||||
|
void SaveDebugControlValues() override {}
|
||||||
|
void SavePathValues() override {}
|
||||||
|
void SaveShortcutValues() override {}
|
||||||
|
void SaveUIValues() override {}
|
||||||
|
void SaveUIGamelistValues() override {}
|
||||||
|
void SaveUILayoutValues() override {}
|
||||||
|
void SaveMultiplayerValues() override {}
|
||||||
|
|
||||||
|
std::vector<Settings::BasicSetting*>& FindRelevantList(Settings::Category category) override;
|
||||||
|
};
|
|
@ -1,7 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "uisettings.h"
|
#include "android_settings.h"
|
||||||
|
|
||||||
namespace AndroidSettings {
|
namespace AndroidSettings {
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct Values {
|
||||||
Settings::Linkage linkage;
|
Settings::Linkage linkage;
|
||||||
|
|
||||||
// Android
|
// Android
|
||||||
Settings::Setting<bool> picture_in_picture{linkage, true, "picture_in_picture",
|
Settings::Setting<bool> picture_in_picture{linkage, false, "picture_in_picture",
|
||||||
Settings::Category::Android};
|
Settings::Category::Android};
|
||||||
Settings::Setting<s32> screen_layout{linkage,
|
Settings::Setting<s32> screen_layout{linkage,
|
||||||
5,
|
5,
|
|
@ -1,330 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <optional>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include <INIReader.h>
|
|
||||||
#include "common/fs/file.h"
|
|
||||||
#include "common/fs/fs.h"
|
|
||||||
#include "common/fs/path_util.h"
|
|
||||||
#include "common/logging/log.h"
|
|
||||||
#include "common/settings.h"
|
|
||||||
#include "common/settings_enums.h"
|
|
||||||
#include "core/hle/service/acc/profile_manager.h"
|
|
||||||
#include "input_common/main.h"
|
|
||||||
#include "jni/config.h"
|
|
||||||
#include "jni/default_ini.h"
|
|
||||||
#include "uisettings.h"
|
|
||||||
|
|
||||||
namespace FS = Common::FS;
|
|
||||||
|
|
||||||
Config::Config(const std::string& config_name, ConfigType config_type)
|
|
||||||
: type(config_type), global{config_type == ConfigType::GlobalConfig} {
|
|
||||||
Initialize(config_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
Config::~Config() = default;
|
|
||||||
|
|
||||||
bool Config::LoadINI(const std::string& default_contents, bool retry) {
|
|
||||||
void(FS::CreateParentDir(config_loc));
|
|
||||||
config = std::make_unique<INIReader>(FS::PathToUTF8String(config_loc));
|
|
||||||
const auto config_loc_str = FS::PathToUTF8String(config_loc);
|
|
||||||
if (config->ParseError() < 0) {
|
|
||||||
if (retry) {
|
|
||||||
LOG_WARNING(Config, "Failed to load {}. Creating file from defaults...",
|
|
||||||
config_loc_str);
|
|
||||||
|
|
||||||
void(FS::CreateParentDir(config_loc));
|
|
||||||
void(FS::WriteStringToFile(config_loc, FS::FileType::TextFile, default_contents));
|
|
||||||
|
|
||||||
config = std::make_unique<INIReader>(config_loc_str);
|
|
||||||
|
|
||||||
return LoadINI(default_contents, false);
|
|
||||||
}
|
|
||||||
LOG_ERROR(Config, "Failed.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
LOG_INFO(Config, "Successfully loaded {}", config_loc_str);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
void Config::ReadSetting(const std::string& group, Settings::Setting<std::string>& setting) {
|
|
||||||
std::string setting_value = config->Get(group, setting.GetLabel(), setting.GetDefault());
|
|
||||||
if (setting_value.empty()) {
|
|
||||||
setting_value = setting.GetDefault();
|
|
||||||
}
|
|
||||||
setting = std::move(setting_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
void Config::ReadSetting(const std::string& group, Settings::Setting<bool>& setting) {
|
|
||||||
setting = config->GetBoolean(group, setting.GetLabel(), setting.GetDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Type, bool ranged>
|
|
||||||
void Config::ReadSetting(const std::string& group, Settings::Setting<Type, ranged>& setting) {
|
|
||||||
setting = static_cast<Type>(
|
|
||||||
config->GetInteger(group, setting.GetLabel(), static_cast<long>(setting.GetDefault())));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Config::ReadValues() {
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.mouse_enabled);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.touch_device);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.keyboard_enabled);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.debug_pad_enabled);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.vibration_enabled);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.enable_accurate_vibrations);
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.motion_enabled);
|
|
||||||
Settings::values.touchscreen.enabled =
|
|
||||||
config->GetBoolean("ControlsGeneral", "touch_enabled", true);
|
|
||||||
Settings::values.touchscreen.rotation_angle =
|
|
||||||
config->GetInteger("ControlsGeneral", "touch_angle", 0);
|
|
||||||
Settings::values.touchscreen.diameter_x =
|
|
||||||
config->GetInteger("ControlsGeneral", "touch_diameter_x", 15);
|
|
||||||
Settings::values.touchscreen.diameter_y =
|
|
||||||
config->GetInteger("ControlsGeneral", "touch_diameter_y", 15);
|
|
||||||
|
|
||||||
int num_touch_from_button_maps =
|
|
||||||
config->GetInteger("ControlsGeneral", "touch_from_button_map", 0);
|
|
||||||
if (num_touch_from_button_maps > 0) {
|
|
||||||
for (int i = 0; i < num_touch_from_button_maps; ++i) {
|
|
||||||
Settings::TouchFromButtonMap map;
|
|
||||||
map.name = config->Get("ControlsGeneral",
|
|
||||||
std::string("touch_from_button_maps_") + std::to_string(i) +
|
|
||||||
std::string("_name"),
|
|
||||||
"default");
|
|
||||||
const int num_touch_maps = config->GetInteger(
|
|
||||||
"ControlsGeneral",
|
|
||||||
std::string("touch_from_button_maps_") + std::to_string(i) + std::string("_count"),
|
|
||||||
0);
|
|
||||||
map.buttons.reserve(num_touch_maps);
|
|
||||||
|
|
||||||
for (int j = 0; j < num_touch_maps; ++j) {
|
|
||||||
std::string touch_mapping =
|
|
||||||
config->Get("ControlsGeneral",
|
|
||||||
std::string("touch_from_button_maps_") + std::to_string(i) +
|
|
||||||
std::string("_bind_") + std::to_string(j),
|
|
||||||
"");
|
|
||||||
map.buttons.emplace_back(std::move(touch_mapping));
|
|
||||||
}
|
|
||||||
|
|
||||||
Settings::values.touch_from_button_maps.emplace_back(std::move(map));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Settings::values.touch_from_button_maps.emplace_back(
|
|
||||||
Settings::TouchFromButtonMap{"default", {}});
|
|
||||||
num_touch_from_button_maps = 1;
|
|
||||||
}
|
|
||||||
Settings::values.touch_from_button_map_index = std::clamp(
|
|
||||||
Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1);
|
|
||||||
|
|
||||||
ReadSetting("ControlsGeneral", Settings::values.udp_input_servers);
|
|
||||||
|
|
||||||
// Data Storage
|
|
||||||
ReadSetting("Data Storage", Settings::values.use_virtual_sd);
|
|
||||||
FS::SetYuzuPath(FS::YuzuPath::NANDDir,
|
|
||||||
config->Get("Data Storage", "nand_directory",
|
|
||||||
FS::GetYuzuPathString(FS::YuzuPath::NANDDir)));
|
|
||||||
FS::SetYuzuPath(FS::YuzuPath::SDMCDir,
|
|
||||||
config->Get("Data Storage", "sdmc_directory",
|
|
||||||
FS::GetYuzuPathString(FS::YuzuPath::SDMCDir)));
|
|
||||||
FS::SetYuzuPath(FS::YuzuPath::LoadDir,
|
|
||||||
config->Get("Data Storage", "load_directory",
|
|
||||||
FS::GetYuzuPathString(FS::YuzuPath::LoadDir)));
|
|
||||||
FS::SetYuzuPath(FS::YuzuPath::DumpDir,
|
|
||||||
config->Get("Data Storage", "dump_directory",
|
|
||||||
FS::GetYuzuPathString(FS::YuzuPath::DumpDir)));
|
|
||||||
ReadSetting("Data Storage", Settings::values.gamecard_inserted);
|
|
||||||
ReadSetting("Data Storage", Settings::values.gamecard_current_game);
|
|
||||||
ReadSetting("Data Storage", Settings::values.gamecard_path);
|
|
||||||
|
|
||||||
// System
|
|
||||||
ReadSetting("System", Settings::values.current_user);
|
|
||||||
Settings::values.current_user = std::clamp<int>(Settings::values.current_user.GetValue(), 0,
|
|
||||||
Service::Account::MAX_USERS - 1);
|
|
||||||
|
|
||||||
// Disable docked mode by default on Android
|
|
||||||
Settings::values.use_docked_mode.SetValue(config->GetBoolean("System", "use_docked_mode", false)
|
|
||||||
? Settings::ConsoleMode::Docked
|
|
||||||
: Settings::ConsoleMode::Handheld);
|
|
||||||
|
|
||||||
const auto rng_seed_enabled = config->GetBoolean("System", "rng_seed_enabled", false);
|
|
||||||
if (rng_seed_enabled) {
|
|
||||||
Settings::values.rng_seed.SetValue(config->GetInteger("System", "rng_seed", 0));
|
|
||||||
} else {
|
|
||||||
Settings::values.rng_seed.SetValue(0);
|
|
||||||
}
|
|
||||||
Settings::values.rng_seed_enabled.SetValue(rng_seed_enabled);
|
|
||||||
|
|
||||||
const auto custom_rtc_enabled = config->GetBoolean("System", "custom_rtc_enabled", false);
|
|
||||||
if (custom_rtc_enabled) {
|
|
||||||
Settings::values.custom_rtc = config->GetInteger("System", "custom_rtc", 0);
|
|
||||||
} else {
|
|
||||||
Settings::values.custom_rtc = 0;
|
|
||||||
}
|
|
||||||
Settings::values.custom_rtc_enabled = custom_rtc_enabled;
|
|
||||||
|
|
||||||
ReadSetting("System", Settings::values.language_index);
|
|
||||||
ReadSetting("System", Settings::values.region_index);
|
|
||||||
ReadSetting("System", Settings::values.time_zone_index);
|
|
||||||
ReadSetting("System", Settings::values.sound_index);
|
|
||||||
|
|
||||||
// Core
|
|
||||||
ReadSetting("Core", Settings::values.use_multi_core);
|
|
||||||
ReadSetting("Core", Settings::values.memory_layout_mode);
|
|
||||||
|
|
||||||
// Cpu
|
|
||||||
ReadSetting("Cpu", Settings::values.cpu_accuracy);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpu_debug_mode);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_page_tables);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_block_linking);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_return_stack_buffer);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_fast_dispatcher);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_context_elimination);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_const_prop);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_misc_ir);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_reduce_misalign_checks);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_fastmem);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_fastmem_exclusives);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_recompile_exclusives);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_ignore_memory_aborts);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_unfuse_fma);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_reduce_fp_error);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_ignore_standard_fpcr);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_inaccurate_nan);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_fastmem_check);
|
|
||||||
ReadSetting("Cpu", Settings::values.cpuopt_unsafe_ignore_global_monitor);
|
|
||||||
|
|
||||||
// Renderer
|
|
||||||
ReadSetting("Renderer", Settings::values.renderer_backend);
|
|
||||||
ReadSetting("Renderer", Settings::values.renderer_debug);
|
|
||||||
ReadSetting("Renderer", Settings::values.renderer_shader_feedback);
|
|
||||||
ReadSetting("Renderer", Settings::values.enable_nsight_aftermath);
|
|
||||||
ReadSetting("Renderer", Settings::values.disable_shader_loop_safety_checks);
|
|
||||||
ReadSetting("Renderer", Settings::values.vulkan_device);
|
|
||||||
|
|
||||||
ReadSetting("Renderer", Settings::values.resolution_setup);
|
|
||||||
ReadSetting("Renderer", Settings::values.scaling_filter);
|
|
||||||
ReadSetting("Renderer", Settings::values.fsr_sharpening_slider);
|
|
||||||
ReadSetting("Renderer", Settings::values.anti_aliasing);
|
|
||||||
ReadSetting("Renderer", Settings::values.fullscreen_mode);
|
|
||||||
ReadSetting("Renderer", Settings::values.aspect_ratio);
|
|
||||||
ReadSetting("Renderer", Settings::values.max_anisotropy);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_speed_limit);
|
|
||||||
ReadSetting("Renderer", Settings::values.speed_limit);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_disk_shader_cache);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation);
|
|
||||||
ReadSetting("Renderer", Settings::values.vsync_mode);
|
|
||||||
ReadSetting("Renderer", Settings::values.shader_backend);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
|
|
||||||
ReadSetting("Renderer", Settings::values.nvdec_emulation);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
|
|
||||||
ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
|
|
||||||
|
|
||||||
ReadSetting("Renderer", Settings::values.bg_red);
|
|
||||||
ReadSetting("Renderer", Settings::values.bg_green);
|
|
||||||
ReadSetting("Renderer", Settings::values.bg_blue);
|
|
||||||
|
|
||||||
// Use GPU accuracy normal by default on Android
|
|
||||||
Settings::values.gpu_accuracy = static_cast<Settings::GpuAccuracy>(config->GetInteger(
|
|
||||||
"Renderer", "gpu_accuracy", static_cast<u32>(Settings::GpuAccuracy::Normal)));
|
|
||||||
|
|
||||||
// Use GPU default anisotropic filtering on Android
|
|
||||||
Settings::values.max_anisotropy =
|
|
||||||
static_cast<Settings::AnisotropyMode>(config->GetInteger("Renderer", "max_anisotropy", 1));
|
|
||||||
|
|
||||||
// Disable ASTC compute by default on Android
|
|
||||||
Settings::values.accelerate_astc.SetValue(
|
|
||||||
config->GetBoolean("Renderer", "accelerate_astc", false) ? Settings::AstcDecodeMode::Gpu
|
|
||||||
: Settings::AstcDecodeMode::Cpu);
|
|
||||||
|
|
||||||
// Enable asynchronous presentation by default on Android
|
|
||||||
Settings::values.async_presentation =
|
|
||||||
config->GetBoolean("Renderer", "async_presentation", true);
|
|
||||||
|
|
||||||
// Disable force_max_clock by default on Android
|
|
||||||
Settings::values.renderer_force_max_clock =
|
|
||||||
config->GetBoolean("Renderer", "force_max_clock", false);
|
|
||||||
|
|
||||||
// Disable use_reactive_flushing by default on Android
|
|
||||||
Settings::values.use_reactive_flushing =
|
|
||||||
config->GetBoolean("Renderer", "use_reactive_flushing", false);
|
|
||||||
|
|
||||||
// Audio
|
|
||||||
ReadSetting("Audio", Settings::values.sink_id);
|
|
||||||
ReadSetting("Audio", Settings::values.audio_output_device_id);
|
|
||||||
ReadSetting("Audio", Settings::values.volume);
|
|
||||||
|
|
||||||
// Miscellaneous
|
|
||||||
// log_filter has a different default here than from common
|
|
||||||
Settings::values.log_filter = "*:Info";
|
|
||||||
ReadSetting("Miscellaneous", Settings::values.use_dev_keys);
|
|
||||||
|
|
||||||
// Debugging
|
|
||||||
Settings::values.record_frame_times =
|
|
||||||
config->GetBoolean("Debugging", "record_frame_times", false);
|
|
||||||
ReadSetting("Debugging", Settings::values.dump_exefs);
|
|
||||||
ReadSetting("Debugging", Settings::values.dump_nso);
|
|
||||||
ReadSetting("Debugging", Settings::values.enable_fs_access_log);
|
|
||||||
ReadSetting("Debugging", Settings::values.reporting_services);
|
|
||||||
ReadSetting("Debugging", Settings::values.quest_flag);
|
|
||||||
ReadSetting("Debugging", Settings::values.use_debug_asserts);
|
|
||||||
ReadSetting("Debugging", Settings::values.use_auto_stub);
|
|
||||||
ReadSetting("Debugging", Settings::values.disable_macro_jit);
|
|
||||||
ReadSetting("Debugging", Settings::values.disable_macro_hle);
|
|
||||||
ReadSetting("Debugging", Settings::values.use_gdbstub);
|
|
||||||
ReadSetting("Debugging", Settings::values.gdbstub_port);
|
|
||||||
|
|
||||||
const auto title_list = config->Get("AddOns", "title_ids", "");
|
|
||||||
std::stringstream ss(title_list);
|
|
||||||
std::string line;
|
|
||||||
while (std::getline(ss, line, '|')) {
|
|
||||||
const auto title_id = std::strtoul(line.c_str(), nullptr, 16);
|
|
||||||
const auto disabled_list = config->Get("AddOns", "disabled_" + line, "");
|
|
||||||
|
|
||||||
std::stringstream inner_ss(disabled_list);
|
|
||||||
std::string inner_line;
|
|
||||||
std::vector<std::string> out;
|
|
||||||
while (std::getline(inner_ss, inner_line, '|')) {
|
|
||||||
out.push_back(inner_line);
|
|
||||||
}
|
|
||||||
|
|
||||||
Settings::values.disabled_addons.insert_or_assign(title_id, out);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Web Service
|
|
||||||
ReadSetting("WebService", Settings::values.enable_telemetry);
|
|
||||||
ReadSetting("WebService", Settings::values.web_api_url);
|
|
||||||
ReadSetting("WebService", Settings::values.yuzu_username);
|
|
||||||
ReadSetting("WebService", Settings::values.yuzu_token);
|
|
||||||
|
|
||||||
// Network
|
|
||||||
ReadSetting("Network", Settings::values.network_interface);
|
|
||||||
|
|
||||||
// Android
|
|
||||||
ReadSetting("Android", AndroidSettings::values.picture_in_picture);
|
|
||||||
ReadSetting("Android", AndroidSettings::values.screen_layout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Config::Initialize(const std::string& config_name) {
|
|
||||||
const auto fs_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir);
|
|
||||||
const auto config_file = fmt::format("{}.ini", config_name);
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case ConfigType::GlobalConfig:
|
|
||||||
config_loc = FS::PathToUTF8String(fs_config_loc / config_file);
|
|
||||||
break;
|
|
||||||
case ConfigType::PerGameConfig:
|
|
||||||
config_loc = FS::PathToUTF8String(fs_config_loc / "custom" / FS::ToU8String(config_file));
|
|
||||||
break;
|
|
||||||
case ConfigType::InputProfile:
|
|
||||||
config_loc = FS::PathToUTF8String(fs_config_loc / "input" / config_file);
|
|
||||||
LoadINI(DefaultINI::android_config_file);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LoadINI(DefaultINI::android_config_file);
|
|
||||||
ReadValues();
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <memory>
|
|
||||||
#include <optional>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/settings.h"
|
|
||||||
|
|
||||||
class INIReader;
|
|
||||||
|
|
||||||
class Config {
|
|
||||||
bool LoadINI(const std::string& default_contents = "", bool retry = true);
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum class ConfigType {
|
|
||||||
GlobalConfig,
|
|
||||||
PerGameConfig,
|
|
||||||
InputProfile,
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit Config(const std::string& config_name = "config",
|
|
||||||
ConfigType config_type = ConfigType::GlobalConfig);
|
|
||||||
~Config();
|
|
||||||
|
|
||||||
void Initialize(const std::string& config_name);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* Applies a value read from the config to a Setting.
|
|
||||||
*
|
|
||||||
* @param group The name of the INI group
|
|
||||||
* @param setting The yuzu setting to modify
|
|
||||||
*/
|
|
||||||
template <typename Type, bool ranged>
|
|
||||||
void ReadSetting(const std::string& group, Settings::Setting<Type, ranged>& setting);
|
|
||||||
|
|
||||||
void ReadValues();
|
|
||||||
|
|
||||||
const ConfigType type;
|
|
||||||
std::unique_ptr<INIReader> config;
|
|
||||||
std::string config_loc;
|
|
||||||
const bool global;
|
|
||||||
};
|
|
|
@ -1,511 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace DefaultINI {
|
|
||||||
|
|
||||||
const char* android_config_file = R"(
|
|
||||||
|
|
||||||
[ControlsP0]
|
|
||||||
# The input devices and parameters for each Switch native input
|
|
||||||
# The config section determines the player number where the config will be applied on. For example "ControlsP0", "ControlsP1", ...
|
|
||||||
# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..."
|
|
||||||
# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values
|
|
||||||
|
|
||||||
# Indicates if this player should be connected at boot
|
|
||||||
connected=
|
|
||||||
|
|
||||||
# for button input, the following devices are available:
|
|
||||||
# - "keyboard" (default) for keyboard input. Required parameters:
|
|
||||||
# - "code": the code of the key to bind
|
|
||||||
# - "sdl" for joystick input using SDL. Required parameters:
|
|
||||||
# - "guid": SDL identification GUID of the joystick
|
|
||||||
# - "port": the index of the joystick to bind
|
|
||||||
# - "button"(optional): the index of the button to bind
|
|
||||||
# - "hat"(optional): the index of the hat to bind as direction buttons
|
|
||||||
# - "axis"(optional): the index of the axis to bind
|
|
||||||
# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right"
|
|
||||||
# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
|
|
||||||
# triggered if the axis value crosses
|
|
||||||
# - "direction"(only used for axis): "+" means the button is triggered when the axis value
|
|
||||||
# is greater than the threshold; "-" means the button is triggered when the axis value
|
|
||||||
# is smaller than the threshold
|
|
||||||
button_a=
|
|
||||||
button_b=
|
|
||||||
button_x=
|
|
||||||
button_y=
|
|
||||||
button_lstick=
|
|
||||||
button_rstick=
|
|
||||||
button_l=
|
|
||||||
button_r=
|
|
||||||
button_zl=
|
|
||||||
button_zr=
|
|
||||||
button_plus=
|
|
||||||
button_minus=
|
|
||||||
button_dleft=
|
|
||||||
button_dup=
|
|
||||||
button_dright=
|
|
||||||
button_ddown=
|
|
||||||
button_lstick_left=
|
|
||||||
button_lstick_up=
|
|
||||||
button_lstick_right=
|
|
||||||
button_lstick_down=
|
|
||||||
button_sl=
|
|
||||||
button_sr=
|
|
||||||
button_home=
|
|
||||||
button_screenshot=
|
|
||||||
|
|
||||||
# for analog input, the following devices are available:
|
|
||||||
# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters:
|
|
||||||
# - "up", "down", "left", "right": sub-devices for each direction.
|
|
||||||
# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00"
|
|
||||||
# - "modifier": sub-devices as a modifier.
|
|
||||||
# - "modifier_scale": a float number representing the applied modifier scale to the analog input.
|
|
||||||
# Must be in range of 0.0-1.0. Defaults to 0.5
|
|
||||||
# - "sdl" for joystick input using SDL. Required parameters:
|
|
||||||
# - "guid": SDL identification GUID of the joystick
|
|
||||||
# - "port": the index of the joystick to bind
|
|
||||||
# - "axis_x": the index of the axis to bind as x-axis (default to 0)
|
|
||||||
# - "axis_y": the index of the axis to bind as y-axis (default to 1)
|
|
||||||
lstick=
|
|
||||||
rstick=
|
|
||||||
|
|
||||||
# for motion input, the following devices are available:
|
|
||||||
# - "keyboard" (default) for emulating random motion input from buttons. Required parameters:
|
|
||||||
# - "code": the code of the key to bind
|
|
||||||
# - "sdl" for motion input using SDL. Required parameters:
|
|
||||||
# - "guid": SDL identification GUID of the joystick
|
|
||||||
# - "port": the index of the joystick to bind
|
|
||||||
# - "motion": the index of the motion sensor to bind
|
|
||||||
# - "cemuhookudp" for motion input using Cemu Hook protocol. Required parameters:
|
|
||||||
# - "guid": the IP address of the cemu hook server encoded to a hex string. for example 192.168.0.1 = "c0a80001"
|
|
||||||
# - "port": the port of the cemu hook server
|
|
||||||
# - "pad": the index of the joystick
|
|
||||||
# - "motion": the index of the motion sensor of the joystick to bind
|
|
||||||
motionleft=
|
|
||||||
motionright=
|
|
||||||
|
|
||||||
[ControlsGeneral]
|
|
||||||
# To use the debug_pad, prepend `debug_pad_` before each button setting above.
|
|
||||||
# i.e. debug_pad_button_a=
|
|
||||||
|
|
||||||
# Enable debug pad inputs to the guest
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
debug_pad_enabled =
|
|
||||||
|
|
||||||
# Whether to enable or disable vibration
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
vibration_enabled=
|
|
||||||
|
|
||||||
# Whether to enable or disable accurate vibrations
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
enable_accurate_vibrations=
|
|
||||||
|
|
||||||
# Enables controller motion inputs
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
motion_enabled =
|
|
||||||
|
|
||||||
# Defines the udp device's touch screen coordinate system for cemuhookudp devices
|
|
||||||
# - "min_x", "min_y", "max_x", "max_y"
|
|
||||||
touch_device=
|
|
||||||
|
|
||||||
# for mapping buttons to touch inputs.
|
|
||||||
#touch_from_button_map=1
|
|
||||||
#touch_from_button_maps_0_name=default
|
|
||||||
#touch_from_button_maps_0_count=2
|
|
||||||
#touch_from_button_maps_0_bind_0=foo
|
|
||||||
#touch_from_button_maps_0_bind_1=bar
|
|
||||||
# etc.
|
|
||||||
|
|
||||||
# List of Cemuhook UDP servers, delimited by ','.
|
|
||||||
# Default: 127.0.0.1:26760
|
|
||||||
# Example: 127.0.0.1:26760,123.4.5.67:26761
|
|
||||||
udp_input_servers =
|
|
||||||
|
|
||||||
# Enable controlling an axis via a mouse input.
|
|
||||||
# 0 (default): Off, 1: On
|
|
||||||
mouse_panning =
|
|
||||||
|
|
||||||
# Set mouse sensitivity.
|
|
||||||
# Default: 1.0
|
|
||||||
mouse_panning_sensitivity =
|
|
||||||
|
|
||||||
# Emulate an analog control stick from keyboard inputs.
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
emulate_analog_keyboard =
|
|
||||||
|
|
||||||
# Enable mouse inputs to the guest
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
mouse_enabled =
|
|
||||||
|
|
||||||
# Enable keyboard inputs to the guest
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
keyboard_enabled =
|
|
||||||
|
|
||||||
[Core]
|
|
||||||
# Whether to use multi-core for CPU emulation
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
use_multi_core =
|
|
||||||
|
|
||||||
# Enable unsafe extended guest system memory layout (8GB DRAM)
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
use_unsafe_extended_memory_layout =
|
|
||||||
|
|
||||||
[Cpu]
|
|
||||||
# Adjusts various optimizations.
|
|
||||||
# Auto-select mode enables choice unsafe optimizations.
|
|
||||||
# Accurate enables only safe optimizations.
|
|
||||||
# Unsafe allows any unsafe optimizations.
|
|
||||||
# 0 (default): Auto-select, 1: Accurate, 2: Enable unsafe optimizations
|
|
||||||
cpu_accuracy =
|
|
||||||
|
|
||||||
# Allow disabling safe optimizations.
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
cpu_debug_mode =
|
|
||||||
|
|
||||||
# Enable inline page tables optimization (faster guest memory access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_page_tables =
|
|
||||||
|
|
||||||
# Enable block linking CPU optimization (reduce block dispatcher use during predictable jumps)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_block_linking =
|
|
||||||
|
|
||||||
# Enable return stack buffer CPU optimization (reduce block dispatcher use during predictable returns)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_return_stack_buffer =
|
|
||||||
|
|
||||||
# Enable fast dispatcher CPU optimization (use a two-tiered dispatcher architecture)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_fast_dispatcher =
|
|
||||||
|
|
||||||
# Enable context elimination CPU Optimization (reduce host memory use for guest context)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_context_elimination =
|
|
||||||
|
|
||||||
# Enable constant propagation CPU optimization (basic IR optimization)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_const_prop =
|
|
||||||
|
|
||||||
# Enable miscellaneous CPU optimizations (basic IR optimization)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_misc_ir =
|
|
||||||
|
|
||||||
# Enable reduction of memory misalignment checks (reduce memory fallbacks for misaligned access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_reduce_misalign_checks =
|
|
||||||
|
|
||||||
# Enable Host MMU Emulation (faster guest memory access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_fastmem =
|
|
||||||
|
|
||||||
# Enable Host MMU Emulation for exclusive memory instructions (faster guest memory access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_fastmem_exclusives =
|
|
||||||
|
|
||||||
# Enable fallback on failure of fastmem of exclusive memory instructions (faster guest memory access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_recompile_exclusives =
|
|
||||||
|
|
||||||
# Enable optimization to ignore invalid memory accesses (faster guest memory access)
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_ignore_memory_aborts =
|
|
||||||
|
|
||||||
# Enable unfuse FMA (improve performance on CPUs without FMA)
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_unfuse_fma =
|
|
||||||
|
|
||||||
# Enable faster FRSQRTE and FRECPE
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_reduce_fp_error =
|
|
||||||
|
|
||||||
# Enable faster ASIMD instructions (32 bits only)
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_ignore_standard_fpcr =
|
|
||||||
|
|
||||||
# Enable inaccurate NaN handling
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_inaccurate_nan =
|
|
||||||
|
|
||||||
# Disable address space checks (64 bits only)
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_fastmem_check =
|
|
||||||
|
|
||||||
# Enable faster exclusive instructions
|
|
||||||
# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
|
|
||||||
# 0: Disabled, 1 (default): Enabled
|
|
||||||
cpuopt_unsafe_ignore_global_monitor =
|
|
||||||
|
|
||||||
[Renderer]
|
|
||||||
# Which backend API to use.
|
|
||||||
# 0: OpenGL (unsupported), 1 (default): Vulkan, 2: Null
|
|
||||||
backend =
|
|
||||||
|
|
||||||
# Whether to enable asynchronous presentation (Vulkan only)
|
|
||||||
# 0: Off, 1 (default): On
|
|
||||||
async_presentation =
|
|
||||||
|
|
||||||
# Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
force_max_clock =
|
|
||||||
|
|
||||||
# Enable graphics API debugging mode.
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
debug =
|
|
||||||
|
|
||||||
# Enable shader feedback.
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
renderer_shader_feedback =
|
|
||||||
|
|
||||||
# Enable Nsight Aftermath crash dumps
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
nsight_aftermath =
|
|
||||||
|
|
||||||
# Disable shader loop safety checks, executing the shader without loop logic changes
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
disable_shader_loop_safety_checks =
|
|
||||||
|
|
||||||
# Which Vulkan physical device to use (defaults to 0)
|
|
||||||
vulkan_device =
|
|
||||||
|
|
||||||
# 0: 0.5x (360p/540p) [EXPERIMENTAL]
|
|
||||||
# 1: 0.75x (540p/810p) [EXPERIMENTAL]
|
|
||||||
# 2 (default): 1x (720p/1080p)
|
|
||||||
# 3: 2x (1440p/2160p)
|
|
||||||
# 4: 3x (2160p/3240p)
|
|
||||||
# 5: 4x (2880p/4320p)
|
|
||||||
# 6: 5x (3600p/5400p)
|
|
||||||
# 7: 6x (4320p/6480p)
|
|
||||||
resolution_setup =
|
|
||||||
|
|
||||||
# Pixel filter to use when up- or down-sampling rendered frames.
|
|
||||||
# 0: Nearest Neighbor
|
|
||||||
# 1 (default): Bilinear
|
|
||||||
# 2: Bicubic
|
|
||||||
# 3: Gaussian
|
|
||||||
# 4: ScaleForce
|
|
||||||
# 5: AMD FidelityFX™️ Super Resolution [Vulkan Only]
|
|
||||||
scaling_filter =
|
|
||||||
|
|
||||||
# Anti-Aliasing (AA)
|
|
||||||
# 0 (default): None, 1: FXAA
|
|
||||||
anti_aliasing =
|
|
||||||
|
|
||||||
# Whether to use fullscreen or borderless window mode
|
|
||||||
# 0 (Windows default): Borderless window, 1 (All other default): Exclusive fullscreen
|
|
||||||
fullscreen_mode =
|
|
||||||
|
|
||||||
# Aspect ratio
|
|
||||||
# 0: Default (16:9), 1: Force 4:3, 2: Force 21:9, 3: Force 16:10, 4: Stretch to Window
|
|
||||||
aspect_ratio =
|
|
||||||
|
|
||||||
# Anisotropic filtering
|
|
||||||
# 0: Default, 1: 2x, 2: 4x, 3: 8x, 4: 16x
|
|
||||||
max_anisotropy =
|
|
||||||
|
|
||||||
# Whether to enable VSync or not.
|
|
||||||
# OpenGL: Values other than 0 enable VSync
|
|
||||||
# Vulkan: FIFO is selected if the requested mode is not supported by the driver.
|
|
||||||
# FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate.
|
|
||||||
# FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down.
|
|
||||||
# Mailbox can have lower latency than FIFO and does not tear but may drop frames.
|
|
||||||
# Immediate (no synchronization) just presents whatever is available and can exhibit tearing.
|
|
||||||
# 0: Immediate (Off), 1 (Default): Mailbox (On), 2: FIFO, 3: FIFO Relaxed
|
|
||||||
use_vsync =
|
|
||||||
|
|
||||||
# Selects the OpenGL shader backend. NV_gpu_program5 is required for GLASM. If NV_gpu_program5 is
|
|
||||||
# not available and GLASM is selected, GLSL will be used.
|
|
||||||
# 0: GLSL, 1 (default): GLASM, 2: SPIR-V
|
|
||||||
shader_backend =
|
|
||||||
|
|
||||||
# Whether to allow asynchronous shader building.
|
|
||||||
# 0 (default): Off, 1: On
|
|
||||||
use_asynchronous_shaders =
|
|
||||||
|
|
||||||
# Uses reactive flushing instead of predictive flushing. Allowing a more accurate syncing of memory.
|
|
||||||
# 0 (default): Off, 1: On
|
|
||||||
use_reactive_flushing =
|
|
||||||
|
|
||||||
# NVDEC emulation.
|
|
||||||
# 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding
|
|
||||||
nvdec_emulation =
|
|
||||||
|
|
||||||
# Accelerate ASTC texture decoding.
|
|
||||||
# 0 (default): Off, 1: On
|
|
||||||
accelerate_astc =
|
|
||||||
|
|
||||||
# Turns on the speed limiter, which will limit the emulation speed to the desired speed limit value
|
|
||||||
# 0: Off, 1: On (default)
|
|
||||||
use_speed_limit =
|
|
||||||
|
|
||||||
# Limits the speed of the game to run no faster than this value as a percentage of target speed
|
|
||||||
# 1 - 9999: Speed limit as a percentage of target game speed. 100 (default)
|
|
||||||
speed_limit =
|
|
||||||
|
|
||||||
# Whether to use disk based shader cache
|
|
||||||
# 0: Off, 1 (default): On
|
|
||||||
use_disk_shader_cache =
|
|
||||||
|
|
||||||
# Which gpu accuracy level to use
|
|
||||||
# 0 (default): Normal, 1: High, 2: Extreme (Very slow)
|
|
||||||
gpu_accuracy =
|
|
||||||
|
|
||||||
# Whether to use asynchronous GPU emulation
|
|
||||||
# 0 : Off (slow), 1 (default): On (fast)
|
|
||||||
use_asynchronous_gpu_emulation =
|
|
||||||
|
|
||||||
# Inform the guest that GPU operations completed more quickly than they did.
|
|
||||||
# 0: Off, 1 (default): On
|
|
||||||
use_fast_gpu_time =
|
|
||||||
|
|
||||||
# Force unmodified buffers to be flushed, which can cost performance.
|
|
||||||
# 0: Off (default), 1: On
|
|
||||||
use_pessimistic_flushes =
|
|
||||||
|
|
||||||
# Whether to use garbage collection or not for GPU caches.
|
|
||||||
# 0 (default): Off, 1: On
|
|
||||||
use_caches_gc =
|
|
||||||
|
|
||||||
# The clear color for the renderer. What shows up on the sides of the bottom screen.
|
|
||||||
# Must be in range of 0-255. Defaults to 0 for all.
|
|
||||||
bg_red =
|
|
||||||
bg_blue =
|
|
||||||
bg_green =
|
|
||||||
|
|
||||||
[Audio]
|
|
||||||
# Which audio output engine to use.
|
|
||||||
# auto (default): Auto-select
|
|
||||||
# cubeb: Cubeb audio engine (if available)
|
|
||||||
# sdl2: SDL2 audio engine (if available)
|
|
||||||
# null: No audio output
|
|
||||||
output_engine =
|
|
||||||
|
|
||||||
# Which audio device to use.
|
|
||||||
# auto (default): Auto-select
|
|
||||||
output_device =
|
|
||||||
|
|
||||||
# Output volume.
|
|
||||||
# 100 (default): 100%, 0; mute
|
|
||||||
volume =
|
|
||||||
|
|
||||||
[Data Storage]
|
|
||||||
# Whether to create a virtual SD card.
|
|
||||||
# 1: Yes, 0 (default): No
|
|
||||||
use_virtual_sd =
|
|
||||||
|
|
||||||
# Whether or not to enable gamecard emulation
|
|
||||||
# 1: Yes, 0 (default): No
|
|
||||||
gamecard_inserted =
|
|
||||||
|
|
||||||
# Whether or not the gamecard should be emulated as the current game
|
|
||||||
# If 'gamecard_inserted' is 0 this setting is irrelevant
|
|
||||||
# 1: Yes, 0 (default): No
|
|
||||||
gamecard_current_game =
|
|
||||||
|
|
||||||
# Path to an XCI file to use as the gamecard
|
|
||||||
# If 'gamecard_inserted' is 0 this setting is irrelevant
|
|
||||||
# If 'gamecard_current_game' is 1 this setting is irrelevant
|
|
||||||
gamecard_path =
|
|
||||||
|
|
||||||
[System]
|
|
||||||
# Whether the system is docked
|
|
||||||
# 1 (default): Yes, 0: No
|
|
||||||
use_docked_mode =
|
|
||||||
|
|
||||||
# Sets the seed for the RNG generator built into the switch
|
|
||||||
# rng_seed will be ignored and randomly generated if rng_seed_enabled is false
|
|
||||||
rng_seed_enabled =
|
|
||||||
rng_seed =
|
|
||||||
|
|
||||||
# Sets the current time (in seconds since 12:00 AM Jan 1, 1970) that will be used by the time service
|
|
||||||
# This will auto-increment, with the time set being the time the game is started
|
|
||||||
# This override will only occur if custom_rtc_enabled is true, otherwise the current time is used
|
|
||||||
custom_rtc_enabled =
|
|
||||||
custom_rtc =
|
|
||||||
|
|
||||||
# Sets the systems language index
|
|
||||||
# 0: Japanese, 1: English (default), 2: French, 3: German, 4: Italian, 5: Spanish, 6: Chinese,
|
|
||||||
# 7: Korean, 8: Dutch, 9: Portuguese, 10: Russian, 11: Taiwanese, 12: British English, 13: Canadian French,
|
|
||||||
# 14: Latin American Spanish, 15: Simplified Chinese, 16: Traditional Chinese, 17: Brazilian Portuguese
|
|
||||||
language_index =
|
|
||||||
|
|
||||||
# The system region that yuzu will use during emulation
|
|
||||||
# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan
|
|
||||||
region_index =
|
|
||||||
|
|
||||||
# The system time zone that yuzu will use during emulation
|
|
||||||
# 0: Auto-select (default), 1: Default (system archive value), Others: Index for specified time zone
|
|
||||||
time_zone_index =
|
|
||||||
|
|
||||||
# Sets the sound output mode.
|
|
||||||
# 0: Mono, 1 (default): Stereo, 2: Surround
|
|
||||||
sound_index =
|
|
||||||
|
|
||||||
[Miscellaneous]
|
|
||||||
# A filter which removes logs below a certain logging level.
|
|
||||||
# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical
|
|
||||||
log_filter = *:Trace
|
|
||||||
|
|
||||||
# Use developer keys
|
|
||||||
# 0 (default): Disabled, 1: Enabled
|
|
||||||
use_dev_keys =
|
|
||||||
|
|
||||||
[Debugging]
|
|
||||||
# Record frame time data, can be found in the log directory. Boolean value
|
|
||||||
record_frame_times =
|
|
||||||
# Determines whether or not yuzu will dump the ExeFS of all games it attempts to load while loading them
|
|
||||||
dump_exefs=false
|
|
||||||
# Determines whether or not yuzu will dump all NSOs it attempts to load while loading them
|
|
||||||
dump_nso=false
|
|
||||||
# Determines whether or not yuzu will save the filesystem access log.
|
|
||||||
enable_fs_access_log=false
|
|
||||||
# Enables verbose reporting services
|
|
||||||
reporting_services =
|
|
||||||
# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode
|
|
||||||
# false: Retail/Normal Mode (default), true: Kiosk Mode
|
|
||||||
quest_flag =
|
|
||||||
# Determines whether debug asserts should be enabled, which will throw an exception on asserts.
|
|
||||||
# false: Disabled (default), true: Enabled
|
|
||||||
use_debug_asserts =
|
|
||||||
# Determines whether unimplemented HLE service calls should be automatically stubbed.
|
|
||||||
# false: Disabled (default), true: Enabled
|
|
||||||
use_auto_stub =
|
|
||||||
# Enables/Disables the macro JIT compiler
|
|
||||||
disable_macro_jit=false
|
|
||||||
# Determines whether to enable the GDB stub and wait for the debugger to attach before running.
|
|
||||||
# false: Disabled (default), true: Enabled
|
|
||||||
use_gdbstub=false
|
|
||||||
# The port to use for the GDB server, if it is enabled.
|
|
||||||
gdbstub_port=6543
|
|
||||||
|
|
||||||
[WebService]
|
|
||||||
# Whether or not to enable telemetry
|
|
||||||
# 0: No, 1 (default): Yes
|
|
||||||
enable_telemetry =
|
|
||||||
# URL for Web API
|
|
||||||
web_api_url = https://api.yuzu-emu.org
|
|
||||||
# Username and token for yuzu Web Service
|
|
||||||
# See https://profile.yuzu-emu.org/ for more info
|
|
||||||
yuzu_username =
|
|
||||||
yuzu_token =
|
|
||||||
|
|
||||||
[Network]
|
|
||||||
# Name of the network interface device to use with yuzu LAN play.
|
|
||||||
# e.g. On *nix: 'enp7s0', 'wlp6s0u1u3u3', 'lo'
|
|
||||||
# e.g. On Windows: 'Ethernet', 'Wi-Fi'
|
|
||||||
network_interface =
|
|
||||||
|
|
||||||
[AddOns]
|
|
||||||
# Used to disable add-ons
|
|
||||||
# List of title IDs of games that will have add-ons disabled (separated by '|'):
|
|
||||||
title_ids =
|
|
||||||
# For each title ID, have a key/value pair called `disabled_<title_id>` equal to the names of the add-ons to disable (sep. by '|')
|
|
||||||
# e.x. disabled_0100000000010000 = Update|DLC <- disables Updates and DLC on Super Mario Odyssey
|
|
||||||
)";
|
|
||||||
} // namespace DefaultINI
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "input_common/drivers/virtual_gamepad.h"
|
#include "input_common/drivers/virtual_gamepad.h"
|
||||||
#include "input_common/main.h"
|
#include "input_common/main.h"
|
||||||
#include "jni/emu_window/emu_window.h"
|
#include "jni/emu_window/emu_window.h"
|
||||||
|
#include "jni/native.h"
|
||||||
|
|
||||||
void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
|
void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
|
||||||
m_window_width = ANativeWindow_getWidth(surface);
|
m_window_width = ANativeWindow_getWidth(surface);
|
||||||
|
@ -57,6 +58,13 @@ void EmuWindow_Android::OnRemoveNfcTag() {
|
||||||
m_input_subsystem->GetVirtualAmiibo()->CloseAmiibo();
|
m_input_subsystem->GetVirtualAmiibo()->CloseAmiibo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmuWindow_Android::OnFrameDisplayed() {
|
||||||
|
if (!m_first_frame) {
|
||||||
|
EmulationSession::GetInstance().OnEmulationStarted();
|
||||||
|
m_first_frame = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EmuWindow_Android::EmuWindow_Android(InputCommon::InputSubsystem* input_subsystem,
|
EmuWindow_Android::EmuWindow_Android(InputCommon::InputSubsystem* input_subsystem,
|
||||||
ANativeWindow* surface,
|
ANativeWindow* surface,
|
||||||
std::shared_ptr<Common::DynamicLibrary> driver_library)
|
std::shared_ptr<Common::DynamicLibrary> driver_library)
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
float gyro_z, float accel_x, float accel_y, float accel_z);
|
float gyro_z, float accel_x, float accel_y, float accel_z);
|
||||||
void OnReadNfcTag(std::span<u8> data);
|
void OnReadNfcTag(std::span<u8> data);
|
||||||
void OnRemoveNfcTag();
|
void OnRemoveNfcTag();
|
||||||
void OnFrameDisplayed() override {}
|
void OnFrameDisplayed() override;
|
||||||
|
|
||||||
std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override {
|
std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override {
|
||||||
return {std::make_unique<GraphicsContext_Android>(m_driver_library)};
|
return {std::make_unique<GraphicsContext_Android>(m_driver_library)};
|
||||||
|
@ -61,4 +61,6 @@ private:
|
||||||
float m_window_height{};
|
float m_window_height{};
|
||||||
|
|
||||||
std::shared_ptr<Common::DynamicLibrary> m_driver_library;
|
std::shared_ptr<Common::DynamicLibrary> m_driver_library;
|
||||||
|
|
||||||
|
bool m_first_frame = false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -52,8 +52,8 @@
|
||||||
#include "core/hle/service/am/applets/applets.h"
|
#include "core/hle/service/am/applets/applets.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
|
#include "frontend_common/config.h"
|
||||||
#include "jni/android_common/android_common.h"
|
#include "jni/android_common/android_common.h"
|
||||||
#include "jni/config.h"
|
|
||||||
#include "jni/id_cache.h"
|
#include "jni/id_cache.h"
|
||||||
#include "jni/native.h"
|
#include "jni/native.h"
|
||||||
#include "video_core/renderer_base.h"
|
#include "video_core/renderer_base.h"
|
||||||
|
@ -199,8 +199,8 @@ bool EmulationSession::IsPaused() const {
|
||||||
return m_is_running && m_is_paused;
|
return m_is_running && m_is_paused;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Core::PerfStatsResults& EmulationSession::PerfStats() const {
|
const Core::PerfStatsResults& EmulationSession::PerfStats() {
|
||||||
std::scoped_lock m_perf_stats_lock(m_perf_stats_mutex);
|
m_perf_stats = m_system.GetAndResetPerfStats();
|
||||||
return m_perf_stats;
|
return m_perf_stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,14 @@ void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmulationSession::InitializeSystem() {
|
void EmulationSession::InitializeSystem(bool reload) {
|
||||||
|
if (!reload) {
|
||||||
|
// Initialize logging system
|
||||||
|
Common::Log::Initialize();
|
||||||
|
Common::Log::SetColorConsoleBackendEnabled(true);
|
||||||
|
Common::Log::Start();
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize filesystem.
|
// Initialize filesystem.
|
||||||
m_system.SetFilesystem(m_vfs);
|
m_system.SetFilesystem(m_vfs);
|
||||||
m_system.GetUserChannel().clear();
|
m_system.GetUserChannel().clear();
|
||||||
|
@ -365,8 +372,6 @@ void EmulationSession::RunEmulation() {
|
||||||
m_system.InitializeDebugger();
|
m_system.InitializeDebugger();
|
||||||
}
|
}
|
||||||
|
|
||||||
OnEmulationStarted();
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
{
|
{
|
||||||
[[maybe_unused]] std::unique_lock lock(m_mutex);
|
[[maybe_unused]] std::unique_lock lock(m_mutex);
|
||||||
|
@ -376,11 +381,6 @@ void EmulationSession::RunEmulation() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
|
||||||
// Refresh performance stats.
|
|
||||||
std::scoped_lock m_perf_stats_lock(m_perf_stats_mutex);
|
|
||||||
m_perf_stats = m_system.GetAndResetPerfStats();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,10 +462,6 @@ void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
|
static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
|
||||||
Common::Log::Initialize();
|
|
||||||
Common::Log::SetColorConsoleBackendEnabled(true);
|
|
||||||
Common::Log::Start();
|
|
||||||
|
|
||||||
MicroProfileOnThreadCreate("EmuThread");
|
MicroProfileOnThreadCreate("EmuThread");
|
||||||
SCOPE_EXIT({ MicroProfileShutdown(); });
|
SCOPE_EXIT({ MicroProfileShutdown(); });
|
||||||
|
|
||||||
|
@ -666,12 +662,13 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_onTouchReleased(JNIEnv* env, jclass c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz) {
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz,
|
||||||
// Create the default config.ini.
|
jboolean reload) {
|
||||||
Config{};
|
|
||||||
// Initialize the emulated system.
|
// Initialize the emulated system.
|
||||||
EmulationSession::GetInstance().System().Initialize();
|
if (!reload) {
|
||||||
EmulationSession::GetInstance().InitializeSystem();
|
EmulationSession::GetInstance().System().Initialize();
|
||||||
|
}
|
||||||
|
EmulationSession::GetInstance().InitializeSystem(reload);
|
||||||
}
|
}
|
||||||
|
|
||||||
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_defaultCPUCore(JNIEnv* env, jclass clazz) {
|
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_defaultCPUCore(JNIEnv* env, jclass clazz) {
|
||||||
|
@ -681,17 +678,6 @@ jint Java_org_yuzu_yuzu_1emu_NativeLibrary_defaultCPUCore(JNIEnv* env, jclass cl
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2Ljava_lang_String_2Z(
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run__Ljava_lang_String_2Ljava_lang_String_2Z(
|
||||||
JNIEnv* env, jclass clazz, jstring j_file, jstring j_savestate, jboolean j_delete_savestate) {}
|
JNIEnv* env, jclass clazz, jstring j_file, jstring j_savestate, jboolean j_delete_savestate) {}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadSettings(JNIEnv* env, jclass clazz) {
|
|
||||||
Config{};
|
|
||||||
}
|
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initGameIni(JNIEnv* env, jclass clazz,
|
|
||||||
jstring j_game_id) {
|
|
||||||
std::string_view game_id = env->GetStringUTFChars(j_game_id, 0);
|
|
||||||
|
|
||||||
env->ReleaseStringUTFChars(j_game_id, game_id.data());
|
|
||||||
}
|
|
||||||
|
|
||||||
jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) {
|
jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) {
|
||||||
jdoubleArray j_stats = env->NewDoubleArray(4);
|
jdoubleArray j_stats = env->NewDoubleArray(4);
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,9 @@ public:
|
||||||
void RunEmulation();
|
void RunEmulation();
|
||||||
void ShutdownEmulation();
|
void ShutdownEmulation();
|
||||||
|
|
||||||
const Core::PerfStatsResults& PerfStats() const;
|
const Core::PerfStatsResults& PerfStats();
|
||||||
void ConfigureFilesystemProvider(const std::string& filepath);
|
void ConfigureFilesystemProvider(const std::string& filepath);
|
||||||
void InitializeSystem();
|
void InitializeSystem(bool reload);
|
||||||
Core::SystemResultStatus InitializeEmulation(const std::string& filepath);
|
Core::SystemResultStatus InitializeEmulation(const std::string& filepath);
|
||||||
|
|
||||||
bool IsHandheldOnly();
|
bool IsHandheldOnly();
|
||||||
|
@ -52,9 +52,10 @@ public:
|
||||||
void OnGamepadDisconnectEvent([[maybe_unused]] int index);
|
void OnGamepadDisconnectEvent([[maybe_unused]] int index);
|
||||||
SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard();
|
SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard();
|
||||||
|
|
||||||
|
static void OnEmulationStarted();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
|
static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max);
|
||||||
static void OnEmulationStarted();
|
|
||||||
static void OnEmulationStopped(Core::SystemResultStatus result);
|
static void OnEmulationStopped(Core::SystemResultStatus result);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -80,6 +81,5 @@ private:
|
||||||
|
|
||||||
// Synchronization
|
// Synchronization
|
||||||
std::condition_variable_any m_cv;
|
std::condition_variable_any m_cv;
|
||||||
mutable std::mutex m_perf_stats_mutex;
|
|
||||||
mutable std::mutex m_mutex;
|
mutable std::mutex m_mutex;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,11 +5,14 @@
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include "android_config.h"
|
||||||
|
#include "android_settings.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
|
#include "frontend_common/config.h"
|
||||||
#include "jni/android_common/android_common.h"
|
#include "jni/android_common/android_common.h"
|
||||||
#include "jni/config.h"
|
|
||||||
#include "uisettings.h"
|
std::unique_ptr<AndroidConfig> config;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
Settings::Setting<T>* getSetting(JNIEnv* env, jstring jkey) {
|
Settings::Setting<T>* getSetting(JNIEnv* env, jstring jkey) {
|
||||||
|
@ -28,6 +31,22 @@ Settings::Setting<T>* getSetting(JNIEnv* env, jstring jkey) {
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_initializeConfig(JNIEnv* env, jobject obj) {
|
||||||
|
config = std::make_unique<AndroidConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_unloadConfig(JNIEnv* env, jobject obj) {
|
||||||
|
config.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_reloadSettings(JNIEnv* env, jobject obj) {
|
||||||
|
config->AndroidConfig::ReloadAllValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_saveSettings(JNIEnv* env, jobject obj) {
|
||||||
|
config->AndroidConfig::SaveAllValues();
|
||||||
|
}
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj,
|
jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj,
|
||||||
jstring jkey, jboolean getDefault) {
|
jstring jkey, jboolean getDefault) {
|
||||||
auto setting = getSetting<bool>(env, jkey);
|
auto setting = getSetting<bool>(env, jkey);
|
||||||
|
|
31
src/android/app/src/main/jni/native_log.cpp
Normal file
31
src/android/app/src/main/jni/native_log.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <common/logging/log.h>
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include "android_common/android_common.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_DEBUG(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_WARNING(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_INFO(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_ERROR(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) {
|
||||||
|
LOG_CRITICAL(Frontend, "{}", GetJString(env, jmessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // extern "C"
|
9
src/android/app/src/main/res/drawable/ic_audio.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_audio.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_code.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_code.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M320,720 L80,480l240,-240 57,57 -184,184 183,183 -56,56ZM640,720 L583,663 767,479 584,296 640,240 880,480 640,720Z"/>
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_graphics.xml
Normal file
9
src/android/app/src/main/res/drawable/ic_graphics.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M160,840q-33,0 -56.5,-23.5T80,760v-560q0,-33 23.5,-56.5T160,120h560q33,0 56.5,23.5T800,200v80h80v80h-80v80h80v80h-80v80h80v80h-80v80q0,33 -23.5,56.5T720,840L160,840ZM160,760h560v-560L160,200v560ZM240,680h200v-160L240,520v160ZM480,400h160v-120L480,280v120ZM240,480h200v-200L240,280v200ZM480,680h160v-240L480,440v240ZM160,200v560,-560Z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M320,960q-17,0 -28.5,-11.5T280,920q0,-17 11.5,-28.5T320,880q17,0 28.5,11.5T360,920q0,17 -11.5,28.5T320,960ZM480,960q-17,0 -28.5,-11.5T440,920q0,-17 11.5,-28.5T480,880q17,0 28.5,11.5T520,920q0,17 -11.5,28.5T480,960ZM640,960q-17,0 -28.5,-11.5T600,920q0,-17 11.5,-28.5T640,880q17,0 28.5,11.5T680,920q0,17 -11.5,28.5T640,960ZM320,800q-33,0 -56.5,-23.5T240,720v-640q0,-33 23.5,-56.5T320,0h320q33,0 56.5,23.5T720,80v640q0,33 -23.5,56.5T640,800L320,800ZM320,720h320v-40L320,680v40ZM320,600h320v-400L320,200v400ZM320,120h320v-40L320,80v40ZM320,120v-40,40ZM320,720v-40,40Z"/>
|
||||||
|
</vector>
|
233
src/android/app/src/main/res/layout-w600dp/fragment_about.xml
Normal file
233
src/android/app/src/main/res/layout-w600dp/fragment_about.xml
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/coordinator_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:navigationIcon="@drawable/ic_back"
|
||||||
|
app:title="@string/about" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.core.widget.NestedScrollView
|
||||||
|
android:id="@+id/scroll_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fadeScrollbars="false"
|
||||||
|
android:scrollbars="vertical"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/content_about"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image_logo"
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:padding="20dp"
|
||||||
|
android:src="@drawable/ic_yuzu_title" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@string/about"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/about_app_description"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.divider.MaterialDivider
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="20dp" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/button_contributors"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@string/contributors"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/contributors_description"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.divider.MaterialDivider
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="20dp" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/button_licenses"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@string/licenses"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/licenses_description"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.divider.MaterialDivider
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="20dp" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/button_build_hash"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:text="@string/build"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/text_build_hash"
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
tools:text="abc123" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.divider.MaterialDivider
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="20dp" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="40dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_discord"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:icon="@drawable/ic_discord"
|
||||||
|
app:iconGravity="textEnd"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_website"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:icon="@drawable/ic_website"
|
||||||
|
app:iconGravity="textEnd"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_github"
|
||||||
|
style="?attr/materialIconButtonStyle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:icon="@drawable/ic_github"
|
||||||
|
app:iconGravity="textEnd"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -6,8 +6,8 @@
|
||||||
android:id="@+id/option_card"
|
android:id="@+id/option_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginVertical="12dp"
|
android:layout_marginBottom="24dp"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="12dp"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="?attr/selectableItemBackground"
|
||||||
android:backgroundTint="?attr/colorSurfaceVariant"
|
android:backgroundTint="?attr/colorSurfaceVariant"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
|
|
|
@ -38,17 +38,17 @@
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/image_logo"
|
android:id="@+id/image_logo"
|
||||||
android:layout_width="250dp"
|
android:layout_width="150dp"
|
||||||
android:layout_height="250dp"
|
android:layout_height="150dp"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_marginBottom="28dp"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:src="@drawable/ic_yuzu_title" />
|
android:src="@drawable/ic_yuzu_title" />
|
||||||
|
|
||||||
<com.google.android.material.divider.MaterialDivider
|
<com.google.android.material.divider.MaterialDivider
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="20dp"
|
android:layout_marginHorizontal="20dp" />
|
||||||
android:layout_marginTop="28dp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -134,18 +134,21 @@
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/overlay_container"
|
android:id="@+id/overlay_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
<TextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/show_fps_text"
|
android:id="@+id/show_fps_text"
|
||||||
|
style="@style/TextAppearance.Material3.BodySmall"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="left"
|
android:layout_gravity="left"
|
||||||
android:clickable="false"
|
android:clickable="false"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:shadowColor="@android:color/black"
|
android:paddingHorizontal="20dp"
|
||||||
android:textColor="@android:color/white"
|
android:textColor="@android:color/white"
|
||||||
android:textSize="12sp"
|
android:shadowColor="@android:color/black"
|
||||||
|
android:shadowRadius="3"
|
||||||
tools:ignore="RtlHardcoded" />
|
tools:ignore="RtlHardcoded" />
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
|
@ -14,13 +14,14 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:background="?attr/colorSurface">
|
android:background="?attr/colorSurface"
|
||||||
|
android:paddingHorizontal="8dp">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/logo_image"
|
android:id="@+id/logo_image"
|
||||||
android:layout_width="128dp"
|
android:layout_width="96dp"
|
||||||
android:layout_height="128dp"
|
android:layout_height="96dp"
|
||||||
android:layout_margin="64dp"
|
android:layout_marginVertical="32dp"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:src="@drawable/ic_yuzu_full" />
|
android:src="@drawable/ic_yuzu_full" />
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingVertical="4dp"
|
android:paddingVertical="4dp"
|
||||||
|
app:checkedChip="@id/chip_recently_played"
|
||||||
app:chipSpacingHorizontal="12dp"
|
app:chipSpacingHorizontal="12dp"
|
||||||
app:singleLine="true"
|
app:singleLine="true"
|
||||||
app:singleSelection="true">
|
app:singleSelection="true">
|
||||||
|
|
|
@ -10,41 +10,59 @@
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:minHeight="72dp"
|
android:minHeight="72dp"
|
||||||
android:padding="@dimen/spacing_large">
|
android:padding="16dp">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<ImageView
|
||||||
android:id="@+id/text_setting_name"
|
android:id="@+id/icon"
|
||||||
style="@style/TextAppearance.Material3.HeadlineMedium"
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:tint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textAlignment="viewStart"
|
android:orientation="vertical">
|
||||||
android:textSize="16sp"
|
|
||||||
app:lineHeight="22dp"
|
|
||||||
tools:text="Setting Name" />
|
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/text_setting_description"
|
android:id="@+id/text_setting_name"
|
||||||
style="@style/TextAppearance.Material3.BodySmall"
|
style="@style/TextAppearance.Material3.HeadlineMedium"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:textAlignment="viewStart"
|
||||||
android:textAlignment="viewStart"
|
android:textSize="17sp"
|
||||||
tools:text="@string/app_disclaimer" />
|
app:lineHeight="22dp"
|
||||||
|
tools:text="Setting Name" />
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/text_setting_value"
|
android:id="@+id/text_setting_description"
|
||||||
style="@style/TextAppearance.Material3.LabelMedium"
|
style="@style/TextAppearance.Material3.BodySmall"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textStyle="bold"
|
tools:text="@string/app_disclaimer" />
|
||||||
tools:text="1x" />
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/text_setting_value"
|
||||||
|
style="@style/TextAppearance.Material3.LabelMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:textSize="13sp"
|
||||||
|
tools:text="1x" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,7 @@
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
android:minHeight="72dp"
|
android:minHeight="72dp"
|
||||||
android:paddingVertical="@dimen/spacing_large"
|
android:padding="16dp">
|
||||||
android:paddingStart="@dimen/spacing_large"
|
|
||||||
android:paddingEnd="24dp">
|
|
||||||
|
|
||||||
<com.google.android.material.materialswitch.MaterialSwitch
|
<com.google.android.material.materialswitch.MaterialSwitch
|
||||||
android:id="@+id/switch_widget"
|
android:id="@+id/switch_widget"
|
||||||
|
@ -24,7 +22,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="24dp"
|
||||||
android:layout_toStartOf="@+id/switch_widget"
|
android:layout_toStartOf="@+id/switch_widget"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
@ -35,7 +33,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textSize="16sp"
|
android:textSize="17sp"
|
||||||
app:lineHeight="28dp"
|
app:lineHeight="28dp"
|
||||||
tools:text="@string/frame_limit_enable" />
|
tools:text="@string/frame_limit_enable" />
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="start|center_vertical"
|
android:layout_gravity="start|center_vertical"
|
||||||
android:paddingHorizontal="@dimen/spacing_large"
|
android:paddingHorizontal="@dimen/spacing_large"
|
||||||
android:paddingVertical="16dp"
|
android:paddingTop="16dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textColor="?attr/colorPrimary"
|
android:textColor="?attr/colorPrimary"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
|
|
1
src/android/app/src/main/res/resources.properties
Normal file
1
src/android/app/src/main/res/resources.properties
Normal file
|
@ -0,0 +1 @@
|
||||||
|
unqualifiedResLocale=en-US
|
385
src/android/app/src/main/res/values-ar/strings.xml
Normal file
385
src/android/app/src/main/res/values-ar/strings.xml
Normal file
|
@ -0,0 +1,385 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
|
<string name="emulation_notification_channel_name">المحاكي نشط</string>
|
||||||
|
<string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
|
||||||
|
<string name="emulation_notification_running">يوزو يعمل</string>
|
||||||
|
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
|
||||||
|
<string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
|
||||||
|
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
|
||||||
|
|
||||||
|
<!-- Setup strings -->
|
||||||
|
<string name="welcome">مرحبًا</string>
|
||||||
|
<string name="welcome_description">والانتقال إلى المحاكاة <b>يوزو</b> تعرف على كيفية إعداد.</string>
|
||||||
|
<string name="get_started">لنبدأ</string>
|
||||||
|
<string name="keys">المفاتيح</string>
|
||||||
|
<string name="keys_description">اختر ملف <b>prod.keys</b> من الزر ادناه</string>
|
||||||
|
<string name="select_keys">إختيار المفاتيح</string>
|
||||||
|
<string name="games">الألعاب</string>
|
||||||
|
<string name="games_description">اختر مجلد <b>العابك</b> من الزر ادناه.</string>
|
||||||
|
<string name="done">إنهاء</string>
|
||||||
|
<string name="done_description">كل شيء جاهز./n استمتع بألعابك!</string>
|
||||||
|
<string name="text_continue">استمر</string>
|
||||||
|
<string name="next">التالي</string>
|
||||||
|
<string name="back">عودة</string>
|
||||||
|
<string name="add_games">إضافة ألعاب</string>
|
||||||
|
<string name="add_games_description">إختار مجلد ألعابك</string>
|
||||||
|
<string name="step_complete">مكتمل</string>
|
||||||
|
|
||||||
|
<!-- Home strings -->
|
||||||
|
<string name="home_games">الألعاب</string>
|
||||||
|
<string name="home_search">البحث</string>
|
||||||
|
<string name="home_settings">الإعدادات</string>
|
||||||
|
<string name="empty_gamelist">لم يتم العثور على ملفات او لم يتم تحديد مسار العاب.</string>
|
||||||
|
<string name="search_and_filter_games">بحث وتصفية الألعاب</string>
|
||||||
|
<string name="select_games_folder">تحديد مجلد الألعاب</string>
|
||||||
|
<string name="select_games_folder_description">يسمح لـ يوزو بملء قائمة الألعاب</string>
|
||||||
|
<string name="add_games_warning">تخطُ اختيار مجلد الالعاب؟</string>
|
||||||
|
<string name="add_games_warning_description">لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد</string>
|
||||||
|
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
|
||||||
|
<string name="home_search_games">البحث عن ألعاب</string>
|
||||||
|
<string name="search_settings">إعدادات البحث</string>
|
||||||
|
<string name="games_dir_selected">تم تحديد مجلد الألعاب</string>
|
||||||
|
<string name="install_prod_keys">تثبيت prod.keys</string>
|
||||||
|
<string name="install_prod_keys_description">مطلوب لفك تشفير ألعاب البيع بالتجزئة</string>
|
||||||
|
<string name="install_prod_keys_warning">تخطي إضافة المفاتيح؟</string>
|
||||||
|
<string name="install_prod_keys_warning_description">مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت</string>
|
||||||
|
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
|
||||||
|
<string name="notifications">التنبيهات</string>
|
||||||
|
<string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string>
|
||||||
|
<string name="give_permission">منح الإذن</string>
|
||||||
|
<string name="notification_warning">تخطي منح إذن الإشعارات؟</string>
|
||||||
|
<string name="notification_warning_description">لن يتمكن يوزو من إشعارك بالمعلومات المهمة</string>
|
||||||
|
<string name="permission_denied">تم رفض الإذن</string>
|
||||||
|
<string name="permission_denied_description">لقد رفضت هذا الإذن عدة مرات ويتعين عليك الآن منحه يدويًا في إعدادات النظام</string>
|
||||||
|
<string name="about">حول</string>
|
||||||
|
<string name="about_description">بناء الإصدار، والاعتمادات، وأكثر من ذلك</string>
|
||||||
|
<string name="warning_help">مساعدة</string>
|
||||||
|
<string name="warning_skip">تخطي</string>
|
||||||
|
<string name="warning_cancel">إلغاء</string>
|
||||||
|
<string name="install_amiibo_keys">تثبيت مفاتيح أميبو</string>
|
||||||
|
<string name="install_amiibo_keys_description">مطلوب لاستخدام أميبو في اللعبة</string>
|
||||||
|
<string name="invalid_keys_file">تم تحديد ملف مفاتيح غير صالح</string>
|
||||||
|
<string name="install_keys_success">تم تثبيت المفاتيح بنجاح</string>
|
||||||
|
<string name="reading_keys_failure">خطأ في قراءة مفاتيح التشفير</string>
|
||||||
|
<string name="invalid_keys_error">مفاتيح التشفير غير صالحة</string>
|
||||||
|
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
||||||
|
<string name="install_keys_failure_description">الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك</string>
|
||||||
|
<string name="install_gpu_driver">GPU تثبيت برنامج تشغيل</string>
|
||||||
|
<string name="install_gpu_driver_description">قم بتثبيت برامج تشغيل بديلة للحصول على أداء أو دقة أفضل</string>
|
||||||
|
<string name="advanced_settings">إعدادات متقدمة</string>
|
||||||
|
<string name="advanced_settings_game">إعدادات متقدمة: %1$s</string>
|
||||||
|
<string name="settings_description">تكوين إعدادات المحاكي</string>
|
||||||
|
<string name="search_recently_played">لعبت مؤخرا</string>
|
||||||
|
<string name="search_recently_added">أضيف مؤخرا</string>
|
||||||
|
<string name="search_retail">بيع بالتجزئة</string>
|
||||||
|
<string name="search_homebrew">البيرة المنزلية</string>
|
||||||
|
<string name="open_user_folder">فتح مجلد يوزو</string>
|
||||||
|
<string name="open_user_folder_description">إدارة ملفات يوزو الداخلية</string>
|
||||||
|
<string name="theme_and_color_description">تعديل مظهر التطبيق</string>
|
||||||
|
<string name="no_file_manager">لم يتم العثور على مدير الملفات</string>
|
||||||
|
<string name="notification_no_directory_link">لا يمكن فتح مجلد يوزو</string>
|
||||||
|
<string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير الملفات يدويًا</string>
|
||||||
|
<string name="manage_save_data">إدارة حفظ البيانات</string>
|
||||||
|
<string name="manage_save_data_description">حفظ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string>
|
||||||
|
<string name="import_export_saves_description">استيراد أو تصدير ملفات الحفظ</string>
|
||||||
|
<string name="save_file_imported_success">تم الاستيراد بنجاح</string>
|
||||||
|
<string name="save_file_invalid_zip_structure">بنية مجلد الحفظ غير صالحة</string>
|
||||||
|
<string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو معرف عنوان اللعبة.</string>
|
||||||
|
<string name="import_saves">استيراد</string>
|
||||||
|
<string name="export_saves">تصدير</string>
|
||||||
|
<string name="install_firmware">تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="firmware_installing">تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="firmware_installed_success">تم تثبيت البرامج الثابتة بنجاح</string>
|
||||||
|
<string name="firmware_installed_failure">فشل تثبيت البرامج الثابتة</string>
|
||||||
|
<string name="share_log">مشاركة سجلات التصحيح</string>
|
||||||
|
<string name="share_log_description">مشاركة ملف سجل يوزو لتصحيح المشكلات</string>
|
||||||
|
<string name="share_log_missing">لم يتم العثور على ملف السجل</string>
|
||||||
|
<string name="install_game_content">تثبيت محتوى اللعبة</string>
|
||||||
|
<string name="install_game_content_description">DLC قم بتثبيت تحديثات اللعبة أو</string>
|
||||||
|
<string name="installing_game_content">جارٍ تثبيت المحتوى</string>
|
||||||
|
<string name="install_game_content_failure_base">لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string>
|
||||||
|
<string name="install_game_content_success_install">%1$d تم التثبيت بنجاح</string>
|
||||||
|
<string name="install_game_content_success_overwrite">%1$d تمت الكتابة فوقه بنجاح</string>
|
||||||
|
<string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
|
||||||
|
<string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string>
|
||||||
|
<string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم!</string>
|
||||||
|
<string name="manage_yuzu_data">إدارة بيانات يوزو</string>
|
||||||
|
<string name="manage_yuzu_data_description">استيراد/تصدير البرامج الثابتة والمفاتيح وبيانات المستخدم والمزيد!</string>
|
||||||
|
<string name="share_save_file">مشاركة ملف الحفظ</string>
|
||||||
|
<string name="export_save_failed">فشل تصدير الحفظ</string>
|
||||||
|
|
||||||
|
<string name="copied_to_clipboard">نسخ إلى الحافظة</string>
|
||||||
|
<string name="about_app_description">محاكي سويتش مفتوح المصدر</string>
|
||||||
|
<string name="contributors">المساهمين</string>
|
||||||
|
<string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
|
||||||
|
<string name="licenses_description">المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا</string>
|
||||||
|
<string name="build">البناء</string>
|
||||||
|
<string name="user_data">بيانات المستخدم</string>
|
||||||
|
<string name="exporting_user_data">جارٍ تصدير بيانات المستخدم</string>
|
||||||
|
<string name="importing_user_data">جارٍ استيراد بيانات المستخدم</string>
|
||||||
|
<string name="import_user_data">استيراد بيانات المستخدم</string>
|
||||||
|
<string name="invalid_yuzu_backup">نسخة احتياطية يوزو غير صالحة</string>
|
||||||
|
<string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string>
|
||||||
|
<string name="user_data_import_success">تم استيراد بيانات المستخدم بنجاح</string>
|
||||||
|
<string name="user_data_export_cancelled">تم إلغاء التصدير</string>
|
||||||
|
<string name="support_link">https://discord.gg/u77vRWY</string>
|
||||||
|
<string name="website_link">https://yuzu-emu.org/</string>
|
||||||
|
<string name="github_link">https://github.com/yuzu-emu</string>
|
||||||
|
|
||||||
|
<!-- Early access upgrade strings -->
|
||||||
|
<string name="early_access">الوصول المبكر</string>
|
||||||
|
<string name="get_early_access">احصل على الوصول المبكر</string>
|
||||||
|
<string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
|
||||||
|
<string name="get_early_access_description">الميزات المتطورة، والوصول المبكر إلى التحديثات، وأكثر من ذلك</string>
|
||||||
|
<string name="early_access_benefits">مزايا الوصول المبكر</string>
|
||||||
|
<string name="cutting_edge_features">ميزات متطورة</string>
|
||||||
|
<string name="early_access_updates">الوصول المبكر إلى التحديثات</string>
|
||||||
|
<string name="no_manual_installation">لا يوجد التثبيت اليدوي</string>
|
||||||
|
<string name="prioritized_support">الدعم ذو الأولوية</string>
|
||||||
|
<string name="helping_game_preservation">المساعدة في الحفاظ على اللعبة</string>
|
||||||
|
<string name="our_eternal_gratitude">امتناننا الأبدي</string>
|
||||||
|
<string name="are_you_interested">هل انت مهتم؟</string>
|
||||||
|
|
||||||
|
<!-- General settings strings -->
|
||||||
|
<string name="frame_limit_enable">الحد من السرعة</string>
|
||||||
|
<string name="frame_limit_enable_description">يحد من سرعة المحاكاة بنسبة محددة من السرعة العادية</string>
|
||||||
|
<string name="frame_limit_slider">الحد من السرعة في المئة</string>
|
||||||
|
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. 100% هي السرعة الطبيعية. ستؤدي القيم الأعلى أو الأدنى إلى زيادة أو تقليل حد السرعة.</string>
|
||||||
|
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
||||||
|
<string name="value_with_units">%1$s%2$s</string>
|
||||||
|
|
||||||
|
<!-- System settings strings -->
|
||||||
|
<string name="use_docked_mode">وضع الإرساء</string>
|
||||||
|
<string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string>
|
||||||
|
<string name="emulated_region">المنطقة التي تمت محاكاتها</string>
|
||||||
|
<string name="emulated_language">لغة المحاكاه</string>
|
||||||
|
<string name="select_rtc_date">حدد التاريخ و الساعة في الوقت الحقيقي</string>
|
||||||
|
<string name="select_rtc_time">حدد وقت الساعة في الوقت الفعلي</string>
|
||||||
|
<string name="use_custom_rtc">ساعة مخصصة في الوقت الحقيقي</string>
|
||||||
|
<string name="use_custom_rtc_description">يسمح لك بتعيين ساعة مخصصة في الوقت الفعلي منفصلة عن وقت النظام الحالي لديك</string>
|
||||||
|
<string name="set_custom_rtc">تعيين ساعة مخصصة في الوقت الحقيقي</string>
|
||||||
|
|
||||||
|
<!-- Graphics settings strings -->
|
||||||
|
<string name="renderer_accuracy">مستوى الدقة</string>
|
||||||
|
<string name="renderer_resolution">(Handheld/Docked) الدقة</string>
|
||||||
|
<string name="renderer_vsync">VSync وضع</string>
|
||||||
|
<string name="renderer_screen_layout">الاتجاه</string>
|
||||||
|
<string name="renderer_aspect_ratio">تناسب الابعاد</string>
|
||||||
|
<string name="renderer_anti_aliasing">طريقة مكافحة التعرج</string>
|
||||||
|
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
|
||||||
|
<string name="renderer_asynchronous_shaders_description">يجمع التظليل بشكل غير متزامن، مما يقلل من التأتأة ولكنه قد يؤدي إلى حدوث بعض الأخطاء.</string>
|
||||||
|
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||||
|
<string name="renderer_reactive_flushing_description">تحسين دقة العرض في بعض الألعاب على حساب الأداء</string>
|
||||||
|
<string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
|
||||||
|
|
||||||
|
<!-- Debug settings strings -->
|
||||||
|
<string name="cpu">وحدة المعالج المركزية</string>
|
||||||
|
<string name="cpu_debug_mode">تصحيح أخطاء وحدة المعالجة المركزية</string>
|
||||||
|
<string name="cpu_debug_mode_description">يضع وحدة المعالجة المركزية في وضع التصحيح البطيء.</string>
|
||||||
|
<string name="gpu">GPU</string>
|
||||||
|
<string name="renderer_api">API</string>
|
||||||
|
<string name="renderer_debug">تصحيح الأخطاء الرسومية</string>
|
||||||
|
<string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
|
||||||
|
<string name="fastmem">Fastmem</string>
|
||||||
|
|
||||||
|
<!-- Audio settings strings -->
|
||||||
|
<string name="audio_output_engine">محرك الإخراج</string>
|
||||||
|
<string name="audio_volume">حجم</string>
|
||||||
|
<string name="audio_volume_description">يحدد حجم إخراج الصوت</string>
|
||||||
|
|
||||||
|
<!-- Miscellaneous -->
|
||||||
|
<string name="slider_default">افتراضي</string>
|
||||||
|
<string name="ini_saved">الإعدادات المحفوظة</string>
|
||||||
|
<string name="gameid_saved">الإعدادات المحفوظة لـ %1$s</string>
|
||||||
|
<string name="unimplemented_menu">القائمة غير المنفذة</string>
|
||||||
|
<string name="loading">جاري تحميل</string>
|
||||||
|
<string name="shutting_down">إيقاف تشغيل</string>
|
||||||
|
<string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته الافتراضية؟</string>
|
||||||
|
<string name="reset_to_default">إعادة تعيين إلى الافتراضي</string>
|
||||||
|
<string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string>
|
||||||
|
<string name="reset_all_settings_description">سيتم إعادة تعيين كافة الإعدادات المتقدمة إلى تكوينها الافتراضي. هذا لا يمكن التراجع عنها.</string>
|
||||||
|
<string name="settings_reset">إعادة تعيين الأعدادات</string>
|
||||||
|
<string name="close">إغلاق</string>
|
||||||
|
<string name="learn_more">معرفة المزيد</string>
|
||||||
|
<string name="auto">تلقائي</string>
|
||||||
|
<string name="submit">إرسال</string>
|
||||||
|
<string name="string_null">قيمه خاليه</string>
|
||||||
|
<string name="string_import">استيراد</string>
|
||||||
|
<string name="export">تصدير</string>
|
||||||
|
<string name="export_failed">فشل التصدير</string>
|
||||||
|
<string name="import_failed">فشل الاستيراد</string>
|
||||||
|
<string name="cancelling">إلغاء</string>
|
||||||
|
|
||||||
|
<!-- GPU driver installation -->
|
||||||
|
<string name="select_gpu_driver">GPU حدد برنامج تشغيل</string>
|
||||||
|
<string name="select_gpu_driver_title">الحالي الخاص بك؟ GPU هل ترغب في استبدال برنامج تشغيل</string>
|
||||||
|
<string name="select_gpu_driver_install">تثبيت</string>
|
||||||
|
<string name="select_gpu_driver_default">افتراضي</string>
|
||||||
|
<string name="select_gpu_driver_use_default">يستخدم تعريف معالج الرسوميات الافتراضي</string>
|
||||||
|
<string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح ، باستخدام النظام الافتراضي</string>
|
||||||
|
<string name="system_gpu_driver">تعريف معالج الرسوميات الخاص بالنظام</string>
|
||||||
|
<string name="installing_driver">جارٍ تثبيت برنامج التشغيل…</string>
|
||||||
|
|
||||||
|
<!-- Preferences Screen -->
|
||||||
|
<string name="preferences_settings">إعدادات</string>
|
||||||
|
<string name="preferences_general">عام</string>
|
||||||
|
<string name="preferences_system">النظام</string>
|
||||||
|
<string name="preferences_graphics">الرسوميات</string>
|
||||||
|
<string name="preferences_audio">الصوت</string>
|
||||||
|
<string name="preferences_theme">السمة واللون</string>
|
||||||
|
<string name="preferences_debug">تصحيح الأخطاء</string>
|
||||||
|
|
||||||
|
<!-- ROM loading errors -->
|
||||||
|
<string name="loader_error_encrypted">الخاص بك ROM تم تشفير</string>
|
||||||
|
<string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الفيديو</string>
|
||||||
|
<string name="loader_error_invalid_format">ROM غير قادر على تحميل</string>
|
||||||
|
<string name="loader_error_file_not_found">غير موجود ROM ملف</string>
|
||||||
|
|
||||||
|
<!-- Emulation Menu -->
|
||||||
|
<string name="emulation_exit">الخروج من المحاكاة</string>
|
||||||
|
<string name="emulation_done">منجز</string>
|
||||||
|
<string name="emulation_fps_counter">عداد إطار/ثانية</string>
|
||||||
|
<string name="emulation_toggle_controls">تبديل عناصر التحكم</string>
|
||||||
|
<string name="emulation_rel_stick_center">مركز العصا النسبي</string>
|
||||||
|
<string name="emulation_dpad_slide">مزلاق أزرار الاتجاهات</string>
|
||||||
|
<string name="emulation_haptics">الاهتزازات الديناميكية</string>
|
||||||
|
<string name="emulation_show_overlay">عرض التراكب</string>
|
||||||
|
<string name="emulation_toggle_all">تبديل الكل</string>
|
||||||
|
<string name="emulation_control_adjust">ضبط التراكب</string>
|
||||||
|
<string name="emulation_control_scale">حجم</string>
|
||||||
|
<string name="emulation_control_opacity">العتامه</string>
|
||||||
|
<string name="emulation_touch_overlay_reset">إعادة تعيين التراكب</string>
|
||||||
|
<string name="emulation_touch_overlay_edit">تحرير التراكب</string>
|
||||||
|
<string name="emulation_pause">إيقاف المحاكاة مؤقتًا</string>
|
||||||
|
<string name="emulation_unpause">إلغاء الإيقاف المؤقت للمضاهاة</string>
|
||||||
|
<string name="emulation_input_overlay">خيارات التراكب</string>
|
||||||
|
|
||||||
|
<string name="load_settings">جارٍ تحميل الإعدادات</string>
|
||||||
|
|
||||||
|
<!-- Software keyboard -->
|
||||||
|
<string name="software_keyboard">لوحة المفاتيح البرمجية</string>
|
||||||
|
|
||||||
|
<!-- Errors and warnings -->
|
||||||
|
<string name="abort_button">إلغاء</string>
|
||||||
|
<string name="continue_button">استمر</string>
|
||||||
|
<string name="system_archive_not_found">لم يتم العثور على أرشيف النظام</string>
|
||||||
|
<string name="system_archive_general">أرشيف النظام</string>
|
||||||
|
<string name="save_load_error">خطأ في الحفظ/التحميل</string>
|
||||||
|
<string name="fatal_error">خطا فادح</string>
|
||||||
|
<string name="performance_warning">سيؤدي إيقاف تشغيل هذا الإعداد إلى تقليل أداء المحاكاة بشكل ملحوظ! للحصول على أفضل تجربة، يوصى بترك هذا الإعداد ممكنًا.</string>
|
||||||
|
<string name="memory_formatted">%1$s %2$s</string>
|
||||||
|
<string name="no_game_present">لا توجد لعبة قابلة للتمهيد</string>
|
||||||
|
|
||||||
|
<!-- Region Names -->
|
||||||
|
<string name="region_japan">اليابان</string>
|
||||||
|
<string name="region_usa">الولايات المتحدة الأمريكية</string>
|
||||||
|
<string name="region_europe">أوروبا</string>
|
||||||
|
<string name="region_australia">أستراليا</string>
|
||||||
|
<string name="region_china">الصين</string>
|
||||||
|
<string name="region_korea">كوريا</string>
|
||||||
|
<string name="region_taiwan">تايوان</string>
|
||||||
|
|
||||||
|
<!-- Memory Sizes -->
|
||||||
|
<string name="memory_byte">Byte</string>
|
||||||
|
<string name="memory_kilobyte">KB</string>
|
||||||
|
<string name="memory_megabyte">MB</string>
|
||||||
|
<string name="memory_gigabyte">GB</string>
|
||||||
|
<string name="memory_terabyte">TB</string>
|
||||||
|
<string name="memory_petabyte">PB</string>
|
||||||
|
<string name="memory_exabyte">EB</string>
|
||||||
|
|
||||||
|
<!-- Renderer APIs -->
|
||||||
|
<string name="renderer_vulkan">Vulkan</string>
|
||||||
|
<string name="renderer_none">لاشيء</string>
|
||||||
|
|
||||||
|
<!-- Renderer Accuracy -->
|
||||||
|
<string name="renderer_accuracy_normal">عادي</string>
|
||||||
|
<string name="renderer_accuracy_high">عالي</string>
|
||||||
|
<string name="renderer_accuracy_extreme">Extreme (بطيء)</string>
|
||||||
|
|
||||||
|
<!-- Resolutions -->
|
||||||
|
<string name="resolution_half">0.5X (360p/540p)</string>
|
||||||
|
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
|
||||||
|
<string name="resolution_one">1X (720p/1080p)</string>
|
||||||
|
<string name="resolution_two">2X (1440p/2160p) (بطيء)</string>
|
||||||
|
<string name="resolution_three">3X (2160p/3240p) (بطيء)</string>
|
||||||
|
<string name="resolution_four">4X (2880p/4320p) (بطيء)</string>
|
||||||
|
|
||||||
|
<!-- Renderer VSync -->
|
||||||
|
<string name="renderer_vsync_immediate">Immediate (Off)</string>
|
||||||
|
<string name="renderer_vsync_mailbox">Mailbox</string>
|
||||||
|
<string name="renderer_vsync_fifo">FIFO (On)</string>
|
||||||
|
<string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
|
||||||
|
|
||||||
|
<!-- Scaling Filters -->
|
||||||
|
<string name="scaling_filter_nearest_neighbor">Nearest Neighbor</string>
|
||||||
|
<string name="scaling_filter_bilinear">Bilinear</string>
|
||||||
|
<string name="scaling_filter_bicubic">Bicubic</string>
|
||||||
|
<string name="scaling_filter_gaussian">Gaussian</string>
|
||||||
|
<string name="scaling_filter_scale_force">ScaleForce</string>
|
||||||
|
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
|
||||||
|
|
||||||
|
<!-- Anti-Aliasing -->
|
||||||
|
<string name="anti_aliasing_none">لا شيء</string>
|
||||||
|
<string name="anti_aliasing_fxaa">FXAA</string>
|
||||||
|
<string name="anti_aliasing_smaa">SMAA</string>
|
||||||
|
|
||||||
|
<!-- Screen Layouts -->
|
||||||
|
<string name="screen_layout_landscape">افقي</string>
|
||||||
|
<string name="screen_layout_portrait">عمودي</string>
|
||||||
|
<string name="screen_layout_auto">تلقائي</string>
|
||||||
|
|
||||||
|
<!-- Aspect Ratios -->
|
||||||
|
<string name="ratio_default">(16:9) افتراضي</string>
|
||||||
|
<string name="ratio_force_four_three">4:3 فرض</string>
|
||||||
|
<string name="ratio_force_twenty_one_nine">21:9 فرض</string>
|
||||||
|
<string name="ratio_force_sixteen_ten">16:10 فرض</string>
|
||||||
|
<string name="ratio_stretch">تمتد إلى النافذة</string>
|
||||||
|
|
||||||
|
<!-- CPU Accuracy -->
|
||||||
|
<string name="cpu_accuracy_accurate">دقه</string>
|
||||||
|
<string name="cpu_accuracy_unsafe">غير آمن</string>
|
||||||
|
<string name="cpu_accuracy_paranoid">Paranoid (Slow)</string>
|
||||||
|
|
||||||
|
<!-- Gamepad Buttons -->
|
||||||
|
<string name="gamepad_d_pad">أزرار الاتجاهات</string>
|
||||||
|
<string name="gamepad_left_stick">العصا اليسرى</string>
|
||||||
|
<string name="gamepad_right_stick">العصا اليمنى</string>
|
||||||
|
<string name="gamepad_home">شاشة الإستقبال</string>
|
||||||
|
<string name="gamepad_screenshot">لقطة شاشة</string>
|
||||||
|
|
||||||
|
<!-- Disk shader cache -->
|
||||||
|
<string name="preparing_shaders">تحضير التظليل</string>
|
||||||
|
<string name="building_shaders">بناء التظليل</string>
|
||||||
|
|
||||||
|
<!-- Theme options -->
|
||||||
|
<string name="change_app_theme">تغيير سمة التطبيق</string>
|
||||||
|
<string name="theme_default">افتراضي</string>
|
||||||
|
<string name="theme_material_you">Material You</string>
|
||||||
|
|
||||||
|
<!-- Theme Modes -->
|
||||||
|
<string name="change_theme_mode">تغيير وضع السمة</string>
|
||||||
|
<string name="theme_mode_follow_system">اتبع النظام</string>
|
||||||
|
<string name="theme_mode_light">فاتح</string>
|
||||||
|
<string name="theme_mode_dark">غامق</string>
|
||||||
|
|
||||||
|
<!-- Audio output engines -->
|
||||||
|
<string name="cubeb">cubeb</string>
|
||||||
|
|
||||||
|
<!-- Black backgrounds theme -->
|
||||||
|
<string name="use_black_backgrounds">خلفيات سوداء</string>
|
||||||
|
<string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلفيات سوداء.</string>
|
||||||
|
|
||||||
|
<!-- Picture-In-Picture -->
|
||||||
|
<string name="picture_in_picture">صورة داخل صورة</string>
|
||||||
|
<string name="picture_in_picture_description">تصغير النافذة عند وضعها في الخلفية</string>
|
||||||
|
<string name="pause">توقف</string>
|
||||||
|
<string name="play">تشغيل</string>
|
||||||
|
<string name="mute">كتم</string>
|
||||||
|
<string name="unmute">إلغاء الكتم</string>
|
||||||
|
|
||||||
|
<!-- Licenses screen strings -->
|
||||||
|
<string name="licenses">التراخيص</string>
|
||||||
|
<string name="license_fidelityfx_fsr_description">AMD ترقية عالية الجودة من</string>
|
||||||
|
</resources>
|
336
src/android/app/src/main/res/values-ckb/strings.xml
Normal file
336
src/android/app/src/main/res/values-ckb/strings.xml
Normal file
|
@ -0,0 +1,336 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
|
<string name="app_disclaimer">ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی <![CDATA[<b> prod.keys </b>]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br /><![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">زیاتر فێربە</a>]]></string>
|
||||||
|
<string name="emulation_notification_channel_name">ئیمولەیشن کارایە</string>
|
||||||
|
<string name="emulation_notification_channel_description">ئاگادارکردنەوەیەکی بەردەوام نیشان دەدات کاتێک ئیمولەیشن کاردەکات.</string>
|
||||||
|
<string name="emulation_notification_running">یوزو کاردەکات</string>
|
||||||
|
<string name="notice_notification_channel_name">ئاگاداری و هەڵەکان</string>
|
||||||
|
<string name="notice_notification_channel_description">ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت.</string>
|
||||||
|
<string name="notification_permission_not_granted">مۆڵەتی ئاگادارکردنەوە نەدراوە!</string>
|
||||||
|
|
||||||
|
<!-- Setup strings -->
|
||||||
|
<string name="welcome">بەخێربێیت!</string>
|
||||||
|
<string name="welcome_description">فێربە چۆن <b>yuzu</b> ڕێکبخەیت و بچییە ناو ئیمولەیشن.</string>
|
||||||
|
<string name="get_started">دەست پێبکە</string>
|
||||||
|
<string name="keys">کلیلەکان</string>
|
||||||
|
<string name="keys_description">فایلی <b>prod.keys</b> هەڵبژێرە بە دوگمەی خوارەوە.</string>
|
||||||
|
<string name="select_keys">کلیلەکان هەڵبژێرە</string>
|
||||||
|
<string name="games">یاریەکان</string>
|
||||||
|
<string name="games_description">فۆڵدەری <b>Games</b> هەڵبژێرە بە دوگمەی خوارەوە.</string>
|
||||||
|
<string name="done">تەواو</string>
|
||||||
|
<string name="done_description">تۆ تەواو ئامادەیت.\nچێژ لە یارییەکانت وەربگرە!</string>
|
||||||
|
<string name="text_continue">بەردەوام بوون</string>
|
||||||
|
<string name="next">دواتر</string>
|
||||||
|
<string name="back">گەڕانەوە</string>
|
||||||
|
<string name="add_games">زیادکردنی یاری</string>
|
||||||
|
<string name="add_games_description">فۆڵدەری یارییەکانت هەڵبژێرە</string>
|
||||||
|
<!-- Home strings -->
|
||||||
|
<string name="home_games">یاریەکان</string>
|
||||||
|
<string name="home_search">گەڕان</string>
|
||||||
|
<string name="home_settings">ڕێکخستنەکان</string>
|
||||||
|
<string name="empty_gamelist">تا ئێستا هیچ فایلێک نەدۆزراوەتەوە یان هیچ ناونیشانێکی یاری هەڵنەبژێردراوە.</string>
|
||||||
|
<string name="search_and_filter_games">گەڕان و فلتەرکردنی یارییەکان</string>
|
||||||
|
<string name="select_games_folder">فۆڵدەری یارییەکان هەڵبژێرە</string>
|
||||||
|
<string name="select_games_folder_description">ڕێگە بە یوزو دەدات بۆ پڕکردنەوەی لیستی یارییەکان</string>
|
||||||
|
<string name="add_games_warning">هەڵبژاردنی فۆڵدەری یارییەکان تێپەڕدەکەیت؟</string>
|
||||||
|
<string name="add_games_warning_description">یارییەکان لە لیستی یارییەکاندا پیشان نادرێن ئەگەر فۆڵدەرێک هەڵنەبژێردرێت.</string>
|
||||||
|
<string name="add_games_warning_help">https://yuzu-emu.org/help/quickstart/#dumping-games</string>
|
||||||
|
<string name="home_search_games">گەڕان بەدوای یارییەکاندا</string>
|
||||||
|
<string name="games_dir_selected">ناونیشانی یارییەکان هەڵبژێردرا</string>
|
||||||
|
<string name="install_prod_keys">دابمەزرێنە prod.keys</string>
|
||||||
|
<string name="install_prod_keys_description">پێویستە بۆ کۆدکردنەوەى یارییە تاکەکەسییەکان</string>
|
||||||
|
<string name="install_prod_keys_warning">زیادکردنی کلیلەکان تێپەڕدەکەیت؟</string>
|
||||||
|
<string name="install_prod_keys_warning_description">کلیلی دروست پێویستە بۆ وەرگرتنی یارییەکانی تاکەکەسی. تەنها ئەپەکانی homebrew کاردەکەن ئەگەر بەردەوام بیت.</string>
|
||||||
|
<string name="install_prod_keys_warning_help">https://yuzu-emu.org/help/quickstart/#guide-introduction</string>
|
||||||
|
<string name="notifications">ئاگادارکردنەوەکان</string>
|
||||||
|
<string name="notifications_description">بە دوگمەی خوارەوە مۆڵەتی ئاگادارکردنەوەکە بدە.</string>
|
||||||
|
<string name="give_permission">مۆڵەت بدە</string>
|
||||||
|
<string name="notification_warning">پێدانی مۆڵەتی ئاگادارکردنەوە تێپەڕدەکەیت؟</string>
|
||||||
|
<string name="notification_warning_description">یوزو ناتوانێت لە زانیاری گرنگ ئاگادارت بکاتەوە.</string>
|
||||||
|
<string name="permission_denied">مۆڵەت پێدان ڕەتکرایەوە</string>
|
||||||
|
<string name="permission_denied_description">زۆر جار ئەم مۆڵەتەت ڕەتکردۆتەوە و ئێستا دەبێت بە دەستی ڕێگەپێدان بکەیت لە ڕێکخستنەکانی سیستەمدا.</string>
|
||||||
|
<string name="about">دەربارە</string>
|
||||||
|
<string name="about_description">وەشانی دروستکردن، بیتبێن و زۆر شتیتر</string>
|
||||||
|
<string name="warning_help">یارمەتی</string>
|
||||||
|
<string name="warning_skip">پەڕاندن</string>
|
||||||
|
<string name="warning_cancel">ڕەتکردنەوە</string>
|
||||||
|
<string name="install_amiibo_keys">دامەزراندنی کلیلی Amiibo</string>
|
||||||
|
<string name="install_amiibo_keys_description">پێویستە بۆ بەکارهێنانی Amiibo لە یاریدا</string>
|
||||||
|
<string name="invalid_keys_file">فایلی کلیلێکی نادروست هەڵبژێردرا</string>
|
||||||
|
<string name="install_keys_success">کلیلەکان بە سەرکەوتوویی دامەزران</string>
|
||||||
|
<string name="reading_keys_failure">هەڵە لە خوێندنەوەی کۆدکردنی کلیل</string>
|
||||||
|
<string name="install_prod_keys_failure_extension_description">دڵنیابەوە کە فایلی کلیلەکانت درێژکراوەی .keys ی هەیە و دووبارە هەوڵبدەرەوە.</string>
|
||||||
|
<string name="install_amiibo_keys_failure_extension_description">دڵنیابە کە فایلی کلیلەکانت درێژکراوەی .bin ی هەیە و دووبارە هەوڵبدەرەوە.</string>
|
||||||
|
<string name="invalid_keys_error">کلیلی کۆدکردنی نادروستە</string>
|
||||||
|
<string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>
|
||||||
|
<string name="install_keys_failure_description">فایلە هەڵبژێردراوەکە هەڵەیە یان تێکچووە. تکایە دووبارە کلیلەکانت دەربێنەوە.</string>
|
||||||
|
<string name="install_gpu_driver">دامەزراندنی وەگەڕخەری GPU</string>
|
||||||
|
<string name="install_gpu_driver_description">دامەزراندنی وەگەڕخەری بەدیل بۆ ئەوەی بە ئەگەرێکی زۆرەوە کارایی باشتر یان وردبینی هەبێت</string>
|
||||||
|
<string name="advanced_settings">ڕێکخستنە پێشکەوتووەکان</string>
|
||||||
|
<string name="settings_description">سازدانی ڕێکخستنەکانی ئیمولەیتەر</string>
|
||||||
|
<string name="search_recently_played">بەم دواییە یاری کردووە</string>
|
||||||
|
<string name="search_recently_added">بەم دواییە زیادکرا</string>
|
||||||
|
<string name="search_retail">بەتاک</string>
|
||||||
|
<string name="search_homebrew">هۆم بریو</string>
|
||||||
|
<string name="open_user_folder">کردنەوەی فۆڵدەری یوزو</string>
|
||||||
|
<string name="open_user_folder_description">بەڕێوەبردنی فایلە ناوخۆییەکانی یوزو</string>
|
||||||
|
<string name="theme_and_color_description">دەستکاری کردنی شێوازی ئەپەکە</string>
|
||||||
|
<string name="no_file_manager">هیچ فایل بەڕێوەبەرێک نەدۆزرایەوە</string>
|
||||||
|
<string name="notification_no_directory_link">نەتوانرا ناونیشانی یوزو بکرێتەوە</string>
|
||||||
|
<string name="notification_no_directory_link_description">تکایە شوێنی فۆڵدەری بەکارهێنەر لەگەڵ پانێڵی لایەنی فایل بەڕێوەبارەکان بە دەست بدۆزەرەوە.</string>
|
||||||
|
<string name="manage_save_data">بەڕێوەبردنی داتای پاشەکەوتکراو</string>
|
||||||
|
<string name="manage_save_data_description">داتای پاشەکەوتکراو دۆزراوە. تکایە لە خوارەوە بژاردەیەک هەڵبژێرە.</string>
|
||||||
|
<string name="import_export_saves_description">هاوردەکردن یان هەناردەکردنی فایلی پاشەکەوتکراو</string>
|
||||||
|
<string name="save_file_imported_success">بە سەرکەوتوویی هاوردە کرا</string>
|
||||||
|
<string name="save_file_invalid_zip_structure">پێکهاتەی شوێنی پاشەکەوتکراو نادروستە</string>
|
||||||
|
<string name="save_file_invalid_zip_structure_description">ناوی یەکەمی فۆڵدەر دەبێت ناسنامەی ناونیشانی یارییەکە بێت.</string>
|
||||||
|
<string name="import_saves">هاوردەکردن</string>
|
||||||
|
<string name="export_saves">هەناردەکردن</string>
|
||||||
|
<string name="install_firmware">دامەزراندنی پتەوواڵا</string>
|
||||||
|
<string name="install_firmware_description">پتەوواڵا دەبێت لە ئەرشیفی زیپدا بێت و پێویستە بۆ بووتکردنی هەندێک یاری</string>
|
||||||
|
<string name="firmware_installing">دامەزرانی پتەوواڵا</string>
|
||||||
|
<string name="firmware_installed_success">پتەوواڵا بە سەرکەوتوویی دامەزرا</string>
|
||||||
|
<string name="firmware_installed_failure">دامەزراندنی پتەوواڵا شکستی هێنا</string>
|
||||||
|
<string name="share_log">هاوبەشی پێکردنی لۆگەکانی چاککردنەوە</string>
|
||||||
|
<string name="share_log_description">فایلە لۆگەکەی یوزو هاوبەش بکە بۆ چاککردنی کێشەکان</string>
|
||||||
|
<string name="share_log_missing">هیچ فایلێکی لۆگ نەدۆزراوە</string>
|
||||||
|
<string name="install_game_content">دامەزراندنی ناوەڕۆکی یاری</string>
|
||||||
|
<string name="install_game_content_description">دامەزراندنی نوێکاری یارییەکان یان DLC</string>
|
||||||
|
<string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>
|
||||||
|
<!-- About screen strings -->
|
||||||
|
<string name="gaia_is_not_real">گایا ڕاستەقینە نییە</string>
|
||||||
|
<string name="copied_to_clipboard">کۆپی کرا بۆ تەختەی نووسین</string>
|
||||||
|
<string name="about_app_description">ئیمۆلیتەرێکی سەرچاوە-کراوەی سویچ</string>
|
||||||
|
<string name="contributors">بەشداربووان</string>
|
||||||
|
<string name="contributors_description">دروستکراوە لەگەڵ \u2764 لەلایەن تیمەکەی یوزو</string>
|
||||||
|
<string name="contributors_link">https://github.com/yuzu-emu/yuzu/graphs/contributors</string>
|
||||||
|
<string name="licenses_description">ئەو پڕۆژانەی کە یوزوی بۆ ئەندرۆید ڕەخساند</string>
|
||||||
|
<string name="build">بونیات</string>
|
||||||
|
<string name="support_link">https://discord.gg/u77vRWY</string>
|
||||||
|
<string name="website_link">https://yuzu-emu.org/</string>
|
||||||
|
<string name="github_link">https://github.com/yuzu-emu</string>
|
||||||
|
|
||||||
|
<!-- Early access upgrade strings -->
|
||||||
|
<string name="early_access">بەزوویی دەسپێگەشتن</string>
|
||||||
|
<string name="get_early_access">بەدەستهێنانی بەزوویی دەسپێگەشتن</string>
|
||||||
|
<string name="play_store_link">https://play.google.com/store/apps/details?id=org.yuzu.yuzu_emu.ea</string>
|
||||||
|
<string name="get_early_access_description">تایبەتمەندییە پێشکەوتووەکان، بەزوویی دەستگەیشتن بە نوێکارییەکان و زۆر شتی تر</string>
|
||||||
|
<string name="early_access_benefits">سوودەکانی بەزوویی دەسپێگەشتن</string>
|
||||||
|
<string name="cutting_edge_features">تایبەتمەندییە پێشکەوتووەکان</string>
|
||||||
|
<string name="early_access_updates">زوو دەستگەیشتن بە نوێکارییەکان</string>
|
||||||
|
<string name="no_manual_installation">چیتر دامەزراندنی دەستی نییە</string>
|
||||||
|
<string name="prioritized_support">پشتگیری لە پێشینە</string>
|
||||||
|
<string name="helping_game_preservation">یارمەتیدانی پاراستنی یارییەکان</string>
|
||||||
|
<string name="our_eternal_gratitude">سوپاس و پێزانینی هەمیشەییمان</string>
|
||||||
|
<string name="are_you_interested">ئایا تۆ خوازیاریت؟</string>
|
||||||
|
|
||||||
|
<!-- General settings strings -->
|
||||||
|
<string name="frame_limit_enable">سنووردارکردنی خێرایی</string>
|
||||||
|
<string name="frame_limit_enable_description">خێرایی ئیمولەیشن سنووردار دەکات بۆ ڕێژەیەکی دیاریکراو لە خێرایی ئاسایی.</string>
|
||||||
|
<string name="frame_limit_slider">سنووردارکردنی لەسەدای خێرایی</string>
|
||||||
|
<string name="frame_limit_slider_description">ڕێژەی سەدی دیاری دەکات بۆ سنووردارکردنی خێرایی ئیمولەیشن. 100% خێرایی ئاساییە. بەهایی بەرزتر یان نزمتر دەبێتە هۆی زیاد یان کەمکردنەوەی سنووری خێرایی.</string>
|
||||||
|
<string name="cpu_accuracy">وردی CPU</string>
|
||||||
|
<!-- System settings strings -->
|
||||||
|
<string name="use_docked_mode">دۆخی دۆککراو</string>
|
||||||
|
<string name="use_docked_mode_description">ڕوونی زیاد دەکات، کارایی کەم دەکاتەوە. دۆخی دەستی بەکاردێت کاتێک لەکاردەخرێت، ئەمەش ڕوونی دادەبەزێنێت و کارایی زیاد دەکات.</string>
|
||||||
|
<string name="emulated_region">ناوچەی ئیمولەیشن</string>
|
||||||
|
<string name="emulated_language">زمانی ئیمولەیتەر</string>
|
||||||
|
<string name="select_rtc_date">هەڵبژاردنی بەرواری RTC</string>
|
||||||
|
<string name="select_rtc_time">هەڵبژاردنی کاتی RTC</string>
|
||||||
|
<string name="use_custom_rtc">RTCی تایبەتمەند</string>
|
||||||
|
<string name="use_custom_rtc_description">ڕێگەت پێدەدات کاتژمێرێکی کاتی ڕاستەقینەی تایبەتمەند دابنێیت کە جیاوازە لە کاتی ئێستای سیستەمەکەت.</string>
|
||||||
|
<string name="set_custom_rtc">دانانی RTCی تایبەتمەند</string>
|
||||||
|
|
||||||
|
<!-- Graphics settings strings -->
|
||||||
|
<string name="renderer_accuracy">ئاستی وردبینی</string>
|
||||||
|
<string name="renderer_resolution">ڕوونی (دۆخی دەستی/دۆخی دۆک)</string>
|
||||||
|
<string name="renderer_vsync">دۆخی VSync</string>
|
||||||
|
<string name="renderer_aspect_ratio">ڕێژەی ڕووبەری شاشە</string>
|
||||||
|
<string name="renderer_scaling_filter">فلتەری گونجاندنی پەنجەرە</string>
|
||||||
|
<string name="renderer_anti_aliasing">شێوازی دژە-خاوڕۆیی</string>
|
||||||
|
<string name="renderer_force_max_clock">ناچاریکردن بۆ زۆرترین کاتژمێر (تەنها ئەدرینۆ)</string>
|
||||||
|
<string name="renderer_force_max_clock_description">GPU ناچار دەکات بە زۆرترین کاتژمێر کاربکات (هێشتا سنووردارکردنی گەرمی جێبەجێ دەکرێت).</string>
|
||||||
|
<string name="renderer_asynchronous_shaders">بەکارهێنانی سێبەری ناهاوسەنگ</string>
|
||||||
|
<string name="renderer_asynchronous_shaders_description">سێبەرەکان بە شێوەیەکی ناهاوسەنگ کۆدەکاتەوە، پچڕپچڕی کەمدەکاتەوە بەڵام لەوانەیە گلێچ دروستکا.</string>
|
||||||
|
<string name="renderer_reactive_flushing">بەکارهێنانی بەرپێچدەرەوە</string>
|
||||||
|
<string name="renderer_reactive_flushing_description">وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی.</string>
|
||||||
|
<string name="use_disk_shader_cache">بیرگەخێرای سێبەری دیسک</string>
|
||||||
|
<string name="use_disk_shader_cache_description">پچڕپچڕی کەمدەکاتەوە بە هەڵگرتن و بارکردنی سێبەری دروستکراو لە ناوخۆدا.</string>
|
||||||
|
|
||||||
|
<!-- Debug settings strings -->
|
||||||
|
<string name="cpu">CPU</string>
|
||||||
|
<string name="renderer_api">API گرافیک</string>
|
||||||
|
<string name="renderer_debug">چاککردنەوەی گرافیک</string>
|
||||||
|
<string name="renderer_debug_description">API ی گرافیکەکان ڕێکدەخات بۆ دۆخی چاککردنی خاو.</string>
|
||||||
|
<string name="audio_volume">قەبارەی دەنگی</string>
|
||||||
|
<string name="audio_volume_description">دیاریکردنی قەبارەی دەنگی دەرچووی بیستۆک و بزوێنەری دەنگی دەرەکی.</string>
|
||||||
|
|
||||||
|
<!-- Miscellaneous -->
|
||||||
|
<string name="slider_default">بنەڕەت</string>
|
||||||
|
<string name="ini_saved">ڕێکخستنە پاشەکەوتکراوەکان</string>
|
||||||
|
<string name="gameid_saved">ڕێکخستنە پاشەکەوتکراوەکان بۆ %1$s</string>
|
||||||
|
<string name="error_saving">هەڵە لە پاشەکەوتکردن %1$s.ini: %2$s</string>
|
||||||
|
<string name="loading">بارکردن...</string>
|
||||||
|
<string name="reset_setting_confirmation">ئایا دەتەوێت ئەم ڕێکخستنە بگەڕێنیتەوە بۆ بەهای بنەڕەتی خۆی؟</string>
|
||||||
|
<string name="reset_to_default">دوبارە ڕێکخستنەوەی بۆ بنەڕەت</string>
|
||||||
|
<string name="reset_all_settings">هەموو ڕێکخستنەکان دوبارە ڕێک دەخاتەوە؟</string>
|
||||||
|
<string name="reset_all_settings_description">هەموو ڕێکخستنە پێشکەوتووەکان دەگەڕێنەوە بۆ ڕێکخستنی بنەڕەتی خۆیان. پاشگەز بوونەوەی نییه.</string>
|
||||||
|
<string name="settings_reset">دوبارە ڕێککردنەوەی ڕێکخستنەکان</string>
|
||||||
|
<string name="close">داخستن</string>
|
||||||
|
<string name="learn_more">زیاتر فێربە</string>
|
||||||
|
<string name="auto">خودکار</string>
|
||||||
|
<string name="submit">پێشکەشکردن</string>
|
||||||
|
<string name="string_import">هاوردەکردن</string>
|
||||||
|
<string name="export">هەناردەکردن</string>
|
||||||
|
<!-- GPU driver installation -->
|
||||||
|
<string name="select_gpu_driver">هەڵبژاردنی وەگەڕخەری GPU</string>
|
||||||
|
<string name="select_gpu_driver_title">حەز دەکەیت وەگەڕخەری GPU ی ئێستات بگۆڕیت؟</string>
|
||||||
|
<string name="select_gpu_driver_install">دامەزراندن</string>
|
||||||
|
<string name="select_gpu_driver_default">بنەڕەت</string>
|
||||||
|
<string name="select_gpu_driver_use_default">بەکارهێنانی وەگەڕخەری GPU ی بنەڕەت</string>
|
||||||
|
<string name="select_gpu_driver_error">وەگەڕخەری نادروست هەڵبژێردرا، بە بەکارهێنانی بنەڕەتی سیستەم!</string>
|
||||||
|
<string name="system_gpu_driver">وەگەڕخەری GPU ی سیستەم</string>
|
||||||
|
<string name="installing_driver">دامەزراندنی وەگەڕخەر...</string>
|
||||||
|
|
||||||
|
<!-- Preferences Screen -->
|
||||||
|
<string name="preferences_settings">ڕێکخستنەکان</string>
|
||||||
|
<string name="preferences_general">گشتی</string>
|
||||||
|
<string name="preferences_system">سیستەم</string>
|
||||||
|
<string name="preferences_graphics">گرافیک</string>
|
||||||
|
<string name="preferences_audio">دەنگ</string>
|
||||||
|
<string name="preferences_theme">ڕەنگ و ڕووکار</string>
|
||||||
|
<string name="preferences_debug">چاککردنەوە</string>
|
||||||
|
|
||||||
|
<!-- ROM loading errors -->
|
||||||
|
<string name="loader_error_encrypted">ڕۆمەکەت کۆدکراوە</string>
|
||||||
|
<string name="loader_error_encrypted_keys_description"><![CDATA[تکایە دڵنیابەوە لەدامەزراوی <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]></string>
|
||||||
|
<string name="loader_error_video_core">هەڵەیەک لە دەستپێکردنی ناوەکی ڤیدیۆکەدا ڕوویدا</string>
|
||||||
|
<string name="loader_error_video_core_description">ئەمەش بەزۆری بەهۆی وەگەڕخەرێکی ناتەبای GPU ەوەیە. دامەزراندنی وەگەڕخەری GPU ی تایبەتمەندکراو لەوانەیە ئەم کێشەیە چارەسەر بکات.</string>
|
||||||
|
<string name="loader_error_invalid_format">ناتوانرێت ڕۆم باربکرێت</string>
|
||||||
|
<string name="loader_error_file_not_found">فایلی ڕۆم بوونی نییە</string>
|
||||||
|
|
||||||
|
<!-- Emulation Menu -->
|
||||||
|
<string name="emulation_exit">دەرچوون لە ئیمولەیشن</string>
|
||||||
|
<string name="emulation_done">تەواو</string>
|
||||||
|
<string name="emulation_fps_counter">FPS ژمێر</string>
|
||||||
|
<string name="emulation_toggle_controls">گۆڕینی کۆنتڕۆڵ</string>
|
||||||
|
<string name="emulation_rel_stick_center">ناوەندی گێڕ بەنزیکەیی</string>
|
||||||
|
<string name="emulation_dpad_slide">خلیسکانی 4 دوگمەکە</string>
|
||||||
|
<string name="emulation_haptics">لەرینەوەی پەنجەلێدان</string>
|
||||||
|
<string name="emulation_show_overlay">نیشاندانی داپۆشەر</string>
|
||||||
|
<string name="emulation_toggle_all">گۆڕینی سەرجەم</string>
|
||||||
|
<string name="emulation_control_adjust">ڕێکخستنی داپۆشەر</string>
|
||||||
|
<string name="emulation_control_scale">پێوەر</string>
|
||||||
|
<string name="emulation_control_opacity">ڕوونی</string>
|
||||||
|
<string name="emulation_touch_overlay_reset">دووبارە ڕێکخستنەوەی داپۆشەر</string>
|
||||||
|
<string name="emulation_touch_overlay_edit">دەستکاریکردنی داپۆشەر</string>
|
||||||
|
<string name="emulation_pause">وەستاندنی ئیمولەیشن</string>
|
||||||
|
<string name="emulation_unpause">لادانی وەستاندنی ئیمولەیشن</string>
|
||||||
|
<string name="emulation_input_overlay">هەڵبژاردەکانی داپۆشەر</string>
|
||||||
|
|
||||||
|
<string name="load_settings">بارکردنی ڕێکخستنەکان...</string>
|
||||||
|
|
||||||
|
<!-- Software keyboard -->
|
||||||
|
<string name="software_keyboard">کیبۆردی نەرمەکاڵا</string>
|
||||||
|
|
||||||
|
<!-- Errors and warnings -->
|
||||||
|
<string name="abort_button">دەربارە</string>
|
||||||
|
<string name="continue_button">بەردەوام بوون</string>
|
||||||
|
<string name="system_archive_not_found">ئەرشیفی سیستەم نەدۆزراوە</string>
|
||||||
|
<string name="system_archive_not_found_message">%s دیار نییە. تکایە ئەرشیفی سیستەمەکەت فڕێ بدە.\nبەردەوامی ئیمولەیشن لەوانەیە ببێتە هۆی تێکچوون و فڕێدانەدەرەوە.</string>
|
||||||
|
<string name="system_archive_general">ئەرشیفێکی سیستەم</string>
|
||||||
|
<string name="save_load_error">هەڵەی پاشەکەوتکردن/بارکردن</string>
|
||||||
|
<string name="fatal_error">هەڵەی کوشندە</string>
|
||||||
|
<string name="fatal_error_message">هەڵەیەکی کوشندە ڕوویدا. بۆ وردەکارییەکان لۆگەکە بپشکنە.\nبەردەوامی ئیمولەیشن لەوانەیە ببێتە هۆی تێکچوون و فڕێدانەدەرەوە.</string>
|
||||||
|
<string name="performance_warning">کوژاندنەوەی ئەم ڕێکخستنە دەبێتە هۆی کەمکردنەوەی کارایی ئیمولەیشن! بۆ باشترین ئەزموون، باشترە ئەم ڕێکخستنە چالاک بهێڵیتەوە.</string>
|
||||||
|
<!-- Region Names -->
|
||||||
|
<string name="region_japan">ژاپۆن</string>
|
||||||
|
<string name="region_usa">ئەمریکا</string>
|
||||||
|
<string name="region_europe">ئەورووپا</string>
|
||||||
|
<string name="region_australia">ئوسترالیا</string>
|
||||||
|
<string name="region_china">چین</string>
|
||||||
|
<string name="region_korea">کۆریا</string>
|
||||||
|
<string name="region_taiwan">تایوان</string>
|
||||||
|
|
||||||
|
<string name="memory_gigabyte">GB</string>
|
||||||
|
<!-- Renderer APIs -->
|
||||||
|
<string name="renderer_vulkan">ڤوڵکان</string>
|
||||||
|
<string name="renderer_none">هیچ</string>
|
||||||
|
|
||||||
|
<!-- Renderer Accuracy -->
|
||||||
|
<string name="renderer_accuracy_normal">ئاسایی</string>
|
||||||
|
<string name="renderer_accuracy_high">بەرز</string>
|
||||||
|
<string name="renderer_accuracy_extreme">ئەوپەڕ (خاو)</string>
|
||||||
|
|
||||||
|
<!-- Resolutions -->
|
||||||
|
<string name="resolution_half">0.5X (360p/540p)</string>
|
||||||
|
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
|
||||||
|
<string name="resolution_one">1X (720p/1080p)</string>
|
||||||
|
<string name="resolution_two">2X (1440p/2160p) (خاو)</string>
|
||||||
|
<string name="resolution_three">3X (2160p/3240p) (خاو)</string>
|
||||||
|
<string name="resolution_four">4X (2880p/4320p) (خاو)</string>
|
||||||
|
|
||||||
|
<!-- Renderer VSync -->
|
||||||
|
<string name="renderer_vsync_immediate">دەستبەجێ (کوژاوە)</string>
|
||||||
|
<string name="renderer_vsync_mailbox">سندوقی پۆستە</string>
|
||||||
|
<string name="renderer_vsync_fifo">FIFO (پێکراو)</string>
|
||||||
|
<string name="renderer_vsync_fifo_relaxed">FIFO ئارام</string>
|
||||||
|
|
||||||
|
<!-- Scaling Filters -->
|
||||||
|
<string name="scaling_filter_nearest_neighbor">نزیکترین دراوسێ</string>
|
||||||
|
<string name="scaling_filter_bilinear">دوو هێڵی</string>
|
||||||
|
<string name="scaling_filter_bicubic">دووخشتەکی</string>
|
||||||
|
<string name="scaling_filter_gaussian">گاوسی</string>
|
||||||
|
<string name="scaling_filter_scale_force">پێوەرهێز</string>
|
||||||
|
<string name="scaling_filter_fsr">AMD FidelityFX™ سوپەر ووردبینی</string>
|
||||||
|
|
||||||
|
<!-- Anti-Aliasing -->
|
||||||
|
<string name="anti_aliasing_none">هیچ</string>
|
||||||
|
<string name="anti_aliasing_fxaa">FXAA</string>
|
||||||
|
<string name="anti_aliasing_smaa">SMAA</string>
|
||||||
|
|
||||||
|
<string name="screen_layout_auto">خودکار</string>
|
||||||
|
|
||||||
|
<!-- Aspect Ratios -->
|
||||||
|
<string name="ratio_default">بنەڕەت (16:9)</string>
|
||||||
|
<string name="ratio_force_four_three">ڕووبەری 4:3</string>
|
||||||
|
<string name="ratio_force_twenty_one_nine">ڕووبەری 21:9</string>
|
||||||
|
<string name="ratio_force_sixteen_ten">ڕووبەری 16:10</string>
|
||||||
|
<string name="ratio_stretch">کشانی پڕ بەشاشە</string>
|
||||||
|
|
||||||
|
<!-- CPU Accuracy -->
|
||||||
|
<string name="cpu_accuracy_accurate">وورد</string>
|
||||||
|
<string name="cpu_accuracy_unsafe">ناسەقامگیر</string>
|
||||||
|
<string name="cpu_accuracy_paranoid">بەگومان (خاو)</string>
|
||||||
|
|
||||||
|
<!-- Gamepad Buttons -->
|
||||||
|
<string name="gamepad_d_pad">4 دوگمەکە</string>
|
||||||
|
<string name="gamepad_left_stick">گێڕی چەپ</string>
|
||||||
|
<string name="gamepad_right_stick">گێڕی ڕاست</string>
|
||||||
|
<string name="gamepad_home">ماڵەوە</string>
|
||||||
|
<string name="gamepad_screenshot">وێنەگرتنی شاشە</string>
|
||||||
|
|
||||||
|
<!-- Disk shader cache -->
|
||||||
|
<string name="preparing_shaders">ئامادەکردنی سێبەرەکان</string>
|
||||||
|
<string name="building_shaders">دروستکردنی سێبەرەکان</string>
|
||||||
|
|
||||||
|
<!-- Theme options -->
|
||||||
|
<string name="change_app_theme">گۆڕینی ڕووکاری ئەپەکە</string>
|
||||||
|
<string name="theme_default">بنەڕەت</string>
|
||||||
|
<string name="theme_material_you">کەرەستەی تۆ</string>
|
||||||
|
|
||||||
|
<!-- Theme Modes -->
|
||||||
|
<string name="change_theme_mode">گۆڕینی دۆخی ڕووکار</string>
|
||||||
|
<string name="theme_mode_follow_system">پەیڕەوی کردنی سیستەم</string>
|
||||||
|
<string name="theme_mode_light">ڕوناکی</string>
|
||||||
|
<string name="theme_mode_dark">تاریک</string>
|
||||||
|
|
||||||
|
<!-- Black backgrounds theme -->
|
||||||
|
<string name="use_black_backgrounds">پاشبنەمای ڕەش</string>
|
||||||
|
<string name="use_black_backgrounds_description">لە کاتی بەکارهێنانی ڕووکاری تاریکدا، پاشبنەمای ڕەش دادەنێ.</string>
|
||||||
|
|
||||||
|
<!-- Licenses screen strings -->
|
||||||
|
<string name="licenses">مۆڵەتەکان</string>
|
||||||
|
<string name="license_fidelityfx_fsr_description">بەرزکردنەوەی کوالێتی بەرز لە کۆمپانیای AMD</string>
|
||||||
|
</resources>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue