summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/build.gradle.kts36
-rw-r--r--src/android/app/src/main/AndroidManifest.xml6
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt12
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt17
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt18
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt23
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt23
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt6
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt55
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt24
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt14
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt42
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsSearchFragment.kt18
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt15
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt70
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt25
-rw-r--r--src/android/app/src/main/jni/android_settings.h2
-rw-r--r--src/android/app/src/main/res/layout/fragment_emulation.xml15
-rw-r--r--src/android/app/src/main/res/menu/menu_overlay_options.xml5
-rw-r--r--src/android/app/src/main/res/values-ar/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-ckb/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-cs/strings.xml1
-rw-r--r--src/android/app/src/main/res/values-de/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-es/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-fr/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-he/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-hu/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-it/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-ja/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-ko/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-nb/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-pl/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-pt-rBR/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-pt-rPT/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-ru/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-uk/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-vi/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-zh-rCN/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-zh-rTW/strings.xml3
-rw-r--r--src/android/app/src/main/res/values/strings.xml5
47 files changed, 202 insertions, 358 deletions
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts
index 188ef9469..cb026211c 100644
--- a/src/android/app/build.gradle.kts
+++ b/src/android/app/build.gradle.kts
@@ -3,8 +3,8 @@
3 3
4import android.annotation.SuppressLint 4import android.annotation.SuppressLint
5import kotlin.collections.setOf 5import kotlin.collections.setOf
6import org.jetbrains.kotlin.konan.properties.Properties
7import org.jlleitschuh.gradle.ktlint.reporter.ReporterType 6import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
7import com.github.triplet.gradle.androidpublisher.ReleaseStatus
8 8
9plugins { 9plugins {
10 id("com.android.application") 10 id("com.android.application")
@@ -13,6 +13,7 @@ plugins {
13 kotlin("plugin.serialization") version "1.9.20" 13 kotlin("plugin.serialization") version "1.9.20"
14 id("androidx.navigation.safeargs.kotlin") 14 id("androidx.navigation.safeargs.kotlin")
15 id("org.jlleitschuh.gradle.ktlint") version "11.4.0" 15 id("org.jlleitschuh.gradle.ktlint") version "11.4.0"
16 id("com.github.triplet.play") version "3.8.6"
16} 17}
17 18
18/** 19/**
@@ -58,15 +59,7 @@ android {
58 targetSdk = 34 59 targetSdk = 34
59 versionName = getGitVersion() 60 versionName = getGitVersion()
60 61
61 // If you want to use autoVersion for the versionCode, create a property in local.properties 62 versionCode = if (System.getenv("AUTO_VERSIONED") == "true") {
62 // named "autoVersioned" and set it to "true"
63 val properties = Properties()
64 val versionProperty = try {
65 properties.load(project.rootProject.file("local.properties").inputStream())
66 properties.getProperty("autoVersioned") ?: ""
67 } catch (e: Exception) { "" }
68
69 versionCode = if (versionProperty == "true") {
70 autoVersion 63 autoVersion
71 } else { 64 } else {
72 1 65 1
@@ -221,6 +214,15 @@ ktlint {
221 } 214 }
222} 215}
223 216
217play {
218 val keyPath = System.getenv("SERVICE_ACCOUNT_KEY_PATH")
219 if (keyPath != null) {
220 serviceAccountCredentials.set(File(keyPath))
221 }
222 track.set(System.getenv("STORE_TRACK") ?: "internal")
223 releaseStatus.set(ReleaseStatus.COMPLETED)
224}
225
224dependencies { 226dependencies {
225 implementation("androidx.core:core-ktx:1.12.0") 227 implementation("androidx.core:core-ktx:1.12.0")
226 implementation("androidx.appcompat:appcompat:1.6.1") 228 implementation("androidx.appcompat:appcompat:1.6.1")
@@ -257,12 +259,18 @@ fun runGitCommand(command: List<String>): String {
257} 259}
258 260
259fun getGitVersion(): String { 261fun getGitVersion(): String {
262 val gitVersion = runGitCommand(
263 listOf(
264 "git",
265 "describe",
266 "--always",
267 "--long"
268 )
269 ).replace(Regex("(-0)?-[^-]+$"), "")
260 val versionName = if (System.getenv("GITHUB_ACTIONS") != null) { 270 val versionName = if (System.getenv("GITHUB_ACTIONS") != null) {
261 val gitTag = System.getenv("GIT_TAG_NAME") ?: "" 271 System.getenv("GIT_TAG_NAME") ?: gitVersion
262 gitTag
263 } else { 272 } else {
264 runGitCommand(listOf("git", "describe", "--always", "--long")) 273 gitVersion
265 .replace(Regex("(-0)?-[^-]+$"), "")
266 } 274 }
267 return versionName.ifEmpty { "0.0" } 275 return versionName.ifEmpty { "0.0" }
268} 276}
diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml
index f011bd696..7890b30ca 100644
--- a/src/android/app/src/main/AndroidManifest.xml
+++ b/src/android/app/src/main/AndroidManifest.xml
@@ -12,8 +12,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
12 <uses-feature android:name="android.hardware.vulkan.version" android:version="0x401000" android:required="true" /> 12 <uses-feature android:name="android.hardware.vulkan.version" android:version="0x401000" android:required="true" />
13 13
14 <uses-permission android:name="android.permission.INTERNET" /> 14 <uses-permission android:name="android.permission.INTERNET" />
15 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
16 <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
17 <uses-permission android:name="android.permission.NFC" /> 15 <uses-permission android:name="android.permission.NFC" />
18 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> 16 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
19 17
@@ -80,10 +78,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
80 android:resource="@xml/nfc_tech_filter" /> 78 android:resource="@xml/nfc_tech_filter" />
81 </activity> 79 </activity>
82 80
83 <service android:name="org.yuzu.yuzu_emu.utils.ForegroundService" android:foregroundServiceType="specialUse">
84 <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="Keep emulation running in background"/>
85 </service>
86
87 <provider 81 <provider
88 android:name=".features.DocumentProvider" 82 android:name=".features.DocumentProvider"
89 android:authorities="${applicationId}.user" 83 android:authorities="${applicationId}.user"
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt
index d114bd53d..76778c10a 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt
@@ -17,17 +17,6 @@ fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
17 17
18class YuzuApplication : Application() { 18class YuzuApplication : Application() {
19 private fun createNotificationChannels() { 19 private fun createNotificationChannels() {
20 val emulationChannel = NotificationChannel(
21 getString(R.string.emulation_notification_channel_id),
22 getString(R.string.emulation_notification_channel_name),
23 NotificationManager.IMPORTANCE_LOW
24 )
25 emulationChannel.description = getString(
26 R.string.emulation_notification_channel_description
27 )
28 emulationChannel.setSound(null, null)
29 emulationChannel.vibrationPattern = null
30
31 val noticeChannel = NotificationChannel( 20 val noticeChannel = NotificationChannel(
32 getString(R.string.notice_notification_channel_id), 21 getString(R.string.notice_notification_channel_id),
33 getString(R.string.notice_notification_channel_name), 22 getString(R.string.notice_notification_channel_name),
@@ -39,7 +28,6 @@ class YuzuApplication : Application() {
39 // Register the channel with the system; you can't change the importance 28 // Register the channel with the system; you can't change the importance
40 // or other notification behaviors after this 29 // or other notification behaviors after this
41 val notificationManager = getSystemService(NotificationManager::class.java) 30 val notificationManager = getSystemService(NotificationManager::class.java)
42 notificationManager.createNotificationChannel(emulationChannel)
43 notificationManager.createNotificationChannel(noticeChannel) 31 notificationManager.createNotificationChannel(noticeChannel)
44 } 32 }
45 33
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
index 564aaf305..7a8d03610 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
@@ -4,7 +4,6 @@
4package org.yuzu.yuzu_emu.activities 4package org.yuzu.yuzu_emu.activities
5 5
6import android.annotation.SuppressLint 6import android.annotation.SuppressLint
7import android.app.Activity
8import android.app.PendingIntent 7import android.app.PendingIntent
9import android.app.PictureInPictureParams 8import android.app.PictureInPictureParams
10import android.app.RemoteAction 9import android.app.RemoteAction
@@ -45,7 +44,6 @@ import org.yuzu.yuzu_emu.features.settings.model.IntSetting
45import org.yuzu.yuzu_emu.features.settings.model.Settings 44import org.yuzu.yuzu_emu.features.settings.model.Settings
46import org.yuzu.yuzu_emu.model.EmulationViewModel 45import org.yuzu.yuzu_emu.model.EmulationViewModel
47import org.yuzu.yuzu_emu.model.Game 46import org.yuzu.yuzu_emu.model.Game
48import org.yuzu.yuzu_emu.utils.ForegroundService
49import org.yuzu.yuzu_emu.utils.InputHandler 47import org.yuzu.yuzu_emu.utils.InputHandler
50import org.yuzu.yuzu_emu.utils.Log 48import org.yuzu.yuzu_emu.utils.Log
51import org.yuzu.yuzu_emu.utils.MemoryUtil 49import org.yuzu.yuzu_emu.utils.MemoryUtil
@@ -74,11 +72,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
74 72
75 private val emulationViewModel: EmulationViewModel by viewModels() 73 private val emulationViewModel: EmulationViewModel by viewModels()
76 74
77 override fun onDestroy() {
78 stopForegroundService(this)
79 super.onDestroy()
80 }
81
82 override fun onCreate(savedInstanceState: Bundle?) { 75 override fun onCreate(savedInstanceState: Bundle?) {
83 Log.gameLaunched = true 76 Log.gameLaunched = true
84 ThemeHelper.setTheme(this) 77 ThemeHelper.setTheme(this)
@@ -125,10 +118,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
125 .apply() 118 .apply()
126 } 119 }
127 } 120 }
128
129 // Start a foreground service to prevent the app from getting killed in the background
130 val startIntent = Intent(this, ForegroundService::class.java)
131 startForegroundService(startIntent)
132 } 121 }
133 122
134 override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { 123 override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
@@ -481,12 +470,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
481 activity.startActivity(launcher) 470 activity.startActivity(launcher)
482 } 471 }
483 472
484 fun stopForegroundService(activity: Activity) {
485 val startIntent = Intent(activity, ForegroundService::class.java)
486 startIntent.action = ForegroundService.ACTION_STOP
487 activity.startForegroundService(startIntent)
488 }
489
490 private fun areCoordinatesOutside(view: View?, x: Float, y: Float): Boolean { 473 private fun areCoordinatesOutside(view: View?, x: Float, y: Float): Boolean {
491 if (view == null) { 474 if (view == null) {
492 return true 475 return true
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
index 86bd33672..664478472 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
@@ -25,7 +25,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
25 HAPTIC_FEEDBACK("haptic_feedback"), 25 HAPTIC_FEEDBACK("haptic_feedback"),
26 SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"), 26 SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
27 SHOW_INPUT_OVERLAY("show_input_overlay"), 27 SHOW_INPUT_OVERLAY("show_input_overlay"),
28 TOUCHSCREEN("touchscreen"); 28 TOUCHSCREEN("touchscreen"),
29 SHOW_THERMAL_OVERLAY("show_thermal_overlay");
29 30
30 override fun getBoolean(needsGlobal: Boolean): Boolean = 31 override fun getBoolean(needsGlobal: Boolean): Boolean =
31 NativeConfig.getBoolean(key, needsGlobal) 32 NativeConfig.getBoolean(key, needsGlobal)
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
index d7ab0b5d9..6f6e7be10 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt
@@ -8,7 +8,6 @@ import android.os.Bundle
8import android.view.LayoutInflater 8import android.view.LayoutInflater
9import android.view.View 9import android.view.View
10import android.view.ViewGroup 10import android.view.ViewGroup
11import android.view.ViewGroup.MarginLayoutParams
12import androidx.core.view.ViewCompat 11import androidx.core.view.ViewCompat
13import androidx.core.view.WindowInsetsCompat 12import androidx.core.view.WindowInsetsCompat
14import androidx.core.view.updatePadding 13import androidx.core.view.updatePadding
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.R
27import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding 26import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding
28import org.yuzu.yuzu_emu.features.settings.model.Settings 27import org.yuzu.yuzu_emu.features.settings.model.Settings
29import org.yuzu.yuzu_emu.model.SettingsViewModel 28import org.yuzu.yuzu_emu.model.SettingsViewModel
29import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
30 30
31class SettingsFragment : Fragment() { 31class SettingsFragment : Fragment() {
32 private lateinit var presenter: SettingsFragmentPresenter 32 private lateinit var presenter: SettingsFragmentPresenter
@@ -125,18 +125,10 @@ class SettingsFragment : Fragment() {
125 val leftInsets = barInsets.left + cutoutInsets.left 125 val leftInsets = barInsets.left + cutoutInsets.left
126 val rightInsets = barInsets.right + cutoutInsets.right 126 val rightInsets = barInsets.right + cutoutInsets.right
127 127
128 val mlpSettingsList = binding.listSettings.layoutParams as MarginLayoutParams 128 binding.listSettings.updateMargins(left = leftInsets, right = rightInsets)
129 mlpSettingsList.leftMargin = leftInsets 129 binding.listSettings.updatePadding(bottom = barInsets.bottom)
130 mlpSettingsList.rightMargin = rightInsets 130
131 binding.listSettings.layoutParams = mlpSettingsList 131 binding.appbarSettings.updateMargins(left = leftInsets, right = rightInsets)
132 binding.listSettings.updatePadding(
133 bottom = barInsets.bottom
134 )
135
136 val mlpAppBar = binding.appbarSettings.layoutParams as MarginLayoutParams
137 mlpAppBar.leftMargin = leftInsets
138 mlpAppBar.rightMargin = rightInsets
139 binding.appbarSettings.layoutParams = mlpAppBar
140 windowInsets 132 windowInsets
141 } 133 }
142 } 134 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
index 5ab38ffda..ff4f0e5df 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt
@@ -13,7 +13,6 @@ import android.os.Bundle
13import android.view.LayoutInflater 13import android.view.LayoutInflater
14import android.view.View 14import android.view.View
15import android.view.ViewGroup 15import android.view.ViewGroup
16import android.view.ViewGroup.MarginLayoutParams
17import android.widget.Toast 16import android.widget.Toast
18import androidx.core.view.ViewCompat 17import androidx.core.view.ViewCompat
19import androidx.core.view.WindowInsetsCompat 18import androidx.core.view.WindowInsetsCompat
@@ -26,6 +25,7 @@ import org.yuzu.yuzu_emu.BuildConfig
26import org.yuzu.yuzu_emu.R 25import org.yuzu.yuzu_emu.R
27import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding 26import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding
28import org.yuzu.yuzu_emu.model.HomeViewModel 27import org.yuzu.yuzu_emu.model.HomeViewModel
28import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
29 29
30class AboutFragment : Fragment() { 30class AboutFragment : Fragment() {
31 private var _binding: FragmentAboutBinding? = null 31 private var _binding: FragmentAboutBinding? = null
@@ -114,15 +114,8 @@ class AboutFragment : Fragment() {
114 val leftInsets = barInsets.left + cutoutInsets.left 114 val leftInsets = barInsets.left + cutoutInsets.left
115 val rightInsets = barInsets.right + cutoutInsets.right 115 val rightInsets = barInsets.right + cutoutInsets.right
116 116
117 val mlpToolbar = binding.toolbarAbout.layoutParams as MarginLayoutParams 117 binding.toolbarAbout.updateMargins(left = leftInsets, right = rightInsets)
118 mlpToolbar.leftMargin = leftInsets 118 binding.scrollAbout.updateMargins(left = leftInsets, right = rightInsets)
119 mlpToolbar.rightMargin = rightInsets
120 binding.toolbarAbout.layoutParams = mlpToolbar
121
122 val mlpScrollAbout = binding.scrollAbout.layoutParams as MarginLayoutParams
123 mlpScrollAbout.leftMargin = leftInsets
124 mlpScrollAbout.rightMargin = rightInsets
125 binding.scrollAbout.layoutParams = mlpScrollAbout
126 119
127 binding.contentAbout.updatePadding(bottom = barInsets.bottom) 120 binding.contentAbout.updatePadding(bottom = barInsets.bottom)
128 121
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
index adb65812c..f5647fa95 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt
@@ -31,6 +31,7 @@ import org.yuzu.yuzu_emu.model.AddonViewModel
31import org.yuzu.yuzu_emu.model.HomeViewModel 31import org.yuzu.yuzu_emu.model.HomeViewModel
32import org.yuzu.yuzu_emu.utils.AddonUtil 32import org.yuzu.yuzu_emu.utils.AddonUtil
33import org.yuzu.yuzu_emu.utils.FileUtil.copyFilesTo 33import org.yuzu.yuzu_emu.utils.FileUtil.copyFilesTo
34import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
34import java.io.File 35import java.io.File
35 36
36class AddonsFragment : Fragment() { 37class AddonsFragment : Fragment() {
@@ -202,27 +203,19 @@ class AddonsFragment : Fragment() {
202 val leftInsets = barInsets.left + cutoutInsets.left 203 val leftInsets = barInsets.left + cutoutInsets.left
203 val rightInsets = barInsets.right + cutoutInsets.right 204 val rightInsets = barInsets.right + cutoutInsets.right
204 205
205 val mlpToolbar = binding.toolbarAddons.layoutParams as ViewGroup.MarginLayoutParams 206 binding.toolbarAddons.updateMargins(left = leftInsets, right = rightInsets)
206 mlpToolbar.leftMargin = leftInsets 207 binding.listAddons.updateMargins(left = leftInsets, right = rightInsets)
207 mlpToolbar.rightMargin = rightInsets
208 binding.toolbarAddons.layoutParams = mlpToolbar
209
210 val mlpAddonsList = binding.listAddons.layoutParams as ViewGroup.MarginLayoutParams
211 mlpAddonsList.leftMargin = leftInsets
212 mlpAddonsList.rightMargin = rightInsets
213 binding.listAddons.layoutParams = mlpAddonsList
214 binding.listAddons.updatePadding( 208 binding.listAddons.updatePadding(
215 bottom = barInsets.bottom + 209 bottom = barInsets.bottom +
216 resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab) 210 resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab)
217 ) 211 )
218 212
219 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab) 213 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
220 val mlpFab = 214 binding.buttonInstall.updateMargins(
221 binding.buttonInstall.layoutParams as ViewGroup.MarginLayoutParams 215 left = leftInsets + fabSpacing,
222 mlpFab.leftMargin = leftInsets + fabSpacing 216 right = rightInsets + fabSpacing,
223 mlpFab.rightMargin = rightInsets + fabSpacing 217 bottom = barInsets.bottom + fabSpacing
224 mlpFab.bottomMargin = barInsets.bottom + fabSpacing 218 )
225 binding.buttonInstall.layoutParams = mlpFab
226 219
227 windowInsets 220 windowInsets
228 } 221 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt
index 1f66b440d..73ca40484 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt
@@ -21,6 +21,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentAppletLauncherBinding
21import org.yuzu.yuzu_emu.model.Applet 21import org.yuzu.yuzu_emu.model.Applet
22import org.yuzu.yuzu_emu.model.AppletInfo 22import org.yuzu.yuzu_emu.model.AppletInfo
23import org.yuzu.yuzu_emu.model.HomeViewModel 23import org.yuzu.yuzu_emu.model.HomeViewModel
24import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
24 25
25class AppletLauncherFragment : Fragment() { 26class AppletLauncherFragment : Fragment() {
26 private var _binding: FragmentAppletLauncherBinding? = null 27 private var _binding: FragmentAppletLauncherBinding? = null
@@ -95,16 +96,8 @@ class AppletLauncherFragment : Fragment() {
95 val leftInsets = barInsets.left + cutoutInsets.left 96 val leftInsets = barInsets.left + cutoutInsets.left
96 val rightInsets = barInsets.right + cutoutInsets.right 97 val rightInsets = barInsets.right + cutoutInsets.right
97 98
98 val mlpAppBar = binding.toolbarApplets.layoutParams as ViewGroup.MarginLayoutParams 99 binding.toolbarApplets.updateMargins(left = leftInsets, right = rightInsets)
99 mlpAppBar.leftMargin = leftInsets 100 binding.listApplets.updateMargins(left = leftInsets, right = rightInsets)
100 mlpAppBar.rightMargin = rightInsets
101 binding.toolbarApplets.layoutParams = mlpAppBar
102
103 val mlpListApplets =
104 binding.listApplets.layoutParams as ViewGroup.MarginLayoutParams
105 mlpListApplets.leftMargin = leftInsets
106 mlpListApplets.rightMargin = rightInsets
107 binding.listApplets.layoutParams = mlpListApplets
108 101
109 binding.listApplets.updatePadding(bottom = barInsets.bottom) 102 binding.listApplets.updatePadding(bottom = barInsets.bottom)
110 103
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
index bf017cd7c..41cff46c1 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt
@@ -34,6 +34,7 @@ import org.yuzu.yuzu_emu.model.HomeViewModel
34import org.yuzu.yuzu_emu.utils.FileUtil 34import org.yuzu.yuzu_emu.utils.FileUtil
35import org.yuzu.yuzu_emu.utils.GpuDriverHelper 35import org.yuzu.yuzu_emu.utils.GpuDriverHelper
36import org.yuzu.yuzu_emu.utils.NativeConfig 36import org.yuzu.yuzu_emu.utils.NativeConfig
37import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
37import java.io.File 38import java.io.File
38import java.io.IOException 39import java.io.IOException
39 40
@@ -141,23 +142,15 @@ class DriverManagerFragment : Fragment() {
141 val leftInsets = barInsets.left + cutoutInsets.left 142 val leftInsets = barInsets.left + cutoutInsets.left
142 val rightInsets = barInsets.right + cutoutInsets.right 143 val rightInsets = barInsets.right + cutoutInsets.right
143 144
144 val mlpAppBar = binding.toolbarDrivers.layoutParams as ViewGroup.MarginLayoutParams 145 binding.toolbarDrivers.updateMargins(left = leftInsets, right = rightInsets)
145 mlpAppBar.leftMargin = leftInsets 146 binding.listDrivers.updateMargins(left = leftInsets, right = rightInsets)
146 mlpAppBar.rightMargin = rightInsets
147 binding.toolbarDrivers.layoutParams = mlpAppBar
148
149 val mlplistDrivers = binding.listDrivers.layoutParams as ViewGroup.MarginLayoutParams
150 mlplistDrivers.leftMargin = leftInsets
151 mlplistDrivers.rightMargin = rightInsets
152 binding.listDrivers.layoutParams = mlplistDrivers
153 147
154 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab) 148 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
155 val mlpFab = 149 binding.buttonInstall.updateMargins(
156 binding.buttonInstall.layoutParams as ViewGroup.MarginLayoutParams 150 left = leftInsets + fabSpacing,
157 mlpFab.leftMargin = leftInsets + fabSpacing 151 right = rightInsets + fabSpacing,
158 mlpFab.rightMargin = rightInsets + fabSpacing 152 bottom = barInsets.bottom + fabSpacing
159 mlpFab.bottomMargin = barInsets.bottom + fabSpacing 153 )
160 binding.buttonInstall.layoutParams = mlpFab
161 154
162 binding.listDrivers.updatePadding( 155 binding.listDrivers.updatePadding(
163 bottom = barInsets.bottom + 156 bottom = barInsets.bottom +
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt
index dbc16da4a..0534b68ce 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt
@@ -19,6 +19,7 @@ import com.google.android.material.transition.MaterialSharedAxis
19import org.yuzu.yuzu_emu.R 19import org.yuzu.yuzu_emu.R
20import org.yuzu.yuzu_emu.databinding.FragmentEarlyAccessBinding 20import org.yuzu.yuzu_emu.databinding.FragmentEarlyAccessBinding
21import org.yuzu.yuzu_emu.model.HomeViewModel 21import org.yuzu.yuzu_emu.model.HomeViewModel
22import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
22 23
23class EarlyAccessFragment : Fragment() { 24class EarlyAccessFragment : Fragment() {
24 private var _binding: FragmentEarlyAccessBinding? = null 25 private var _binding: FragmentEarlyAccessBinding? = null
@@ -73,10 +74,7 @@ class EarlyAccessFragment : Fragment() {
73 val leftInsets = barInsets.left + cutoutInsets.left 74 val leftInsets = barInsets.left + cutoutInsets.left
74 val rightInsets = barInsets.right + cutoutInsets.right 75 val rightInsets = barInsets.right + cutoutInsets.right
75 76
76 val mlpAppBar = binding.appbarEa.layoutParams as ViewGroup.MarginLayoutParams 77 binding.appbarEa.updateMargins(left = leftInsets, right = rightInsets)
77 mlpAppBar.leftMargin = leftInsets
78 mlpAppBar.rightMargin = rightInsets
79 binding.appbarEa.layoutParams = mlpAppBar
80 78
81 binding.scrollEa.updatePadding( 79 binding.scrollEa.updatePadding(
82 left = leftInsets, 80 left = leftInsets,
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
index 937b8faf1..44af896da 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
@@ -13,6 +13,7 @@ import android.net.Uri
13import android.os.Bundle 13import android.os.Bundle
14import android.os.Handler 14import android.os.Handler
15import android.os.Looper 15import android.os.Looper
16import android.os.PowerManager
16import android.os.SystemClock 17import android.os.SystemClock
17import android.view.* 18import android.view.*
18import android.widget.TextView 19import android.widget.TextView
@@ -23,6 +24,7 @@ import androidx.core.content.res.ResourcesCompat
23import androidx.core.graphics.Insets 24import androidx.core.graphics.Insets
24import androidx.core.view.ViewCompat 25import androidx.core.view.ViewCompat
25import androidx.core.view.WindowInsetsCompat 26import androidx.core.view.WindowInsetsCompat
27import androidx.core.view.updatePadding
26import androidx.drawerlayout.widget.DrawerLayout 28import androidx.drawerlayout.widget.DrawerLayout
27import androidx.drawerlayout.widget.DrawerLayout.DrawerListener 29import androidx.drawerlayout.widget.DrawerLayout.DrawerListener
28import androidx.fragment.app.Fragment 30import androidx.fragment.app.Fragment
@@ -38,7 +40,6 @@ import androidx.window.layout.WindowLayoutInfo
38import com.google.android.material.dialog.MaterialAlertDialogBuilder 40import com.google.android.material.dialog.MaterialAlertDialogBuilder
39import com.google.android.material.slider.Slider 41import com.google.android.material.slider.Slider
40import kotlinx.coroutines.Dispatchers 42import kotlinx.coroutines.Dispatchers
41import kotlinx.coroutines.flow.collect
42import kotlinx.coroutines.flow.collectLatest 43import kotlinx.coroutines.flow.collectLatest
43import kotlinx.coroutines.launch 44import kotlinx.coroutines.launch
44import org.yuzu.yuzu_emu.HomeNavigationDirections 45import org.yuzu.yuzu_emu.HomeNavigationDirections
@@ -64,6 +65,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
64 private lateinit var emulationState: EmulationState 65 private lateinit var emulationState: EmulationState
65 private var emulationActivity: EmulationActivity? = null 66 private var emulationActivity: EmulationActivity? = null
66 private var perfStatsUpdater: (() -> Unit)? = null 67 private var perfStatsUpdater: (() -> Unit)? = null
68 private var thermalStatsUpdater: (() -> Unit)? = null
67 69
68 private var _binding: FragmentEmulationBinding? = null 70 private var _binding: FragmentEmulationBinding? = null
69 private val binding get() = _binding!! 71 private val binding get() = _binding!!
@@ -77,6 +79,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
77 79
78 private var isInFoldableLayout = false 80 private var isInFoldableLayout = false
79 81
82 private lateinit var powerManager: PowerManager
83
80 override fun onAttach(context: Context) { 84 override fun onAttach(context: Context) {
81 super.onAttach(context) 85 super.onAttach(context)
82 if (context is EmulationActivity) { 86 if (context is EmulationActivity) {
@@ -102,6 +106,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
102 super.onCreate(savedInstanceState) 106 super.onCreate(savedInstanceState)
103 updateOrientation() 107 updateOrientation()
104 108
109 powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager
110
105 val intentUri: Uri? = requireActivity().intent.data 111 val intentUri: Uri? = requireActivity().intent.data
106 var intentGame: Game? = null 112 var intentGame: Game? = null
107 if (intentUri != null) { 113 if (intentUri != null) {
@@ -394,8 +400,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
394 400
395 emulationState.updateSurface() 401 emulationState.updateSurface()
396 402
397 // Setup overlay 403 // Setup overlays
398 updateShowFpsOverlay() 404 updateShowFpsOverlay()
405 updateThermalOverlay()
399 } 406 }
400 } 407 }
401 } 408 }
@@ -553,6 +560,38 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
553 } 560 }
554 } 561 }
555 562
563 private fun updateThermalOverlay() {
564 if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()) {
565 thermalStatsUpdater = {
566 if (emulationViewModel.emulationStarted.value &&
567 !emulationViewModel.isEmulationStopping.value
568 ) {
569 val thermalStatus = when (powerManager.currentThermalStatus) {
570 PowerManager.THERMAL_STATUS_LIGHT -> "😥"
571 PowerManager.THERMAL_STATUS_MODERATE -> "🥵"
572 PowerManager.THERMAL_STATUS_SEVERE -> "🔥"
573 PowerManager.THERMAL_STATUS_CRITICAL,
574 PowerManager.THERMAL_STATUS_EMERGENCY,
575 PowerManager.THERMAL_STATUS_SHUTDOWN -> "☢️"
576
577 else -> "🙂"
578 }
579 if (_binding != null) {
580 binding.showThermalsText.text = thermalStatus
581 }
582 thermalStatsUpdateHandler.postDelayed(thermalStatsUpdater!!, 1000)
583 }
584 }
585 thermalStatsUpdateHandler.post(thermalStatsUpdater!!)
586 binding.showThermalsText.visibility = View.VISIBLE
587 } else {
588 if (thermalStatsUpdater != null) {
589 thermalStatsUpdateHandler.removeCallbacks(thermalStatsUpdater!!)
590 }
591 binding.showThermalsText.visibility = View.GONE
592 }
593 }
594
556 @SuppressLint("SourceLockedOrientationActivity") 595 @SuppressLint("SourceLockedOrientationActivity")
557 private fun updateOrientation() { 596 private fun updateOrientation() {
558 emulationActivity?.let { 597 emulationActivity?.let {
@@ -641,6 +680,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
641 popup.menu.apply { 680 popup.menu.apply {
642 findItem(R.id.menu_toggle_fps).isChecked = 681 findItem(R.id.menu_toggle_fps).isChecked =
643 BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean() 682 BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
683 findItem(R.id.thermal_indicator).isChecked =
684 BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()
644 findItem(R.id.menu_rel_stick_center).isChecked = 685 findItem(R.id.menu_rel_stick_center).isChecked =
645 BooleanSetting.JOYSTICK_REL_CENTER.getBoolean() 686 BooleanSetting.JOYSTICK_REL_CENTER.getBoolean()
646 findItem(R.id.menu_dpad_slide).isChecked = BooleanSetting.DPAD_SLIDE.getBoolean() 687 findItem(R.id.menu_dpad_slide).isChecked = BooleanSetting.DPAD_SLIDE.getBoolean()
@@ -660,6 +701,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
660 true 701 true
661 } 702 }
662 703
704 R.id.thermal_indicator -> {
705 it.isChecked = !it.isChecked
706 BooleanSetting.SHOW_THERMAL_OVERLAY.setBoolean(it.isChecked)
707 updateThermalOverlay()
708 true
709 }
710
663 R.id.menu_edit_overlay -> { 711 R.id.menu_edit_overlay -> {
664 binding.drawerLayout.close() 712 binding.drawerLayout.close()
665 binding.surfaceInputOverlay.requestFocus() 713 binding.surfaceInputOverlay.requestFocus()
@@ -850,7 +898,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
850 right = cutInsets.right 898 right = cutInsets.right
851 } 899 }
852 900
853 v.setPadding(left, cutInsets.top, right, 0) 901 v.updatePadding(left = left, top = cutInsets.top, right = right)
854 windowInsets 902 windowInsets
855 } 903 }
856 } 904 }
@@ -1003,5 +1051,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
1003 1051
1004 companion object { 1052 companion object {
1005 private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) 1053 private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!)
1054 private val thermalStatsUpdateHandler = Handler(Looper.myLooper()!!)
1006 } 1055 }
1007} 1056}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt
index 341a37fdb..5c558b1a5 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt
@@ -26,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentFoldersBinding
26import org.yuzu.yuzu_emu.model.GamesViewModel 26import org.yuzu.yuzu_emu.model.GamesViewModel
27import org.yuzu.yuzu_emu.model.HomeViewModel 27import org.yuzu.yuzu_emu.model.HomeViewModel
28import org.yuzu.yuzu_emu.ui.main.MainActivity 28import org.yuzu.yuzu_emu.ui.main.MainActivity
29import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
29 30
30class GameFoldersFragment : Fragment() { 31class GameFoldersFragment : Fragment() {
31 private var _binding: FragmentFoldersBinding? = null 32 private var _binding: FragmentFoldersBinding? = null
@@ -100,23 +101,16 @@ class GameFoldersFragment : Fragment() {
100 val leftInsets = barInsets.left + cutoutInsets.left 101 val leftInsets = barInsets.left + cutoutInsets.left
101 val rightInsets = barInsets.right + cutoutInsets.right 102 val rightInsets = barInsets.right + cutoutInsets.right
102 103
103 val mlpToolbar = binding.toolbarFolders.layoutParams as ViewGroup.MarginLayoutParams 104 binding.toolbarFolders.updateMargins(left = leftInsets, right = rightInsets)
104 mlpToolbar.leftMargin = leftInsets
105 mlpToolbar.rightMargin = rightInsets
106 binding.toolbarFolders.layoutParams = mlpToolbar
107 105
108 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab) 106 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
109 val mlpFab = 107 binding.buttonAdd.updateMargins(
110 binding.buttonAdd.layoutParams as ViewGroup.MarginLayoutParams 108 left = leftInsets + fabSpacing,
111 mlpFab.leftMargin = leftInsets + fabSpacing 109 right = rightInsets + fabSpacing,
112 mlpFab.rightMargin = rightInsets + fabSpacing 110 bottom = barInsets.bottom + fabSpacing
113 mlpFab.bottomMargin = barInsets.bottom + fabSpacing 111 )
114 binding.buttonAdd.layoutParams = mlpFab 112
115 113 binding.listFolders.updateMargins(left = leftInsets, right = rightInsets)
116 val mlpListFolders = binding.listFolders.layoutParams as ViewGroup.MarginLayoutParams
117 mlpListFolders.leftMargin = leftInsets
118 mlpListFolders.rightMargin = rightInsets
119 binding.listFolders.layoutParams = mlpListFolders
120 114
121 binding.listFolders.updatePadding( 115 binding.listFolders.updatePadding(
122 bottom = barInsets.bottom + 116 bottom = barInsets.bottom +
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
index 5aa3f453f..dbd56e84f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt
@@ -27,6 +27,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGameInfoBinding
27import org.yuzu.yuzu_emu.model.GameVerificationResult 27import org.yuzu.yuzu_emu.model.GameVerificationResult
28import org.yuzu.yuzu_emu.model.HomeViewModel 28import org.yuzu.yuzu_emu.model.HomeViewModel
29import org.yuzu.yuzu_emu.utils.GameMetadata 29import org.yuzu.yuzu_emu.utils.GameMetadata
30import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
30 31
31class GameInfoFragment : Fragment() { 32class GameInfoFragment : Fragment() {
32 private var _binding: FragmentGameInfoBinding? = null 33 private var _binding: FragmentGameInfoBinding? = null
@@ -122,11 +123,13 @@ class GameInfoFragment : Fragment() {
122 titleId = R.string.verify_success, 123 titleId = R.string.verify_success,
123 descriptionId = R.string.operation_completed_successfully 124 descriptionId = R.string.operation_completed_successfully
124 ) 125 )
126
125 GameVerificationResult.Failed -> 127 GameVerificationResult.Failed ->
126 MessageDialogFragment.newInstance( 128 MessageDialogFragment.newInstance(
127 titleId = R.string.verify_failure, 129 titleId = R.string.verify_failure,
128 descriptionId = R.string.verify_failure_description 130 descriptionId = R.string.verify_failure_description
129 ) 131 )
132
130 GameVerificationResult.NotImplemented -> 133 GameVerificationResult.NotImplemented ->
131 MessageDialogFragment.newInstance( 134 MessageDialogFragment.newInstance(
132 titleId = R.string.verify_no_result, 135 titleId = R.string.verify_no_result,
@@ -165,15 +168,8 @@ class GameInfoFragment : Fragment() {
165 val leftInsets = barInsets.left + cutoutInsets.left 168 val leftInsets = barInsets.left + cutoutInsets.left
166 val rightInsets = barInsets.right + cutoutInsets.right 169 val rightInsets = barInsets.right + cutoutInsets.right
167 170
168 val mlpToolbar = binding.toolbarInfo.layoutParams as ViewGroup.MarginLayoutParams 171 binding.toolbarInfo.updateMargins(left = leftInsets, right = rightInsets)
169 mlpToolbar.leftMargin = leftInsets 172 binding.scrollInfo.updateMargins(left = leftInsets, right = rightInsets)
170 mlpToolbar.rightMargin = rightInsets
171 binding.toolbarInfo.layoutParams = mlpToolbar
172
173 val mlpScrollAbout = binding.scrollInfo.layoutParams as ViewGroup.MarginLayoutParams
174 mlpScrollAbout.leftMargin = leftInsets
175 mlpScrollAbout.rightMargin = rightInsets
176 binding.scrollInfo.layoutParams = mlpScrollAbout
177 173
178 binding.contentInfo.updatePadding(bottom = barInsets.bottom) 174 binding.contentInfo.updatePadding(bottom = barInsets.bottom)
179 175
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
index 582df0133..d14b2c634 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt
@@ -46,6 +46,7 @@ import org.yuzu.yuzu_emu.utils.FileUtil
46import org.yuzu.yuzu_emu.utils.GameIconUtils 46import org.yuzu.yuzu_emu.utils.GameIconUtils
47import org.yuzu.yuzu_emu.utils.GpuDriverHelper 47import org.yuzu.yuzu_emu.utils.GpuDriverHelper
48import org.yuzu.yuzu_emu.utils.MemoryUtil 48import org.yuzu.yuzu_emu.utils.MemoryUtil
49import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
49import java.io.BufferedOutputStream 50import java.io.BufferedOutputStream
50import java.io.File 51import java.io.File
51 52
@@ -320,46 +321,25 @@ class GamePropertiesFragment : Fragment() {
320 321
321 val smallLayout = resources.getBoolean(R.bool.small_layout) 322 val smallLayout = resources.getBoolean(R.bool.small_layout)
322 if (smallLayout) { 323 if (smallLayout) {
323 val mlpListAll = 324 binding.listAll.updateMargins(left = leftInsets, right = rightInsets)
324 binding.listAll.layoutParams as ViewGroup.MarginLayoutParams
325 mlpListAll.leftMargin = leftInsets
326 mlpListAll.rightMargin = rightInsets
327 binding.listAll.layoutParams = mlpListAll
328 } else { 325 } else {
329 if (ViewCompat.getLayoutDirection(binding.root) == 326 if (ViewCompat.getLayoutDirection(binding.root) ==
330 ViewCompat.LAYOUT_DIRECTION_LTR 327 ViewCompat.LAYOUT_DIRECTION_LTR
331 ) { 328 ) {
332 val mlpListAll = 329 binding.listAll.updateMargins(right = rightInsets)
333 binding.listAll.layoutParams as ViewGroup.MarginLayoutParams 330 binding.iconLayout!!.updateMargins(top = barInsets.top, left = leftInsets)
334 mlpListAll.rightMargin = rightInsets
335 binding.listAll.layoutParams = mlpListAll
336
337 val mlpIconLayout =
338 binding.iconLayout!!.layoutParams as ViewGroup.MarginLayoutParams
339 mlpIconLayout.topMargin = barInsets.top
340 mlpIconLayout.leftMargin = leftInsets
341 binding.iconLayout!!.layoutParams = mlpIconLayout
342 } else { 331 } else {
343 val mlpListAll = 332 binding.listAll.updateMargins(left = leftInsets)
344 binding.listAll.layoutParams as ViewGroup.MarginLayoutParams 333 binding.iconLayout!!.updateMargins(top = barInsets.top, right = rightInsets)
345 mlpListAll.leftMargin = leftInsets
346 binding.listAll.layoutParams = mlpListAll
347
348 val mlpIconLayout =
349 binding.iconLayout!!.layoutParams as ViewGroup.MarginLayoutParams
350 mlpIconLayout.topMargin = barInsets.top
351 mlpIconLayout.rightMargin = rightInsets
352 binding.iconLayout!!.layoutParams = mlpIconLayout
353 } 334 }
354 } 335 }
355 336
356 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab) 337 val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
357 val mlpFab = 338 binding.buttonStart.updateMargins(
358 binding.buttonStart.layoutParams as ViewGroup.MarginLayoutParams 339 left = leftInsets + fabSpacing,
359 mlpFab.leftMargin = leftInsets + fabSpacing 340 right = rightInsets + fabSpacing,
360 mlpFab.rightMargin = rightInsets + fabSpacing 341 bottom = barInsets.bottom + fabSpacing
361 mlpFab.bottomMargin = barInsets.bottom + fabSpacing 342 )
362 binding.buttonStart.layoutParams = mlpFab
363 343
364 binding.layoutAll.updatePadding( 344 binding.layoutAll.updatePadding(
365 top = barInsets.top, 345 top = barInsets.top,
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
index 1f3578b22..87e130d3e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt
@@ -12,7 +12,6 @@ import android.provider.DocumentsContract
12import android.view.LayoutInflater 12import android.view.LayoutInflater
13import android.view.View 13import android.view.View
14import android.view.ViewGroup 14import android.view.ViewGroup
15import android.view.ViewGroup.MarginLayoutParams
16import android.widget.Toast 15import android.widget.Toast
17import androidx.appcompat.app.AppCompatActivity 16import androidx.appcompat.app.AppCompatActivity
18import androidx.core.app.ActivityCompat 17import androidx.core.app.ActivityCompat
@@ -44,6 +43,7 @@ import org.yuzu.yuzu_emu.ui.main.MainActivity
44import org.yuzu.yuzu_emu.utils.FileUtil 43import org.yuzu.yuzu_emu.utils.FileUtil
45import org.yuzu.yuzu_emu.utils.GpuDriverHelper 44import org.yuzu.yuzu_emu.utils.GpuDriverHelper
46import org.yuzu.yuzu_emu.utils.Log 45import org.yuzu.yuzu_emu.utils.Log
46import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
47 47
48class HomeSettingsFragment : Fragment() { 48class HomeSettingsFragment : Fragment() {
49 private var _binding: FragmentHomeSettingsBinding? = null 49 private var _binding: FragmentHomeSettingsBinding? = null
@@ -408,10 +408,7 @@ class HomeSettingsFragment : Fragment() {
408 bottom = barInsets.bottom 408 bottom = barInsets.bottom
409 ) 409 )
410 410
411 val mlpScrollSettings = binding.scrollViewSettings.layoutParams as MarginLayoutParams 411 binding.scrollViewSettings.updateMargins(left = leftInsets, right = rightInsets)
412 mlpScrollSettings.leftMargin = leftInsets
413 mlpScrollSettings.rightMargin = rightInsets
414 binding.scrollViewSettings.layoutParams = mlpScrollSettings
415 412
416 binding.linearLayoutSettings.updatePadding(bottom = spacingNavigation) 413 binding.linearLayoutSettings.updatePadding(bottom = spacingNavigation)
417 414
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
index 7df8e6bf4..63112dc6f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt
@@ -34,6 +34,7 @@ import org.yuzu.yuzu_emu.model.TaskState
34import org.yuzu.yuzu_emu.ui.main.MainActivity 34import org.yuzu.yuzu_emu.ui.main.MainActivity
35import org.yuzu.yuzu_emu.utils.DirectoryInitialization 35import org.yuzu.yuzu_emu.utils.DirectoryInitialization
36import org.yuzu.yuzu_emu.utils.FileUtil 36import org.yuzu.yuzu_emu.utils.FileUtil
37import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
37import java.io.BufferedOutputStream 38import java.io.BufferedOutputStream
38import java.io.File 39import java.io.File
39import java.math.BigInteger 40import java.math.BigInteger
@@ -172,16 +173,8 @@ class InstallableFragment : Fragment() {
172 val leftInsets = barInsets.left + cutoutInsets.left 173 val leftInsets = barInsets.left + cutoutInsets.left
173 val rightInsets = barInsets.right + cutoutInsets.right 174 val rightInsets = barInsets.right + cutoutInsets.right
174 175
175 val mlpAppBar = binding.toolbarInstallables.layoutParams as ViewGroup.MarginLayoutParams 176 binding.toolbarInstallables.updateMargins(left = leftInsets, right = rightInsets)
176 mlpAppBar.leftMargin = leftInsets 177 binding.listInstallables.updateMargins(left = leftInsets, right = rightInsets)
177 mlpAppBar.rightMargin = rightInsets
178 binding.toolbarInstallables.layoutParams = mlpAppBar
179
180 val mlpScrollAbout =
181 binding.listInstallables.layoutParams as ViewGroup.MarginLayoutParams
182 mlpScrollAbout.leftMargin = leftInsets
183 mlpScrollAbout.rightMargin = rightInsets
184 binding.listInstallables.layoutParams = mlpScrollAbout
185 178
186 binding.listInstallables.updatePadding(bottom = barInsets.bottom) 179 binding.listInstallables.updatePadding(bottom = barInsets.bottom)
187 180
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt
index b6e9129f7..f17f621f8 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt
@@ -7,7 +7,6 @@ import android.os.Bundle
7import android.view.LayoutInflater 7import android.view.LayoutInflater
8import android.view.View 8import android.view.View
9import android.view.ViewGroup 9import android.view.ViewGroup
10import android.view.ViewGroup.MarginLayoutParams
11import androidx.appcompat.app.AppCompatActivity 10import androidx.appcompat.app.AppCompatActivity
12import androidx.core.view.ViewCompat 11import androidx.core.view.ViewCompat
13import androidx.core.view.WindowInsetsCompat 12import androidx.core.view.WindowInsetsCompat
@@ -22,6 +21,7 @@ import org.yuzu.yuzu_emu.adapters.LicenseAdapter
22import org.yuzu.yuzu_emu.databinding.FragmentLicensesBinding 21import org.yuzu.yuzu_emu.databinding.FragmentLicensesBinding
23import org.yuzu.yuzu_emu.model.HomeViewModel 22import org.yuzu.yuzu_emu.model.HomeViewModel
24import org.yuzu.yuzu_emu.model.License 23import org.yuzu.yuzu_emu.model.License
24import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
25 25
26class LicensesFragment : Fragment() { 26class LicensesFragment : Fragment() {
27 private var _binding: FragmentLicensesBinding? = null 27 private var _binding: FragmentLicensesBinding? = null
@@ -122,15 +122,8 @@ class LicensesFragment : Fragment() {
122 val leftInsets = barInsets.left + cutoutInsets.left 122 val leftInsets = barInsets.left + cutoutInsets.left
123 val rightInsets = barInsets.right + cutoutInsets.right 123 val rightInsets = barInsets.right + cutoutInsets.right
124 124
125 val mlpAppBar = binding.appbarLicenses.layoutParams as MarginLayoutParams 125 binding.appbarLicenses.updateMargins(left = leftInsets, right = rightInsets)
126 mlpAppBar.leftMargin = leftInsets 126 binding.listLicenses.updateMargins(left = leftInsets, right = rightInsets)
127 mlpAppBar.rightMargin = rightInsets
128 binding.appbarLicenses.layoutParams = mlpAppBar
129
130 val mlpScrollAbout = binding.listLicenses.layoutParams as MarginLayoutParams
131 mlpScrollAbout.leftMargin = leftInsets
132 mlpScrollAbout.rightMargin = rightInsets
133 binding.listLicenses.layoutParams = mlpScrollAbout
134 127
135 binding.listLicenses.updatePadding(bottom = barInsets.bottom) 128 binding.listLicenses.updatePadding(bottom = barInsets.bottom)
136 129
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsSearchFragment.kt
index f95d545bf..a135b80b4 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsSearchFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SettingsSearchFragment.kt
@@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
29import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter 29import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
30import org.yuzu.yuzu_emu.model.SettingsViewModel 30import org.yuzu.yuzu_emu.model.SettingsViewModel
31import org.yuzu.yuzu_emu.utils.NativeConfig 31import org.yuzu.yuzu_emu.utils.NativeConfig
32import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
32 33
33class SettingsSearchFragment : Fragment() { 34class SettingsSearchFragment : Fragment() {
34 private var _binding: FragmentSettingsSearchBinding? = null 35 private var _binding: FragmentSettingsSearchBinding? = null
@@ -174,15 +175,14 @@ class SettingsSearchFragment : Fragment() {
174 bottom = barInsets.bottom 175 bottom = barInsets.bottom
175 ) 176 )
176 177
177 val mlpSettingsList = binding.settingsList.layoutParams as ViewGroup.MarginLayoutParams 178 binding.settingsList.updateMargins(
178 mlpSettingsList.leftMargin = leftInsets + sideMargin 179 left = leftInsets + sideMargin,
179 mlpSettingsList.rightMargin = rightInsets + sideMargin 180 right = rightInsets + sideMargin
180 binding.settingsList.layoutParams = mlpSettingsList 181 )
181 182 binding.divider.updateMargins(
182 val mlpDivider = binding.divider.layoutParams as ViewGroup.MarginLayoutParams 183 left = leftInsets + sideMargin,
183 mlpDivider.leftMargin = leftInsets + sideMargin 184 right = rightInsets + sideMargin
184 mlpDivider.rightMargin = rightInsets + sideMargin 185 )
185 binding.divider.layoutParams = mlpDivider
186 186
187 windowInsets 187 windowInsets
188 } 188 }
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
index 54380323e..23ca49b53 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt
@@ -8,7 +8,6 @@ import android.os.Bundle
8import android.view.LayoutInflater 8import android.view.LayoutInflater
9import android.view.View 9import android.view.View
10import android.view.ViewGroup 10import android.view.ViewGroup
11import android.view.ViewGroup.MarginLayoutParams
12import androidx.appcompat.app.AppCompatActivity 11import androidx.appcompat.app.AppCompatActivity
13import androidx.core.view.ViewCompat 12import androidx.core.view.ViewCompat
14import androidx.core.view.WindowInsetsCompat 13import androidx.core.view.WindowInsetsCompat
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding
27import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager 26import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
28import org.yuzu.yuzu_emu.model.GamesViewModel 27import org.yuzu.yuzu_emu.model.GamesViewModel
29import org.yuzu.yuzu_emu.model.HomeViewModel 28import org.yuzu.yuzu_emu.model.HomeViewModel
29import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
30 30
31class GamesFragment : Fragment() { 31class GamesFragment : Fragment() {
32 private var _binding: FragmentGamesBinding? = null 32 private var _binding: FragmentGamesBinding? = null
@@ -169,15 +169,16 @@ class GamesFragment : Fragment() {
169 169
170 val leftInsets = barInsets.left + cutoutInsets.left 170 val leftInsets = barInsets.left + cutoutInsets.left
171 val rightInsets = barInsets.right + cutoutInsets.right 171 val rightInsets = barInsets.right + cutoutInsets.right
172 val mlpSwipe = binding.swipeRefresh.layoutParams as MarginLayoutParams 172 val left: Int
173 val right: Int
173 if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) { 174 if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
174 mlpSwipe.leftMargin = leftInsets + spacingNavigationRail 175 left = leftInsets + spacingNavigationRail
175 mlpSwipe.rightMargin = rightInsets 176 right = rightInsets
176 } else { 177 } else {
177 mlpSwipe.leftMargin = leftInsets 178 left = leftInsets
178 mlpSwipe.rightMargin = rightInsets + spacingNavigationRail 179 right = rightInsets + spacingNavigationRail
179 } 180 }
180 binding.swipeRefresh.layoutParams = mlpSwipe 181 binding.swipeRefresh.updateMargins(left = left, right = right)
181 182
182 binding.noticeText.updatePadding(bottom = spacingNavigation) 183 binding.noticeText.updatePadding(bottom = spacingNavigation)
183 184
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
index b3967d294..4df4ac4c6 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
@@ -34,7 +34,6 @@ import kotlinx.coroutines.launch
34import org.yuzu.yuzu_emu.HomeNavigationDirections 34import org.yuzu.yuzu_emu.HomeNavigationDirections
35import org.yuzu.yuzu_emu.NativeLibrary 35import org.yuzu.yuzu_emu.NativeLibrary
36import org.yuzu.yuzu_emu.R 36import org.yuzu.yuzu_emu.R
37import org.yuzu.yuzu_emu.activities.EmulationActivity
38import org.yuzu.yuzu_emu.databinding.ActivityMainBinding 37import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
39import org.yuzu.yuzu_emu.features.settings.model.Settings 38import org.yuzu.yuzu_emu.features.settings.model.Settings
40import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment 39import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment
@@ -177,9 +176,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
177 } 176 }
178 } 177 }
179 178
180 // Dismiss previous notifications (should not happen unless a crash occurred)
181 EmulationActivity.stopForegroundService(this)
182
183 setInsets() 179 setInsets()
184 } 180 }
185 181
@@ -298,11 +294,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
298 super.onResume() 294 super.onResume()
299 } 295 }
300 296
301 override fun onDestroy() {
302 EmulationActivity.stopForegroundService(this)
303 super.onDestroy()
304 }
305
306 private fun setInsets() = 297 private fun setInsets() =
307 ViewCompat.setOnApplyWindowInsetsListener( 298 ViewCompat.setOnApplyWindowInsetsListener(
308 binding.root 299 binding.root
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt
deleted file mode 100644
index 086d17606..000000000
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt
+++ /dev/null
@@ -1,70 +0,0 @@
1// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4package org.yuzu.yuzu_emu.utils
5
6import android.app.PendingIntent
7import android.app.Service
8import android.content.Intent
9import android.os.IBinder
10import androidx.core.app.NotificationCompat
11import androidx.core.app.NotificationManagerCompat
12import org.yuzu.yuzu_emu.R
13import org.yuzu.yuzu_emu.activities.EmulationActivity
14
15/**
16 * A service that shows a permanent notification in the background to avoid the app getting
17 * cleared from memory by the system.
18 */
19class ForegroundService : Service() {
20 companion object {
21 const val EMULATION_RUNNING_NOTIFICATION = 0x1000
22
23 const val ACTION_STOP = "stop"
24 }
25
26 private fun showRunningNotification() {
27 // Intent is used to resume emulation if the notification is clicked
28 val contentIntent = PendingIntent.getActivity(
29 this,
30 0,
31 Intent(this, EmulationActivity::class.java),
32 PendingIntent.FLAG_IMMUTABLE
33 )
34 val builder =
35 NotificationCompat.Builder(this, getString(R.string.emulation_notification_channel_id))
36 .setSmallIcon(R.drawable.ic_stat_notification_logo)
37 .setContentTitle(getString(R.string.app_name))
38 .setContentText(getString(R.string.emulation_notification_running))
39 .setPriority(NotificationCompat.PRIORITY_LOW)
40 .setOngoing(true)
41 .setVibrate(null)
42 .setSound(null)
43 .setContentIntent(contentIntent)
44 startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build())
45 }
46
47 override fun onBind(intent: Intent): IBinder? {
48 return null
49 }
50
51 override fun onCreate() {
52 showRunningNotification()
53 }
54
55 override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
56 if (intent == null) {
57 return START_NOT_STICKY
58 }
59 if (intent.action == ACTION_STOP) {
60 NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION)
61 stopForeground(STOP_FOREGROUND_REMOVE)
62 stopSelfResult(startId)
63 }
64 return START_STICKY
65 }
66
67 override fun onDestroy() {
68 NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION)
69 }
70}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
index f9a3e4126..ffbfa9337 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt
@@ -4,6 +4,7 @@
4package org.yuzu.yuzu_emu.utils 4package org.yuzu.yuzu_emu.utils
5 5
6import android.view.View 6import android.view.View
7import android.view.ViewGroup
7 8
8object ViewUtils { 9object ViewUtils {
9 fun showView(view: View, length: Long = 300) { 10 fun showView(view: View, length: Long = 300) {
@@ -32,4 +33,28 @@ object ViewUtils {
32 view.visibility = View.INVISIBLE 33 view.visibility = View.INVISIBLE
33 }.start() 34 }.start()
34 } 35 }
36
37 fun View.updateMargins(
38 left: Int = -1,
39 top: Int = -1,
40 right: Int = -1,
41 bottom: Int = -1
42 ) {
43 val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
44 layoutParams.apply {
45 if (left != -1) {
46 leftMargin = left
47 }
48 if (top != -1) {
49 topMargin = top
50 }
51 if (right != -1) {
52 rightMargin = right
53 }
54 if (bottom != -1) {
55 bottomMargin = bottom
56 }
57 }
58 this.layoutParams = layoutParams
59 }
35} 60}
diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h
index cf93304da..4a3bc8e53 100644
--- a/src/android/app/src/main/jni/android_settings.h
+++ b/src/android/app/src/main/jni/android_settings.h
@@ -60,6 +60,8 @@ struct Values {
60 Settings::Category::Overlay}; 60 Settings::Category::Overlay};
61 Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay", 61 Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay",
62 Settings::Category::Overlay}; 62 Settings::Category::Overlay};
63 Settings::Setting<bool> show_thermal_overlay{linkage, false, "show_thermal_overlay",
64 Settings::Category::Overlay};
63 Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay", 65 Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
64 Settings::Category::Overlay}; 66 Settings::Category::Overlay};
65 Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay}; 67 Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml
index 0d2bfe8d6..e99a15783 100644
--- a/src/android/app/src/main/res/layout/fragment_emulation.xml
+++ b/src/android/app/src/main/res/layout/fragment_emulation.xml
@@ -140,6 +140,7 @@
140 android:id="@+id/overlay_container" 140 android:id="@+id/overlay_container"
141 android:layout_width="match_parent" 141 android:layout_width="match_parent"
142 android:layout_height="match_parent" 142 android:layout_height="match_parent"
143 android:layout_marginHorizontal="20dp"
143 android:fitsSystemWindows="true"> 144 android:fitsSystemWindows="true">
144 145
145 <com.google.android.material.textview.MaterialTextView 146 <com.google.android.material.textview.MaterialTextView
@@ -150,7 +151,19 @@
150 android:layout_gravity="left" 151 android:layout_gravity="left"
151 android:clickable="false" 152 android:clickable="false"
152 android:focusable="false" 153 android:focusable="false"
153 android:paddingHorizontal="20dp" 154 android:textColor="@android:color/white"
155 android:shadowColor="@android:color/black"
156 android:shadowRadius="3"
157 tools:ignore="RtlHardcoded" />
158
159 <com.google.android.material.textview.MaterialTextView
160 android:id="@+id/show_thermals_text"
161 style="@style/TextAppearance.Material3.BodySmall"
162 android:layout_width="wrap_content"
163 android:layout_height="wrap_content"
164 android:layout_gravity="right"
165 android:clickable="false"
166 android:focusable="false"
154 android:textColor="@android:color/white" 167 android:textColor="@android:color/white"
155 android:shadowColor="@android:color/black" 168 android:shadowColor="@android:color/black"
156 android:shadowRadius="3" 169 android:shadowRadius="3"
diff --git a/src/android/app/src/main/res/menu/menu_overlay_options.xml b/src/android/app/src/main/res/menu/menu_overlay_options.xml
index 363781652..a9e807427 100644
--- a/src/android/app/src/main/res/menu/menu_overlay_options.xml
+++ b/src/android/app/src/main/res/menu/menu_overlay_options.xml
@@ -7,6 +7,11 @@
7 android:checkable="true" /> 7 android:checkable="true" />
8 8
9 <item 9 <item
10 android:id="@+id/thermal_indicator"
11 android:title="@string/emulation_thermal_indicator"
12 android:checkable="true" />
13
14 <item
10 android:id="@+id/menu_edit_overlay" 15 android:id="@+id/menu_edit_overlay"
11 android:title="@string/emulation_touch_overlay_edit" /> 16 android:title="@string/emulation_touch_overlay_edit" />
12 17
diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml
index 53678f465..41d741847 100644
--- a/src/android/app/src/main/res/values-ar/strings.xml
+++ b/src/android/app/src/main/res/values-ar/strings.xml
@@ -1,9 +1,6 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="emulation_notification_channel_name">المحاكي نشط</string>
5 <string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
6 <string name="emulation_notification_running">يوزو قيد التشغيل</string>
7 <string name="notice_notification_channel_name">الإشعارات والأخطاء</string> 4 <string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
8 <string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string> 5 <string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
9 <string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string> 6 <string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml
index 7e1eb2b8d..827339505 100644
--- a/src/android/app/src/main/res/values-ckb/strings.xml
+++ b/src/android/app/src/main/res/values-ckb/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..&lt;br /&gt;&lt;br /&gt;پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی <![CDATA[<b> prod.keys </b>]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">زیاتر فێربە</a>]]></string> 4 <string name="app_disclaimer">ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..&lt;br /&gt;&lt;br /&gt;پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی <![CDATA[<b> prod.keys </b>]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">زیاتر فێربە</a>]]></string>
5 <string name="emulation_notification_channel_name">ئیمولەیشن کارایە</string>
6 <string name="emulation_notification_channel_description">ئاگادارکردنەوەیەکی بەردەوام نیشان دەدات کاتێک ئیمولەیشن کاردەکات.</string>
7 <string name="emulation_notification_running">یوزو کاردەکات</string>
8 <string name="notice_notification_channel_name">ئاگاداری و هەڵەکان</string> 5 <string name="notice_notification_channel_name">ئاگاداری و هەڵەکان</string>
9 <string name="notice_notification_channel_description">ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت.</string> 6 <string name="notice_notification_channel_description">ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت.</string>
10 <string name="notification_permission_not_granted">مۆڵەتی ئاگادارکردنەوە نەدراوە!</string> 7 <string name="notification_permission_not_granted">مۆڵەتی ئاگادارکردنەوە نەدراوە!</string>
diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml
index b9a4a11e4..8f8e2848d 100644
--- a/src/android/app/src/main/res/values-cs/strings.xml
+++ b/src/android/app/src/main/res/values-cs/strings.xml
@@ -1,7 +1,6 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="emulation_notification_channel_name">Emulace je aktivní</string>
5 <string name="notice_notification_channel_name">Upozornění a chyby</string> 4 <string name="notice_notification_channel_name">Upozornění a chyby</string>
6 <string name="notice_notification_channel_description">Ukáže oznámení v případě chyby.</string> 5 <string name="notice_notification_channel_description">Ukáže oznámení v případě chyby.</string>
7 <string name="notification_permission_not_granted">Oznámení nejsou oprávněna!</string> 6 <string name="notification_permission_not_granted">Oznámení nejsou oprávněna!</string>
diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml
index 483ea8c88..fb25b3c93 100644
--- a/src/android/app/src/main/res/values-de/strings.xml
+++ b/src/android/app/src/main/res/values-de/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.&lt;br /&gt;&lt;br /&gt;Bevor du beginnst, bitte halte deine <![CDATA[<b> prod.keys </b>]]> auf deinem Gerät bereit. .&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Mehr Infos</a>]]></string> 4 <string name="app_disclaimer">Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.&lt;br /&gt;&lt;br /&gt;Bevor du beginnst, bitte halte deine <![CDATA[<b> prod.keys </b>]]> auf deinem Gerät bereit. .&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Mehr Infos</a>]]></string>
5 <string name="emulation_notification_channel_name">Emulation ist aktiv</string>
6 <string name="emulation_notification_channel_description">Zeigt eine dauerhafte Benachrichtigung an, wenn die Emulation läuft.</string>
7 <string name="emulation_notification_running">yuzu läuft</string>
8 <string name="notice_notification_channel_name">Hinweise und Fehler</string> 5 <string name="notice_notification_channel_name">Hinweise und Fehler</string>
9 <string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string> 6 <string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
10 <string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht erlaubt!</string> 7 <string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht erlaubt!</string>
diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml
index c3825710b..7ecbeaba4 100644
--- a/src/android/app/src/main/res/values-es/strings.xml
+++ b/src/android/app/src/main/res/values-es/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.&lt;br /&gt;&lt;br /&gt;Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string> 4 <string name="app_disclaimer">Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.&lt;br /&gt;&lt;br /&gt;Antes de empezar, por favor, localice el archivo <![CDATA[<b> prod.keys </b>]]>en el almacenamiento de su dispositivo..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saber más</a>]]></string>
5 <string name="emulation_notification_channel_name">Emulación activa</string>
6 <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string>
7 <string name="emulation_notification_running">yuzu está ejecutándose</string>
8 <string name="notice_notification_channel_name">Avisos y errores</string> 5 <string name="notice_notification_channel_name">Avisos y errores</string>
9 <string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string> 6 <string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string>
10 <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string> 7 <string name="notification_permission_not_granted">¡Permisos de notificación no concedidos!</string>
diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml
index 667fe33cb..a848b9163 100644
--- a/src/android/app/src/main/res/values-fr/strings.xml
+++ b/src/android/app/src/main/res/values-fr/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.&lt;br /&gt;&lt;br /&gt;Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">En savoir plus</a>]]></string> 4 <string name="app_disclaimer">Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.&lt;br /&gt;&lt;br /&gt;Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">En savoir plus</a>]]></string>
5 <string name="emulation_notification_channel_name">L\'émulation est active</string>
6 <string name="emulation_notification_channel_description">Affiche une notification persistante lorsque l\'émulation est en cours d\'exécution.</string>
7 <string name="emulation_notification_running">yuzu est en cours d\'exécution</string>
8 <string name="notice_notification_channel_name">Avis et erreurs</string> 5 <string name="notice_notification_channel_name">Avis et erreurs</string>
9 <string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string> 6 <string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
10 <string name="notification_permission_not_granted">Permission de notification non accordée !</string> 7 <string name="notification_permission_not_granted">Permission de notification non accordée !</string>
diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml
index 41e4450c6..6096605a9 100644
--- a/src/android/app/src/main/res/values-he/strings.xml
+++ b/src/android/app/src/main/res/values-he/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.&lt;br /&gt;&lt;br /&gt; לפני שאת/ה מתחיל בבקשה מצא את קובץ <![CDATA[<b>prod.keys</b>]]> על המכשיר.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">קרא עוד</a>]]></string> 4 <string name="app_disclaimer">התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.&lt;br /&gt;&lt;br /&gt; לפני שאת/ה מתחיל בבקשה מצא את קובץ <![CDATA[<b>prod.keys</b>]]> על המכשיר.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">קרא עוד</a>]]></string>
5 <string name="emulation_notification_channel_name">אמולציה פעילה</string>
6 <string name="emulation_notification_channel_description">מציג התראה מתמשכת כאשר האמולציה פועלת.</string>
7 <string name="emulation_notification_running">yuzu רץ</string>
8 <string name="notice_notification_channel_name">התראות ותקלות</string> 5 <string name="notice_notification_channel_name">התראות ותקלות</string>
9 <string name="notice_notification_channel_description">מציג התראות כאשר משהו הולך לא כשורה.</string> 6 <string name="notice_notification_channel_description">מציג התראות כאשר משהו הולך לא כשורה.</string>
10 <string name="notification_permission_not_granted">הרשאות התראות לא ניתנה!</string> 7 <string name="notification_permission_not_granted">הרשאות התראות לא ניתנה!</string>
diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml
index 554da0816..f3a29e0c3 100644
--- a/src/android/app/src/main/res/values-hu/strings.xml
+++ b/src/android/app/src/main/res/values-hu/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .&lt;br /&gt;&lt;br /&gt;Mielőtt hozzákezdenél, kérjük, válaszd ki a <![CDATA[<b>prod.keys</b>]]> fájl helyét a készülék tárhelyén&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Tudj meg többet</a>]]></string> 4 <string name="app_disclaimer">Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .&lt;br /&gt;&lt;br /&gt;Mielőtt hozzákezdenél, kérjük, válaszd ki a <![CDATA[<b>prod.keys</b>]]> fájl helyét a készülék tárhelyén&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Tudj meg többet</a>]]></string>
5 <string name="emulation_notification_channel_name">Emuláció aktív</string>
6 <string name="emulation_notification_channel_description">Állandó értesítést jelenít meg, amíg az emuláció fut.</string>
7 <string name="emulation_notification_running">A yuzu fut</string>
8 <string name="notice_notification_channel_name">Megjegyzések és hibák</string> 5 <string name="notice_notification_channel_name">Megjegyzések és hibák</string>
9 <string name="notice_notification_channel_description">Értesítések megjelenítése, ha valami rosszul sül el.</string> 6 <string name="notice_notification_channel_description">Értesítések megjelenítése, ha valami rosszul sül el.</string>
10 <string name="notification_permission_not_granted">Nincs engedély az értesítés megjelenítéséhez!</string> 7 <string name="notification_permission_not_granted">Nincs engedély az értesítés megjelenítéséhez!</string>
diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml
index 61b39f57f..433d84f5c 100644
--- a/src/android/app/src/main/res/values-it/strings.xml
+++ b/src/android/app/src/main/res/values-it/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.&lt;br /&gt;&lt;br /&gt;Prima di iniziare, perfavore individua il file <![CDATA[<b>prod.keys </b>]]> nella memoria del tuo dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Scopri di più</a>]]></string> 4 <string name="app_disclaimer">Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.&lt;br /&gt;&lt;br /&gt;Prima di iniziare, perfavore individua il file <![CDATA[<b>prod.keys </b>]]> nella memoria del tuo dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Scopri di più</a>]]></string>
5 <string name="emulation_notification_channel_name">L\'emulatore è attivo</string>
6 <string name="emulation_notification_channel_description">Mostra una notifica persistente quando l\'emulatore è in esecuzione.</string>
7 <string name="emulation_notification_running">yuzu è in esecuzione</string>
8 <string name="notice_notification_channel_name">Avvisi ed errori</string> 5 <string name="notice_notification_channel_name">Avvisi ed errori</string>
9 <string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string> 6 <string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string>
10 <string name="notification_permission_not_granted">Autorizzazione di notifica non concessa!</string> 7 <string name="notification_permission_not_granted">Autorizzazione di notifica non concessa!</string>
diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml
index 0cff40bb6..da73ad651 100644
--- a/src/android/app/src/main/res/values-ja/strings.xml
+++ b/src/android/app/src/main/res/values-ja/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。&lt;br /&gt;&lt;br /&gt;事前に、 <![CDATA[<b> prod.keys </b>]]> ファイルをストレージに配置しておいてください。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">詳細</a>]]></string> 4 <string name="app_disclaimer">このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。&lt;br /&gt;&lt;br /&gt;事前に、 <![CDATA[<b> prod.keys </b>]]> ファイルをストレージに配置しておいてください。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">詳細</a>]]></string>
5 <string name="emulation_notification_channel_name">エミュレーションが有効です</string>
6 <string name="emulation_notification_channel_description">エミュレーションの実行中に常設通知を表示します。</string>
7 <string name="emulation_notification_running">yuzu は実行中です</string>
8 <string name="notice_notification_channel_name">通知とエラー</string> 5 <string name="notice_notification_channel_name">通知とエラー</string>
9 <string name="notice_notification_channel_description">問題の発生時に通知を表示します。</string> 6 <string name="notice_notification_channel_description">問題の発生時に通知を表示します。</string>
10 <string name="notification_permission_not_granted">通知が許可されていません!</string> 7 <string name="notification_permission_not_granted">通知が許可されていません!</string>
diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml
index eaa6c23ce..904353d34 100644
--- a/src/android/app/src/main/res/values-ko/strings.xml
+++ b/src/android/app/src/main/res/values-ko/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.&lt;br /&gt;&lt;br /&gt;시작하기 전에 장치 저장소에서 <![CDATA[<b> prod.keys </b>]]> 파일을 찾아주세요.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">자세히 알아보기</a>]]></string> 4 <string name="app_disclaimer">이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.&lt;br /&gt;&lt;br /&gt;시작하기 전에 장치 저장소에서 <![CDATA[<b> prod.keys </b>]]> 파일을 찾아주세요.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">자세히 알아보기</a>]]></string>
5 <string name="emulation_notification_channel_name">에뮬레이션이 활성화됨</string>
6 <string name="emulation_notification_channel_description">에뮬레이션이 실행 중일 때 지속적으로 알림을 표시합니다.</string>
7 <string name="emulation_notification_running">yuzu가 실행 중입니다.</string>
8 <string name="notice_notification_channel_name">알림 및 오류</string> 5 <string name="notice_notification_channel_name">알림 및 오류</string>
9 <string name="notice_notification_channel_description">문제가 발생하면 알림을 표시합니다.</string> 6 <string name="notice_notification_channel_description">문제가 발생하면 알림을 표시합니다.</string>
10 <string name="notification_permission_not_granted">알림 권한이 부여되지 않았습니다!</string> 7 <string name="notification_permission_not_granted">알림 권한이 부여되지 않았습니다!</string>
diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml
index e92dc62d9..fe3af5920 100644
--- a/src/android/app/src/main/res/values-nb/strings.xml
+++ b/src/android/app/src/main/res/values-nb/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.&lt;br /&gt;&lt;br /&gt;Før du begynner, må du finne <![CDATA[<b> prod.keys </b>]]> filen din på enhetslagringen.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Lær mer</a>]]></string> 4 <string name="app_disclaimer">Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.&lt;br /&gt;&lt;br /&gt;Før du begynner, må du finne <![CDATA[<b> prod.keys </b>]]> filen din på enhetslagringen.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Lær mer</a>]]></string>
5 <string name="emulation_notification_channel_name">Emulering er aktiv</string>
6 <string name="emulation_notification_channel_description">Viser et vedvarende varsel når emuleringen kjører.</string>
7 <string name="emulation_notification_running">Yuzu kjører</string>
8 <string name="notice_notification_channel_name">Merknader og feil</string> 5 <string name="notice_notification_channel_name">Merknader og feil</string>
9 <string name="notice_notification_channel_description">Viser varsler når noe går galt.</string> 6 <string name="notice_notification_channel_description">Viser varsler når noe går galt.</string>
10 <string name="notification_permission_not_granted">Varslingstillatelse ikke gitt!</string> 7 <string name="notification_permission_not_granted">Varslingstillatelse ikke gitt!</string>
diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml
index fbd0ad7e9..2af7fd7b4 100644
--- a/src/android/app/src/main/res/values-pl/strings.xml
+++ b/src/android/app/src/main/res/values-pl/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.&lt;br /&gt;&lt;br /&gt;Zanim zaczniesz, wybierz plik kluczy <![CDATA[<b> prod.keys </b>]]> z katalogu w pamięci masowej.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Dowiedz się więcej</a>]]></string> 4 <string name="app_disclaimer">To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.&lt;br /&gt;&lt;br /&gt;Zanim zaczniesz, wybierz plik kluczy <![CDATA[<b> prod.keys </b>]]> z katalogu w pamięci masowej.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Dowiedz się więcej</a>]]></string>
5 <string name="emulation_notification_channel_name">Emulacja jest uruchomiona</string>
6 <string name="emulation_notification_channel_description">Pokaż trwałe powiadomienie gdy emulacja jest uruchomiona.</string>
7 <string name="emulation_notification_running">yuzu jest uruchomiony</string>
8 <string name="notice_notification_channel_name">Powiadomienia błędy</string> 5 <string name="notice_notification_channel_name">Powiadomienia błędy</string>
9 <string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string> 6 <string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string>
10 <string name="notification_permission_not_granted">Nie zezwolono na powiadomienia!</string> 7 <string name="notification_permission_not_granted">Nie zezwolono na powiadomienia!</string>
diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml
index a87eb11e4..130252590 100644
--- a/src/android/app/src/main/res/values-pt-rBR/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.&lt;br /&gt;&lt;br /&gt;Antes de começar, por favor localize o arquivo <![CDATA[<b> prod.keys </b>]]> no armazenamento de seu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saiba mais</a>]]></string> 4 <string name="app_disclaimer">Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.&lt;br /&gt;&lt;br /&gt;Antes de começar, por favor localize o arquivo <![CDATA[<b> prod.keys </b>]]> no armazenamento de seu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Saiba mais</a>]]></string>
5 <string name="emulation_notification_channel_name">A emulação está Ativa</string>
6 <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação estiver em andamento.</string>
7 <string name="emulation_notification_running">O Yuzu está em execução </string>
8 <string name="notice_notification_channel_name">Notificações e erros</string> 5 <string name="notice_notification_channel_name">Notificações e erros</string>
9 <string name="notice_notification_channel_description">Mostra notificações quando algo dá errado.</string> 6 <string name="notice_notification_channel_description">Mostra notificações quando algo dá errado.</string>
10 <string name="notification_permission_not_granted">Acesso às notificações não concedido!</string> 7 <string name="notification_permission_not_granted">Acesso às notificações não concedido!</string>
diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml
index 684a71616..0fdbae4f8 100644
--- a/src/android/app/src/main/res/values-pt-rPT/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Este software corre jogos para a consola Nintendo Switch. Não estão incluídas nem jogos ou chaves. &lt;br /&gt;&lt;br /&gt;Antes de começares, por favor localiza o ficheiro <![CDATA[1 prod.keys 1]]> no armazenamento do teu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[2Learn more2]]></string> 4 <string name="app_disclaimer">Este software corre jogos para a consola Nintendo Switch. Não estão incluídas nem jogos ou chaves. &lt;br /&gt;&lt;br /&gt;Antes de começares, por favor localiza o ficheiro <![CDATA[1 prod.keys 1]]> no armazenamento do teu dispositivo.&lt;br /&gt;&lt;br /&gt;<![CDATA[2Learn more2]]></string>
5 <string name="emulation_notification_channel_name">Emulação está Ativa</string>
6 <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação está a correr.</string>
7 <string name="emulation_notification_running">Yuzu está em execução </string>
8 <string name="notice_notification_channel_name">Notificações e erros</string> 5 <string name="notice_notification_channel_name">Notificações e erros</string>
9 <string name="notice_notification_channel_description">Mostra notificações quendo algo corre mal.</string> 6 <string name="notice_notification_channel_description">Mostra notificações quendo algo corre mal.</string>
10 <string name="notification_permission_not_granted">Permissões de notificação não permitidas </string> 7 <string name="notification_permission_not_granted">Permissões de notificação não permitidas </string>
diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml
index 099b2c9eb..2dfd4a824 100644
--- a/src/android/app/src/main/res/values-ru/strings.xml
+++ b/src/android/app/src/main/res/values-ru/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.&lt;br /&gt;&lt;br /&gt;Перед началом работы найдите файл <![CDATA[<b> prod.keys </b>]]> в хранилище устройства..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Узнать больше</a>]]></string> 4 <string name="app_disclaimer">Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.&lt;br /&gt;&lt;br /&gt;Перед началом работы найдите файл <![CDATA[<b> prod.keys </b>]]> в хранилище устройства..&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Узнать больше</a>]]></string>
5 <string name="emulation_notification_channel_name">Эмуляция активна</string>
6 <string name="emulation_notification_channel_description">Показывает постоянное уведомление, когда запущена эмуляция.</string>
7 <string name="emulation_notification_running">yuzu запущен</string>
8 <string name="notice_notification_channel_name">Уведомления и ошибки</string> 5 <string name="notice_notification_channel_name">Уведомления и ошибки</string>
9 <string name="notice_notification_channel_description">Показывать уведомления, когда что-то пошло не так</string> 6 <string name="notice_notification_channel_description">Показывать уведомления, когда что-то пошло не так</string>
10 <string name="notification_permission_not_granted">Вы не предоставили разрешение на уведомления!</string> 7 <string name="notification_permission_not_granted">Вы не предоставили разрешение на уведомления!</string>
diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml
index 361f0b726..9a2804a93 100644
--- a/src/android/app/src/main/res/values-uk/strings.xml
+++ b/src/android/app/src/main/res/values-uk/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.&lt;br /&gt;&lt;br /&gt;Перед початком роботи знайдіть ваш файл <![CDATA[<b> prod.keys </b>]]> у сховищі пристрою.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Дізнатися більше</a>]]></string> 4 <string name="app_disclaimer">Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.&lt;br /&gt;&lt;br /&gt;Перед початком роботи знайдіть ваш файл <![CDATA[<b> prod.keys </b>]]> у сховищі пристрою.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Дізнатися більше</a>]]></string>
5 <string name="emulation_notification_channel_name">Емуляція активна</string>
6 <string name="emulation_notification_channel_description">Показує постійне сповіщення, коли запущено емуляцію.</string>
7 <string name="emulation_notification_running">yuzu запущено</string>
8 <string name="notice_notification_channel_name">Сповіщення та помилки</string> 5 <string name="notice_notification_channel_name">Сповіщення та помилки</string>
9 <string name="notice_notification_channel_description">Показувати сповіщення, коли щось пішло не так</string> 6 <string name="notice_notification_channel_description">Показувати сповіщення, коли щось пішло не так</string>
10 <string name="notification_permission_not_granted">Ви не надали дозвіл сповіщень!</string> 7 <string name="notification_permission_not_granted">Ви не надали дозвіл сповіщень!</string>
diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml
index 0a722f329..dc06610c7 100644
--- a/src/android/app/src/main/res/values-vi/strings.xml
+++ b/src/android/app/src/main/res/values-vi/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">Phần mềm này sẽ chạy các game cho máy chơi game Nintendo Switch. Không có title games hoặc keys được bao gồm.&lt;br /&gt;&lt;br /&gt;Trước khi bạn bắt đầu, hãy tìm tập tin <![CDATA[<b> prod.keys </b>]]> trên bộ nhớ thiết bị của bạn.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Tìm hiểu thêm</a>]]></string> 4 <string name="app_disclaimer">Phần mềm này sẽ chạy các game cho máy chơi game Nintendo Switch. Không có title games hoặc keys được bao gồm.&lt;br /&gt;&lt;br /&gt;Trước khi bạn bắt đầu, hãy tìm tập tin <![CDATA[<b> prod.keys </b>]]> trên bộ nhớ thiết bị của bạn.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">Tìm hiểu thêm</a>]]></string>
5 <string name="emulation_notification_channel_name">Giả lập đang chạy</string>
6 <string name="emulation_notification_channel_description">Hiển thị thông báo liên tục khi giả lập đang chạy.</string>
7 <string name="emulation_notification_running">yuzu đang chạy</string>
8 <string name="notice_notification_channel_name">Thông báo và lỗi</string> 5 <string name="notice_notification_channel_name">Thông báo và lỗi</string>
9 <string name="notice_notification_channel_description">Hiển thị thông báo khi có sự cố xảy ra.</string> 6 <string name="notice_notification_channel_description">Hiển thị thông báo khi có sự cố xảy ra.</string>
10 <string name="notification_permission_not_granted">Ứng dụng không được cấp quyền thông báo!</string> 7 <string name="notification_permission_not_granted">Ứng dụng không được cấp quyền thông báo!</string>
diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml
index b840591a4..6acf6f391 100644
--- a/src/android/app/src/main/res/values-zh-rCN/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。&lt;br /&gt;&lt;br /&gt;在开始前,请找到放置于设备存储中的 <![CDATA[<b> prod.keys </b>]]> 文件。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">了解更多</a>]]></string> 4 <string name="app_disclaimer">此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。&lt;br /&gt;&lt;br /&gt;在开始前,请找到放置于设备存储中的 <![CDATA[<b> prod.keys </b>]]> 文件。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">了解更多</a>]]></string>
5 <string name="emulation_notification_channel_name">正在进行模拟</string>
6 <string name="emulation_notification_channel_description">在模拟运行时显示持久通知。</string>
7 <string name="emulation_notification_running">yuzu 正在运行</string>
8 <string name="notice_notification_channel_name">通知及错误提醒</string> 5 <string name="notice_notification_channel_name">通知及错误提醒</string>
9 <string name="notice_notification_channel_description">当发生错误时显示通知。</string> 6 <string name="notice_notification_channel_description">当发生错误时显示通知。</string>
10 <string name="notification_permission_not_granted">未授予通知权限!</string> 7 <string name="notification_permission_not_granted">未授予通知权限!</string>
diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml
index d39255714..411fc5947 100644
--- a/src/android/app/src/main/res/values-zh-rTW/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml
@@ -2,9 +2,6 @@
2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> 2<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
3 3
4 <string name="app_disclaimer">此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。&lt;br /&gt;&lt;br /&gt;在您開始前,請找到放置於您的裝置儲存空間的 <![CDATA[<b> prod.keys </b>]]> 檔案。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">深入瞭解</a>]]></string> 4 <string name="app_disclaimer">此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。&lt;br /&gt;&lt;br /&gt;在您開始前,請找到放置於您的裝置儲存空間的 <![CDATA[<b> prod.keys </b>]]> 檔案。&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href=\"https://yuzu-emu.org/help/quickstart\">深入瞭解</a>]]></string>
5 <string name="emulation_notification_channel_name">模擬進行中</string>
6 <string name="emulation_notification_channel_description">在模擬執行時顯示持續通知。</string>
7 <string name="emulation_notification_running">yuzu 正在執行</string>
8 <string name="notice_notification_channel_name">通知和錯誤</string> 5 <string name="notice_notification_channel_name">通知和錯誤</string>
9 <string name="notice_notification_channel_description">發生錯誤時顯示通知。</string> 6 <string name="notice_notification_channel_description">發生錯誤時顯示通知。</string>
10 <string name="notification_permission_not_granted">未授予通知權限!</string> 7 <string name="notification_permission_not_granted">未授予通知權限!</string>
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 3cd1586fd..489e00107 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -4,10 +4,6 @@
4 <!-- General application strings --> 4 <!-- General application strings -->
5 <string name="app_name" translatable="false">yuzu</string> 5 <string name="app_name" translatable="false">yuzu</string>
6 <string name="app_disclaimer">This software will run games for the Nintendo Switch game console. No game titles or keys are included.&lt;br /&gt;&lt;br /&gt;Before you begin, please locate your <![CDATA[<b> prod.keys </b>]]> file on your device storage.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href="https://yuzu-emu.org/help/quickstart">Learn more</a>]]></string> 6 <string name="app_disclaimer">This software will run games for the Nintendo Switch game console. No game titles or keys are included.&lt;br /&gt;&lt;br /&gt;Before you begin, please locate your <![CDATA[<b> prod.keys </b>]]> file on your device storage.&lt;br /&gt;&lt;br /&gt;<![CDATA[<a href="https://yuzu-emu.org/help/quickstart">Learn more</a>]]></string>
7 <string name="emulation_notification_channel_name">Emulation is Active</string>
8 <string name="emulation_notification_channel_id" translatable="false">emulationIsActive</string>
9 <string name="emulation_notification_channel_description">Shows a persistent notification when emulation is running.</string>
10 <string name="emulation_notification_running">yuzu is running</string>
11 <string name="notice_notification_channel_name">Notices and errors</string> 7 <string name="notice_notification_channel_name">Notices and errors</string>
12 <string name="notice_notification_channel_id" translatable="false">noticesAndErrors</string> 8 <string name="notice_notification_channel_id" translatable="false">noticesAndErrors</string>
13 <string name="notice_notification_channel_description">Shows notifications when something goes wrong.</string> 9 <string name="notice_notification_channel_description">Shows notifications when something goes wrong.</string>
@@ -380,6 +376,7 @@
380 <string name="emulation_exit">Exit emulation</string> 376 <string name="emulation_exit">Exit emulation</string>
381 <string name="emulation_done">Done</string> 377 <string name="emulation_done">Done</string>
382 <string name="emulation_fps_counter">FPS counter</string> 378 <string name="emulation_fps_counter">FPS counter</string>
379 <string name="emulation_thermal_indicator">Thermal indicator</string>
383 <string name="emulation_toggle_controls">Toggle controls</string> 380 <string name="emulation_toggle_controls">Toggle controls</string>
384 <string name="emulation_rel_stick_center">Relative stick center</string> 381 <string name="emulation_rel_stick_center">Relative stick center</string>
385 <string name="emulation_dpad_slide">D-pad slide</string> 382 <string name="emulation_dpad_slide">D-pad slide</string>