summaryrefslogtreecommitdiffstats
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/CMakeLists.txt6
-rw-r--r--src/android/app/src/main/jni/android_common/android_common.cpp60
-rw-r--r--src/android/app/src/main/jni/android_common/android_common.h22
-rw-r--r--src/android/app/src/main/jni/android_settings.h2
-rw-r--r--src/android/app/src/main/jni/applets/software_keyboard.cpp277
-rw-r--r--src/android/app/src/main/jni/applets/software_keyboard.h78
-rw-r--r--src/android/app/src/main/jni/emu_window/emu_window.cpp4
-rw-r--r--src/android/app/src/main/jni/game_metadata.cpp22
-rw-r--r--src/android/app/src/main/jni/id_cache.cpp428
-rw-r--r--src/android/app/src/main/jni/id_cache.h68
-rw-r--r--src/android/app/src/main/jni/native.cpp125
-rw-r--r--src/android/app/src/main/jni/native.h6
-rw-r--r--src/android/app/src/main/jni/native_config.cpp121
-rw-r--r--src/android/app/src/main/jni/native_log.cpp13
-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
60 files changed, 361 insertions, 1429 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 @@
import android.annotation.SuppressLint
import kotlin.collections.setOf
-import org.jetbrains.kotlin.konan.properties.Properties
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
+import com.github.triplet.gradle.androidpublisher.ReleaseStatus
plugins {
id("com.android.application")
@@ -13,6 +13,7 @@ plugins {
kotlin("plugin.serialization") version "1.9.20"
id("androidx.navigation.safeargs.kotlin")
id("org.jlleitschuh.gradle.ktlint") version "11.4.0"
+ id("com.github.triplet.play") version "3.8.6"
}
/**
@@ -58,15 +59,7 @@ android {
targetSdk = 34
versionName = getGitVersion()
- // If you want to use autoVersion for the versionCode, create a property in local.properties
- // named "autoVersioned" and set it to "true"
- val properties = Properties()
- val versionProperty = try {
- properties.load(project.rootProject.file("local.properties").inputStream())
- properties.getProperty("autoVersioned") ?: ""
- } catch (e: Exception) { "" }
-
- versionCode = if (versionProperty == "true") {
+ versionCode = if (System.getenv("AUTO_VERSIONED") == "true") {
autoVersion
} else {
1
@@ -221,6 +214,15 @@ ktlint {
}
}
+play {
+ val keyPath = System.getenv("SERVICE_ACCOUNT_KEY_PATH")
+ if (keyPath != null) {
+ serviceAccountCredentials.set(File(keyPath))
+ }
+ track.set(System.getenv("STORE_TRACK") ?: "internal")
+ releaseStatus.set(ReleaseStatus.COMPLETED)
+}
+
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
@@ -257,12 +259,18 @@ fun runGitCommand(command: List<String>): String {
}
fun getGitVersion(): String {
+ val gitVersion = runGitCommand(
+ listOf(
+ "git",
+ "describe",
+ "--always",
+ "--long"
+ )
+ ).replace(Regex("(-0)?-[^-]+$"), "")
val versionName = if (System.getenv("GITHUB_ACTIONS") != null) {
- val gitTag = System.getenv("GIT_TAG_NAME") ?: ""
- gitTag
+ System.getenv("GIT_TAG_NAME") ?: gitVersion
} else {
- runGitCommand(listOf("git", "describe", "--always", "--long"))
- .replace(Regex("(-0)?-[^-]+$"), "")
+ gitVersion
}
return versionName.ifEmpty { "0.0" }
}
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
<uses-feature android:name="android.hardware.vulkan.version" android:version="0x401000" android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
@@ -80,10 +78,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
android:resource="@xml/nfc_tech_filter" />
</activity>
- <service android:name="org.yuzu.yuzu_emu.utils.ForegroundService" android:foregroundServiceType="specialUse">
- <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="Keep emulation running in background"/>
- </service>
-
<provider
android:name=".features.DocumentProvider"
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
class YuzuApplication : Application() {
private fun createNotificationChannels() {
- val emulationChannel = NotificationChannel(
- getString(R.string.emulation_notification_channel_id),
- getString(R.string.emulation_notification_channel_name),
- NotificationManager.IMPORTANCE_LOW
- )
- emulationChannel.description = getString(
- R.string.emulation_notification_channel_description
- )
- emulationChannel.setSound(null, null)
- emulationChannel.vibrationPattern = null
-
val noticeChannel = NotificationChannel(
getString(R.string.notice_notification_channel_id),
getString(R.string.notice_notification_channel_name),
@@ -39,7 +28,6 @@ class YuzuApplication : Application() {
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
val notificationManager = getSystemService(NotificationManager::class.java)
- notificationManager.createNotificationChannel(emulationChannel)
notificationManager.createNotificationChannel(noticeChannel)
}
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 @@
package org.yuzu.yuzu_emu.activities
import android.annotation.SuppressLint
-import android.app.Activity
import android.app.PendingIntent
import android.app.PictureInPictureParams
import android.app.RemoteAction
@@ -45,7 +44,6 @@ import org.yuzu.yuzu_emu.features.settings.model.IntSetting
import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.model.EmulationViewModel
import org.yuzu.yuzu_emu.model.Game
-import org.yuzu.yuzu_emu.utils.ForegroundService
import org.yuzu.yuzu_emu.utils.InputHandler
import org.yuzu.yuzu_emu.utils.Log
import org.yuzu.yuzu_emu.utils.MemoryUtil
@@ -74,11 +72,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
private val emulationViewModel: EmulationViewModel by viewModels()
- override fun onDestroy() {
- stopForegroundService(this)
- super.onDestroy()
- }
-
override fun onCreate(savedInstanceState: Bundle?) {
Log.gameLaunched = true
ThemeHelper.setTheme(this)
@@ -125,10 +118,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
.apply()
}
}
-
- // Start a foreground service to prevent the app from getting killed in the background
- val startIntent = Intent(this, ForegroundService::class.java)
- startForegroundService(startIntent)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
@@ -481,12 +470,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
activity.startActivity(launcher)
}
- fun stopForegroundService(activity: Activity) {
- val startIntent = Intent(activity, ForegroundService::class.java)
- startIntent.action = ForegroundService.ACTION_STOP
- activity.startForegroundService(startIntent)
- }
-
private fun areCoordinatesOutside(view: View?, x: Float, y: Float): Boolean {
if (view == null) {
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 {
HAPTIC_FEEDBACK("haptic_feedback"),
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
SHOW_INPUT_OVERLAY("show_input_overlay"),
- TOUCHSCREEN("touchscreen");
+ TOUCHSCREEN("touchscreen"),
+ SHOW_THERMAL_OVERLAY("show_thermal_overlay");
override fun getBoolean(needsGlobal: Boolean): Boolean =
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
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentSettingsBinding
import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.model.SettingsViewModel
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class SettingsFragment : Fragment() {
private lateinit var presenter: SettingsFragmentPresenter
@@ -125,18 +125,10 @@ class SettingsFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpSettingsList = binding.listSettings.layoutParams as MarginLayoutParams
- mlpSettingsList.leftMargin = leftInsets
- mlpSettingsList.rightMargin = rightInsets
- binding.listSettings.layoutParams = mlpSettingsList
- binding.listSettings.updatePadding(
- bottom = barInsets.bottom
- )
-
- val mlpAppBar = binding.appbarSettings.layoutParams as MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.appbarSettings.layoutParams = mlpAppBar
+ binding.listSettings.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listSettings.updatePadding(bottom = barInsets.bottom)
+
+ binding.appbarSettings.updateMargins(left = leftInsets, right = rightInsets)
windowInsets
}
}
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
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import android.widget.Toast
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
@@ -26,6 +25,7 @@ import org.yuzu.yuzu_emu.BuildConfig
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding
import org.yuzu.yuzu_emu.model.HomeViewModel
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class AboutFragment : Fragment() {
private var _binding: FragmentAboutBinding? = null
@@ -114,15 +114,8 @@ class AboutFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpToolbar = binding.toolbarAbout.layoutParams as MarginLayoutParams
- mlpToolbar.leftMargin = leftInsets
- mlpToolbar.rightMargin = rightInsets
- binding.toolbarAbout.layoutParams = mlpToolbar
-
- val mlpScrollAbout = binding.scrollAbout.layoutParams as MarginLayoutParams
- mlpScrollAbout.leftMargin = leftInsets
- mlpScrollAbout.rightMargin = rightInsets
- binding.scrollAbout.layoutParams = mlpScrollAbout
+ binding.toolbarAbout.updateMargins(left = leftInsets, right = rightInsets)
+ binding.scrollAbout.updateMargins(left = leftInsets, right = rightInsets)
binding.contentAbout.updatePadding(bottom = barInsets.bottom)
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
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.AddonUtil
import org.yuzu.yuzu_emu.utils.FileUtil.copyFilesTo
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import java.io.File
class AddonsFragment : Fragment() {
@@ -202,27 +203,19 @@ class AddonsFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpToolbar = binding.toolbarAddons.layoutParams as ViewGroup.MarginLayoutParams
- mlpToolbar.leftMargin = leftInsets
- mlpToolbar.rightMargin = rightInsets
- binding.toolbarAddons.layoutParams = mlpToolbar
-
- val mlpAddonsList = binding.listAddons.layoutParams as ViewGroup.MarginLayoutParams
- mlpAddonsList.leftMargin = leftInsets
- mlpAddonsList.rightMargin = rightInsets
- binding.listAddons.layoutParams = mlpAddonsList
+ binding.toolbarAddons.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listAddons.updateMargins(left = leftInsets, right = rightInsets)
binding.listAddons.updatePadding(
bottom = barInsets.bottom +
resources.getDimensionPixelSize(R.dimen.spacing_bottom_list_fab)
)
val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
- val mlpFab =
- binding.buttonInstall.layoutParams as ViewGroup.MarginLayoutParams
- mlpFab.leftMargin = leftInsets + fabSpacing
- mlpFab.rightMargin = rightInsets + fabSpacing
- mlpFab.bottomMargin = barInsets.bottom + fabSpacing
- binding.buttonInstall.layoutParams = mlpFab
+ binding.buttonInstall.updateMargins(
+ left = leftInsets + fabSpacing,
+ right = rightInsets + fabSpacing,
+ bottom = barInsets.bottom + fabSpacing
+ )
windowInsets
}
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
import org.yuzu.yuzu_emu.model.Applet
import org.yuzu.yuzu_emu.model.AppletInfo
import org.yuzu.yuzu_emu.model.HomeViewModel
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class AppletLauncherFragment : Fragment() {
private var _binding: FragmentAppletLauncherBinding? = null
@@ -95,16 +96,8 @@ class AppletLauncherFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpAppBar = binding.toolbarApplets.layoutParams as ViewGroup.MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.toolbarApplets.layoutParams = mlpAppBar
-
- val mlpListApplets =
- binding.listApplets.layoutParams as ViewGroup.MarginLayoutParams
- mlpListApplets.leftMargin = leftInsets
- mlpListApplets.rightMargin = rightInsets
- binding.listApplets.layoutParams = mlpListApplets
+ binding.toolbarApplets.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listApplets.updateMargins(left = leftInsets, right = rightInsets)
binding.listApplets.updatePadding(bottom = barInsets.bottom)
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
import org.yuzu.yuzu_emu.utils.FileUtil
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.NativeConfig
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import java.io.File
import java.io.IOException
@@ -141,23 +142,15 @@ class DriverManagerFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpAppBar = binding.toolbarDrivers.layoutParams as ViewGroup.MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.toolbarDrivers.layoutParams = mlpAppBar
-
- val mlplistDrivers = binding.listDrivers.layoutParams as ViewGroup.MarginLayoutParams
- mlplistDrivers.leftMargin = leftInsets
- mlplistDrivers.rightMargin = rightInsets
- binding.listDrivers.layoutParams = mlplistDrivers
+ binding.toolbarDrivers.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listDrivers.updateMargins(left = leftInsets, right = rightInsets)
val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
- val mlpFab =
- binding.buttonInstall.layoutParams as ViewGroup.MarginLayoutParams
- mlpFab.leftMargin = leftInsets + fabSpacing
- mlpFab.rightMargin = rightInsets + fabSpacing
- mlpFab.bottomMargin = barInsets.bottom + fabSpacing
- binding.buttonInstall.layoutParams = mlpFab
+ binding.buttonInstall.updateMargins(
+ left = leftInsets + fabSpacing,
+ right = rightInsets + fabSpacing,
+ bottom = barInsets.bottom + fabSpacing
+ )
binding.listDrivers.updatePadding(
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
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentEarlyAccessBinding
import org.yuzu.yuzu_emu.model.HomeViewModel
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class EarlyAccessFragment : Fragment() {
private var _binding: FragmentEarlyAccessBinding? = null
@@ -73,10 +74,7 @@ class EarlyAccessFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpAppBar = binding.appbarEa.layoutParams as ViewGroup.MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.appbarEa.layoutParams = mlpAppBar
+ binding.appbarEa.updateMargins(left = leftInsets, right = rightInsets)
binding.scrollEa.updatePadding(
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
import android.os.Bundle
import android.os.Handler
import android.os.Looper
+import android.os.PowerManager
import android.os.SystemClock
import android.view.*
import android.widget.TextView
@@ -23,6 +24,7 @@ import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
import androidx.drawerlayout.widget.DrawerLayout
import androidx.drawerlayout.widget.DrawerLayout.DrawerListener
import androidx.fragment.app.Fragment
@@ -38,7 +40,6 @@ import androidx.window.layout.WindowLayoutInfo
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.slider.Slider
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.yuzu.yuzu_emu.HomeNavigationDirections
@@ -64,6 +65,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
private lateinit var emulationState: EmulationState
private var emulationActivity: EmulationActivity? = null
private var perfStatsUpdater: (() -> Unit)? = null
+ private var thermalStatsUpdater: (() -> Unit)? = null
private var _binding: FragmentEmulationBinding? = null
private val binding get() = _binding!!
@@ -77,6 +79,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
private var isInFoldableLayout = false
+ private lateinit var powerManager: PowerManager
+
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is EmulationActivity) {
@@ -102,6 +106,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
super.onCreate(savedInstanceState)
updateOrientation()
+ powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager
+
val intentUri: Uri? = requireActivity().intent.data
var intentGame: Game? = null
if (intentUri != null) {
@@ -394,8 +400,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
emulationState.updateSurface()
- // Setup overlay
+ // Setup overlays
updateShowFpsOverlay()
+ updateThermalOverlay()
}
}
}
@@ -553,6 +560,38 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
}
+ private fun updateThermalOverlay() {
+ if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()) {
+ thermalStatsUpdater = {
+ if (emulationViewModel.emulationStarted.value &&
+ !emulationViewModel.isEmulationStopping.value
+ ) {
+ val thermalStatus = when (powerManager.currentThermalStatus) {
+ PowerManager.THERMAL_STATUS_LIGHT -> "😥"
+ PowerManager.THERMAL_STATUS_MODERATE -> "🥵"
+ PowerManager.THERMAL_STATUS_SEVERE -> "🔥"
+ PowerManager.THERMAL_STATUS_CRITICAL,
+ PowerManager.THERMAL_STATUS_EMERGENCY,
+ PowerManager.THERMAL_STATUS_SHUTDOWN -> "☢️"
+
+ else -> "🙂"
+ }
+ if (_binding != null) {
+ binding.showThermalsText.text = thermalStatus
+ }
+ thermalStatsUpdateHandler.postDelayed(thermalStatsUpdater!!, 1000)
+ }
+ }
+ thermalStatsUpdateHandler.post(thermalStatsUpdater!!)
+ binding.showThermalsText.visibility = View.VISIBLE
+ } else {
+ if (thermalStatsUpdater != null) {
+ thermalStatsUpdateHandler.removeCallbacks(thermalStatsUpdater!!)
+ }
+ binding.showThermalsText.visibility = View.GONE
+ }
+ }
+
@SuppressLint("SourceLockedOrientationActivity")
private fun updateOrientation() {
emulationActivity?.let {
@@ -641,6 +680,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
popup.menu.apply {
findItem(R.id.menu_toggle_fps).isChecked =
BooleanSetting.SHOW_PERFORMANCE_OVERLAY.getBoolean()
+ findItem(R.id.thermal_indicator).isChecked =
+ BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean()
findItem(R.id.menu_rel_stick_center).isChecked =
BooleanSetting.JOYSTICK_REL_CENTER.getBoolean()
findItem(R.id.menu_dpad_slide).isChecked = BooleanSetting.DPAD_SLIDE.getBoolean()
@@ -660,6 +701,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
true
}
+ R.id.thermal_indicator -> {
+ it.isChecked = !it.isChecked
+ BooleanSetting.SHOW_THERMAL_OVERLAY.setBoolean(it.isChecked)
+ updateThermalOverlay()
+ true
+ }
+
R.id.menu_edit_overlay -> {
binding.drawerLayout.close()
binding.surfaceInputOverlay.requestFocus()
@@ -850,7 +898,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
right = cutInsets.right
}
- v.setPadding(left, cutInsets.top, right, 0)
+ v.updatePadding(left = left, top = cutInsets.top, right = right)
windowInsets
}
}
@@ -1003,5 +1051,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
companion object {
private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!)
+ private val thermalStatsUpdateHandler = Handler(Looper.myLooper()!!)
}
}
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
import org.yuzu.yuzu_emu.model.GamesViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.ui.main.MainActivity
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class GameFoldersFragment : Fragment() {
private var _binding: FragmentFoldersBinding? = null
@@ -100,23 +101,16 @@ class GameFoldersFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpToolbar = binding.toolbarFolders.layoutParams as ViewGroup.MarginLayoutParams
- mlpToolbar.leftMargin = leftInsets
- mlpToolbar.rightMargin = rightInsets
- binding.toolbarFolders.layoutParams = mlpToolbar
+ binding.toolbarFolders.updateMargins(left = leftInsets, right = rightInsets)
val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
- val mlpFab =
- binding.buttonAdd.layoutParams as ViewGroup.MarginLayoutParams
- mlpFab.leftMargin = leftInsets + fabSpacing
- mlpFab.rightMargin = rightInsets + fabSpacing
- mlpFab.bottomMargin = barInsets.bottom + fabSpacing
- binding.buttonAdd.layoutParams = mlpFab
-
- val mlpListFolders = binding.listFolders.layoutParams as ViewGroup.MarginLayoutParams
- mlpListFolders.leftMargin = leftInsets
- mlpListFolders.rightMargin = rightInsets
- binding.listFolders.layoutParams = mlpListFolders
+ binding.buttonAdd.updateMargins(
+ left = leftInsets + fabSpacing,
+ right = rightInsets + fabSpacing,
+ bottom = barInsets.bottom + fabSpacing
+ )
+
+ binding.listFolders.updateMargins(left = leftInsets, right = rightInsets)
binding.listFolders.updatePadding(
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
import org.yuzu.yuzu_emu.model.GameVerificationResult
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.GameMetadata
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class GameInfoFragment : Fragment() {
private var _binding: FragmentGameInfoBinding? = null
@@ -122,11 +123,13 @@ class GameInfoFragment : Fragment() {
titleId = R.string.verify_success,
descriptionId = R.string.operation_completed_successfully
)
+
GameVerificationResult.Failed ->
MessageDialogFragment.newInstance(
titleId = R.string.verify_failure,
descriptionId = R.string.verify_failure_description
)
+
GameVerificationResult.NotImplemented ->
MessageDialogFragment.newInstance(
titleId = R.string.verify_no_result,
@@ -165,15 +168,8 @@ class GameInfoFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpToolbar = binding.toolbarInfo.layoutParams as ViewGroup.MarginLayoutParams
- mlpToolbar.leftMargin = leftInsets
- mlpToolbar.rightMargin = rightInsets
- binding.toolbarInfo.layoutParams = mlpToolbar
-
- val mlpScrollAbout = binding.scrollInfo.layoutParams as ViewGroup.MarginLayoutParams
- mlpScrollAbout.leftMargin = leftInsets
- mlpScrollAbout.rightMargin = rightInsets
- binding.scrollInfo.layoutParams = mlpScrollAbout
+ binding.toolbarInfo.updateMargins(left = leftInsets, right = rightInsets)
+ binding.scrollInfo.updateMargins(left = leftInsets, right = rightInsets)
binding.contentInfo.updatePadding(bottom = barInsets.bottom)
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
import org.yuzu.yuzu_emu.utils.GameIconUtils
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.MemoryUtil
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import java.io.BufferedOutputStream
import java.io.File
@@ -320,46 +321,25 @@ class GamePropertiesFragment : Fragment() {
val smallLayout = resources.getBoolean(R.bool.small_layout)
if (smallLayout) {
- val mlpListAll =
- binding.listAll.layoutParams as ViewGroup.MarginLayoutParams
- mlpListAll.leftMargin = leftInsets
- mlpListAll.rightMargin = rightInsets
- binding.listAll.layoutParams = mlpListAll
+ binding.listAll.updateMargins(left = leftInsets, right = rightInsets)
} else {
if (ViewCompat.getLayoutDirection(binding.root) ==
ViewCompat.LAYOUT_DIRECTION_LTR
) {
- val mlpListAll =
- binding.listAll.layoutParams as ViewGroup.MarginLayoutParams
- mlpListAll.rightMargin = rightInsets
- binding.listAll.layoutParams = mlpListAll
-
- val mlpIconLayout =
- binding.iconLayout!!.layoutParams as ViewGroup.MarginLayoutParams
- mlpIconLayout.topMargin = barInsets.top
- mlpIconLayout.leftMargin = leftInsets
- binding.iconLayout!!.layoutParams = mlpIconLayout
+ binding.listAll.updateMargins(right = rightInsets)
+ binding.iconLayout!!.updateMargins(top = barInsets.top, left = leftInsets)
} else {
- val mlpListAll =
- binding.listAll.layoutParams as ViewGroup.MarginLayoutParams
- mlpListAll.leftMargin = leftInsets
- binding.listAll.layoutParams = mlpListAll
-
- val mlpIconLayout =
- binding.iconLayout!!.layoutParams as ViewGroup.MarginLayoutParams
- mlpIconLayout.topMargin = barInsets.top
- mlpIconLayout.rightMargin = rightInsets
- binding.iconLayout!!.layoutParams = mlpIconLayout
+ binding.listAll.updateMargins(left = leftInsets)
+ binding.iconLayout!!.updateMargins(top = barInsets.top, right = rightInsets)
}
}
val fabSpacing = resources.getDimensionPixelSize(R.dimen.spacing_fab)
- val mlpFab =
- binding.buttonStart.layoutParams as ViewGroup.MarginLayoutParams
- mlpFab.leftMargin = leftInsets + fabSpacing
- mlpFab.rightMargin = rightInsets + fabSpacing
- mlpFab.bottomMargin = barInsets.bottom + fabSpacing
- binding.buttonStart.layoutParams = mlpFab
+ binding.buttonStart.updateMargins(
+ left = leftInsets + fabSpacing,
+ right = rightInsets + fabSpacing,
+ bottom = barInsets.bottom + fabSpacing
+ )
binding.layoutAll.updatePadding(
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
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
@@ -44,6 +43,7 @@ import org.yuzu.yuzu_emu.ui.main.MainActivity
import org.yuzu.yuzu_emu.utils.FileUtil
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.Log
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class HomeSettingsFragment : Fragment() {
private var _binding: FragmentHomeSettingsBinding? = null
@@ -408,10 +408,7 @@ class HomeSettingsFragment : Fragment() {
bottom = barInsets.bottom
)
- val mlpScrollSettings = binding.scrollViewSettings.layoutParams as MarginLayoutParams
- mlpScrollSettings.leftMargin = leftInsets
- mlpScrollSettings.rightMargin = rightInsets
- binding.scrollViewSettings.layoutParams = mlpScrollSettings
+ binding.scrollViewSettings.updateMargins(left = leftInsets, right = rightInsets)
binding.linearLayoutSettings.updatePadding(bottom = spacingNavigation)
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
import org.yuzu.yuzu_emu.ui.main.MainActivity
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
import org.yuzu.yuzu_emu.utils.FileUtil
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import java.io.BufferedOutputStream
import java.io.File
import java.math.BigInteger
@@ -172,16 +173,8 @@ class InstallableFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpAppBar = binding.toolbarInstallables.layoutParams as ViewGroup.MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.toolbarInstallables.layoutParams = mlpAppBar
-
- val mlpScrollAbout =
- binding.listInstallables.layoutParams as ViewGroup.MarginLayoutParams
- mlpScrollAbout.leftMargin = leftInsets
- mlpScrollAbout.rightMargin = rightInsets
- binding.listInstallables.layoutParams = mlpScrollAbout
+ binding.toolbarInstallables.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listInstallables.updateMargins(left = leftInsets, right = rightInsets)
binding.listInstallables.updatePadding(bottom = barInsets.bottom)
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
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
@@ -22,6 +21,7 @@ import org.yuzu.yuzu_emu.adapters.LicenseAdapter
import org.yuzu.yuzu_emu.databinding.FragmentLicensesBinding
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.model.License
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class LicensesFragment : Fragment() {
private var _binding: FragmentLicensesBinding? = null
@@ -122,15 +122,8 @@ class LicensesFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpAppBar = binding.appbarLicenses.layoutParams as MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.appbarLicenses.layoutParams = mlpAppBar
-
- val mlpScrollAbout = binding.listLicenses.layoutParams as MarginLayoutParams
- mlpScrollAbout.leftMargin = leftInsets
- mlpScrollAbout.rightMargin = rightInsets
- binding.listLicenses.layoutParams = mlpScrollAbout
+ binding.appbarLicenses.updateMargins(left = leftInsets, right = rightInsets)
+ binding.listLicenses.updateMargins(left = leftInsets, right = rightInsets)
binding.listLicenses.updatePadding(bottom = barInsets.bottom)
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
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
import org.yuzu.yuzu_emu.model.SettingsViewModel
import org.yuzu.yuzu_emu.utils.NativeConfig
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class SettingsSearchFragment : Fragment() {
private var _binding: FragmentSettingsSearchBinding? = null
@@ -174,15 +175,14 @@ class SettingsSearchFragment : Fragment() {
bottom = barInsets.bottom
)
- val mlpSettingsList = binding.settingsList.layoutParams as ViewGroup.MarginLayoutParams
- mlpSettingsList.leftMargin = leftInsets + sideMargin
- mlpSettingsList.rightMargin = rightInsets + sideMargin
- binding.settingsList.layoutParams = mlpSettingsList
-
- val mlpDivider = binding.divider.layoutParams as ViewGroup.MarginLayoutParams
- mlpDivider.leftMargin = leftInsets + sideMargin
- mlpDivider.rightMargin = rightInsets + sideMargin
- binding.divider.layoutParams = mlpDivider
+ binding.settingsList.updateMargins(
+ left = leftInsets + sideMargin,
+ right = rightInsets + sideMargin
+ )
+ binding.divider.updateMargins(
+ left = leftInsets + sideMargin,
+ right = rightInsets + sideMargin
+ )
windowInsets
}
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
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.MarginLayoutParams
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
@@ -27,6 +26,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentGamesBinding
import org.yuzu.yuzu_emu.layout.AutofitGridLayoutManager
import org.yuzu.yuzu_emu.model.GamesViewModel
import org.yuzu.yuzu_emu.model.HomeViewModel
+import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
class GamesFragment : Fragment() {
private var _binding: FragmentGamesBinding? = null
@@ -169,15 +169,16 @@ class GamesFragment : Fragment() {
val leftInsets = barInsets.left + cutoutInsets.left
val rightInsets = barInsets.right + cutoutInsets.right
- val mlpSwipe = binding.swipeRefresh.layoutParams as MarginLayoutParams
+ val left: Int
+ val right: Int
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_LTR) {
- mlpSwipe.leftMargin = leftInsets + spacingNavigationRail
- mlpSwipe.rightMargin = rightInsets
+ left = leftInsets + spacingNavigationRail
+ right = rightInsets
} else {
- mlpSwipe.leftMargin = leftInsets
- mlpSwipe.rightMargin = rightInsets + spacingNavigationRail
+ left = leftInsets
+ right = rightInsets + spacingNavigationRail
}
- binding.swipeRefresh.layoutParams = mlpSwipe
+ binding.swipeRefresh.updateMargins(left = left, right = right)
binding.noticeText.updatePadding(bottom = spacingNavigation)
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
import org.yuzu.yuzu_emu.HomeNavigationDirections
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R
-import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.databinding.ActivityMainBinding
import org.yuzu.yuzu_emu.features.settings.model.Settings
import org.yuzu.yuzu_emu.fragments.AddGameFolderDialogFragment
@@ -177,9 +176,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
}
}
- // Dismiss previous notifications (should not happen unless a crash occurred)
- EmulationActivity.stopForegroundService(this)
-
setInsets()
}
@@ -298,11 +294,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
super.onResume()
}
- override fun onDestroy() {
- EmulationActivity.stopForegroundService(this)
- super.onDestroy()
- }
-
private fun setInsets() =
ViewCompat.setOnApplyWindowInsetsListener(
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 @@
-// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-package org.yuzu.yuzu_emu.utils
-
-import android.app.PendingIntent
-import android.app.Service
-import android.content.Intent
-import android.os.IBinder
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationManagerCompat
-import org.yuzu.yuzu_emu.R
-import org.yuzu.yuzu_emu.activities.EmulationActivity
-
-/**
- * A service that shows a permanent notification in the background to avoid the app getting
- * cleared from memory by the system.
- */
-class ForegroundService : Service() {
- companion object {
- const val EMULATION_RUNNING_NOTIFICATION = 0x1000
-
- const val ACTION_STOP = "stop"
- }
-
- private fun showRunningNotification() {
- // Intent is used to resume emulation if the notification is clicked
- val contentIntent = PendingIntent.getActivity(
- this,
- 0,
- Intent(this, EmulationActivity::class.java),
- PendingIntent.FLAG_IMMUTABLE
- )
- val builder =
- NotificationCompat.Builder(this, getString(R.string.emulation_notification_channel_id))
- .setSmallIcon(R.drawable.ic_stat_notification_logo)
- .setContentTitle(getString(R.string.app_name))
- .setContentText(getString(R.string.emulation_notification_running))
- .setPriority(NotificationCompat.PRIORITY_LOW)
- .setOngoing(true)
- .setVibrate(null)
- .setSound(null)
- .setContentIntent(contentIntent)
- startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build())
- }
-
- override fun onBind(intent: Intent): IBinder? {
- return null
- }
-
- override fun onCreate() {
- showRunningNotification()
- }
-
- override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- if (intent == null) {
- return START_NOT_STICKY
- }
- if (intent.action == ACTION_STOP) {
- NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION)
- stopForeground(STOP_FOREGROUND_REMOVE)
- stopSelfResult(startId)
- }
- return START_STICKY
- }
-
- override fun onDestroy() {
- NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION)
- }
-}
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 @@
package org.yuzu.yuzu_emu.utils
import android.view.View
+import android.view.ViewGroup
object ViewUtils {
fun showView(view: View, length: Long = 300) {
@@ -32,4 +33,28 @@ object ViewUtils {
view.visibility = View.INVISIBLE
}.start()
}
+
+ fun View.updateMargins(
+ left: Int = -1,
+ top: Int = -1,
+ right: Int = -1,
+ bottom: Int = -1
+ ) {
+ val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams
+ layoutParams.apply {
+ if (left != -1) {
+ leftMargin = left
+ }
+ if (top != -1) {
+ topMargin = top
+ }
+ if (right != -1) {
+ rightMargin = right
+ }
+ if (bottom != -1) {
+ bottomMargin = bottom
+ }
+ }
+ this.layoutParams = layoutParams
+ }
}
diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt
index abc6055ab..20b319c12 100644
--- a/src/android/app/src/main/jni/CMakeLists.txt
+++ b/src/android/app/src/main/jni/CMakeLists.txt
@@ -2,14 +2,8 @@
# SPDX-License-Identifier: GPL-3.0-or-later
add_library(yuzu-android SHARED
- android_common/android_common.cpp
- android_common/android_common.h
- applets/software_keyboard.cpp
- applets/software_keyboard.h
emu_window/emu_window.cpp
emu_window/emu_window.h
- id_cache.cpp
- id_cache.h
native.cpp
native.h
native_config.cpp
diff --git a/src/android/app/src/main/jni/android_common/android_common.cpp b/src/android/app/src/main/jni/android_common/android_common.cpp
deleted file mode 100644
index 7018a52af..000000000
--- a/src/android/app/src/main/jni/android_common/android_common.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "jni/android_common/android_common.h"
-
-#include <string>
-#include <string_view>
-
-#include <jni.h>
-
-#include "common/string_util.h"
-#include "jni/id_cache.h"
-
-std::string GetJString(JNIEnv* env, jstring jstr) {
- if (!jstr) {
- return {};
- }
-
- const jchar* jchars = env->GetStringChars(jstr, nullptr);
- const jsize length = env->GetStringLength(jstr);
- const std::u16string_view string_view(reinterpret_cast<const char16_t*>(jchars), length);
- const std::string converted_string = Common::UTF16ToUTF8(string_view);
- env->ReleaseStringChars(jstr, jchars);
-
- return converted_string;
-}
-
-jstring ToJString(JNIEnv* env, std::string_view str) {
- const std::u16string converted_string = Common::UTF8ToUTF16(str);
- return env->NewString(reinterpret_cast<const jchar*>(converted_string.data()),
- static_cast<jint>(converted_string.size()));
-}
-
-jstring ToJString(JNIEnv* env, std::u16string_view str) {
- return ToJString(env, Common::UTF16ToUTF8(str));
-}
-
-double GetJDouble(JNIEnv* env, jobject jdouble) {
- return env->GetDoubleField(jdouble, IDCache::GetDoubleValueField());
-}
-
-jobject ToJDouble(JNIEnv* env, double value) {
- return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value);
-}
-
-s32 GetJInteger(JNIEnv* env, jobject jinteger) {
- return env->GetIntField(jinteger, IDCache::GetIntegerValueField());
-}
-
-jobject ToJInteger(JNIEnv* env, s32 value) {
- return env->NewObject(IDCache::GetIntegerClass(), IDCache::GetIntegerConstructor(), value);
-}
-
-bool GetJBoolean(JNIEnv* env, jobject jboolean) {
- return env->GetBooleanField(jboolean, IDCache::GetBooleanValueField());
-}
-
-jobject ToJBoolean(JNIEnv* env, bool value) {
- return env->NewObject(IDCache::GetBooleanClass(), IDCache::GetBooleanConstructor(), value);
-}
diff --git a/src/android/app/src/main/jni/android_common/android_common.h b/src/android/app/src/main/jni/android_common/android_common.h
deleted file mode 100644
index 29a338c0a..000000000
--- a/src/android/app/src/main/jni/android_common/android_common.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <string>
-
-#include <jni.h>
-#include "common/common_types.h"
-
-std::string GetJString(JNIEnv* env, jstring jstr);
-jstring ToJString(JNIEnv* env, std::string_view str);
-jstring ToJString(JNIEnv* env, std::u16string_view str);
-
-double GetJDouble(JNIEnv* env, jobject jdouble);
-jobject ToJDouble(JNIEnv* env, double value);
-
-s32 GetJInteger(JNIEnv* env, jobject jinteger);
-jobject ToJInteger(JNIEnv* env, s32 value);
-
-bool GetJBoolean(JNIEnv* env, jobject jboolean);
-jobject ToJBoolean(JNIEnv* env, bool value);
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 {
Settings::Category::Overlay};
Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay",
Settings::Category::Overlay};
+ Settings::Setting<bool> show_thermal_overlay{linkage, false, "show_thermal_overlay",
+ Settings::Category::Overlay};
Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay",
Settings::Category::Overlay};
Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay};
diff --git a/src/android/app/src/main/jni/applets/software_keyboard.cpp b/src/android/app/src/main/jni/applets/software_keyboard.cpp
deleted file mode 100644
index 9943483e8..000000000
--- a/src/android/app/src/main/jni/applets/software_keyboard.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include <map>
-#include <thread>
-
-#include <jni.h>
-
-#include "common/logging/log.h"
-#include "common/string_util.h"
-#include "core/core.h"
-#include "jni/android_common/android_common.h"
-#include "jni/applets/software_keyboard.h"
-#include "jni/id_cache.h"
-
-static jclass s_software_keyboard_class;
-static jclass s_keyboard_config_class;
-static jclass s_keyboard_data_class;
-static jmethodID s_swkbd_execute_normal;
-static jmethodID s_swkbd_execute_inline;
-
-namespace SoftwareKeyboard {
-
-static jobject ToJKeyboardParams(const Core::Frontend::KeyboardInitializeParameters& config) {
- JNIEnv* env = IDCache::GetEnvForThread();
- jobject object = env->AllocObject(s_keyboard_config_class);
-
- env->SetObjectField(object,
- env->GetFieldID(s_keyboard_config_class, "ok_text", "Ljava/lang/String;"),
- ToJString(env, config.ok_text));
- env->SetObjectField(
- object, env->GetFieldID(s_keyboard_config_class, "header_text", "Ljava/lang/String;"),
- ToJString(env, config.header_text));
- env->SetObjectField(object,
- env->GetFieldID(s_keyboard_config_class, "sub_text", "Ljava/lang/String;"),
- ToJString(env, config.sub_text));
- env->SetObjectField(
- object, env->GetFieldID(s_keyboard_config_class, "guide_text", "Ljava/lang/String;"),
- ToJString(env, config.guide_text));
- env->SetObjectField(
- object, env->GetFieldID(s_keyboard_config_class, "initial_text", "Ljava/lang/String;"),
- ToJString(env, config.initial_text));
- env->SetShortField(object,
- env->GetFieldID(s_keyboard_config_class, "left_optional_symbol_key", "S"),
- static_cast<jshort>(config.left_optional_symbol_key));
- env->SetShortField(object,
- env->GetFieldID(s_keyboard_config_class, "right_optional_symbol_key", "S"),
- static_cast<jshort>(config.right_optional_symbol_key));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "max_text_length", "I"),
- static_cast<jint>(config.max_text_length));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "min_text_length", "I"),
- static_cast<jint>(config.min_text_length));
- env->SetIntField(object,
- env->GetFieldID(s_keyboard_config_class, "initial_cursor_position", "I"),
- static_cast<jint>(config.initial_cursor_position));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "type", "I"),
- static_cast<jint>(config.type));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "password_mode", "I"),
- static_cast<jint>(config.password_mode));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "text_draw_type", "I"),
- static_cast<jint>(config.text_draw_type));
- env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "key_disable_flags", "I"),
- static_cast<jint>(config.key_disable_flags.raw));
- env->SetBooleanField(object,
- env->GetFieldID(s_keyboard_config_class, "use_blur_background", "Z"),
- static_cast<jboolean>(config.use_blur_background));
- env->SetBooleanField(object,
- env->GetFieldID(s_keyboard_config_class, "enable_backspace_button", "Z"),
- static_cast<jboolean>(config.enable_backspace_button));
- env->SetBooleanField(object,
- env->GetFieldID(s_keyboard_config_class, "enable_return_button", "Z"),
- static_cast<jboolean>(config.enable_return_button));
- env->SetBooleanField(object,
- env->GetFieldID(s_keyboard_config_class, "disable_cancel_button", "Z"),
- static_cast<jboolean>(config.disable_cancel_button));
-
- return object;
-}
-
-AndroidKeyboard::ResultData AndroidKeyboard::ResultData::CreateFromFrontend(jobject object) {
- JNIEnv* env = IDCache::GetEnvForThread();
- const jstring string = reinterpret_cast<jstring>(env->GetObjectField(
- object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;")));
- return ResultData{GetJString(env, string),
- static_cast<Service::AM::Frontend::SwkbdResult>(env->GetIntField(
- object, env->GetFieldID(s_keyboard_data_class, "result", "I")))};
-}
-
-AndroidKeyboard::~AndroidKeyboard() = default;
-
-void AndroidKeyboard::InitializeKeyboard(
- bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters,
- SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) {
- if (is_inline) {
- LOG_WARNING(
- Frontend,
- "(STUBBED) called, backend requested to initialize the inline software keyboard.");
-
- submit_inline_callback = std::move(submit_inline_callback_);
- } else {
- LOG_WARNING(
- Frontend,
- "(STUBBED) called, backend requested to initialize the normal software keyboard.");
-
- submit_normal_callback = std::move(submit_normal_callback_);
- }
-
- parameters = std::move(initialize_parameters);
-
- LOG_INFO(Frontend,
- "\nKeyboardInitializeParameters:"
- "\nok_text={}"
- "\nheader_text={}"
- "\nsub_text={}"
- "\nguide_text={}"
- "\ninitial_text={}"
- "\nmax_text_length={}"
- "\nmin_text_length={}"
- "\ninitial_cursor_position={}"
- "\ntype={}"
- "\npassword_mode={}"
- "\ntext_draw_type={}"
- "\nkey_disable_flags={}"
- "\nuse_blur_background={}"
- "\nenable_backspace_button={}"
- "\nenable_return_button={}"
- "\ndisable_cancel_button={}",
- Common::UTF16ToUTF8(parameters.ok_text), Common::UTF16ToUTF8(parameters.header_text),
- Common::UTF16ToUTF8(parameters.sub_text), Common::UTF16ToUTF8(parameters.guide_text),
- Common::UTF16ToUTF8(parameters.initial_text), parameters.max_text_length,
- parameters.min_text_length, parameters.initial_cursor_position, parameters.type,
- parameters.password_mode, parameters.text_draw_type, parameters.key_disable_flags.raw,
- parameters.use_blur_background, parameters.enable_backspace_button,
- parameters.enable_return_button, parameters.disable_cancel_button);
-}
-
-void AndroidKeyboard::ShowNormalKeyboard() const {
- LOG_DEBUG(Frontend, "called, backend requested to show the normal software keyboard.");
-
- ResultData data{};
-
- // Pivot to a new thread, as we cannot call GetEnvForThread() from a Fiber.
- std::thread([&] {
- data = ResultData::CreateFromFrontend(IDCache::GetEnvForThread()->CallStaticObjectMethod(
- s_software_keyboard_class, s_swkbd_execute_normal, ToJKeyboardParams(parameters)));
- }).join();
-
- SubmitNormalText(data);
-}
-
-void AndroidKeyboard::ShowTextCheckDialog(
- Service::AM::Frontend::SwkbdTextCheckResult text_check_result,
- std::u16string text_check_message) const {
- LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog.");
-}
-
-void AndroidKeyboard::ShowInlineKeyboard(
- Core::Frontend::InlineAppearParameters appear_parameters) const {
- LOG_WARNING(Frontend,
- "(STUBBED) called, backend requested to show the inline software keyboard.");
-
- LOG_INFO(Frontend,
- "\nInlineAppearParameters:"
- "\nmax_text_length={}"
- "\nmin_text_length={}"
- "\nkey_top_scale_x={}"
- "\nkey_top_scale_y={}"
- "\nkey_top_translate_x={}"
- "\nkey_top_translate_y={}"
- "\ntype={}"
- "\nkey_disable_flags={}"
- "\nkey_top_as_floating={}"
- "\nenable_backspace_button={}"
- "\nenable_return_button={}"
- "\ndisable_cancel_button={}",
- appear_parameters.max_text_length, appear_parameters.min_text_length,
- appear_parameters.key_top_scale_x, appear_parameters.key_top_scale_y,
- appear_parameters.key_top_translate_x, appear_parameters.key_top_translate_y,
- appear_parameters.type, appear_parameters.key_disable_flags.raw,
- appear_parameters.key_top_as_floating, appear_parameters.enable_backspace_button,
- appear_parameters.enable_return_button, appear_parameters.disable_cancel_button);
-
- // Pivot to a new thread, as we cannot call GetEnvForThread() from a Fiber.
- m_is_inline_active = true;
- std::thread([&] {
- IDCache::GetEnvForThread()->CallStaticVoidMethod(
- s_software_keyboard_class, s_swkbd_execute_inline, ToJKeyboardParams(parameters));
- }).join();
-}
-
-void AndroidKeyboard::HideInlineKeyboard() const {
- LOG_WARNING(Frontend,
- "(STUBBED) called, backend requested to hide the inline software keyboard.");
-}
-
-void AndroidKeyboard::InlineTextChanged(
- Core::Frontend::InlineTextParameters text_parameters) const {
- LOG_WARNING(Frontend,
- "(STUBBED) called, backend requested to change the inline keyboard text.");
-
- LOG_INFO(Frontend,
- "\nInlineTextParameters:"
- "\ninput_text={}"
- "\ncursor_position={}",
- Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position);
-
- submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString,
- text_parameters.input_text, text_parameters.cursor_position);
-}
-
-void AndroidKeyboard::ExitKeyboard() const {
- LOG_WARNING(Frontend, "(STUBBED) called, backend requested to exit the software keyboard.");
-}
-
-void AndroidKeyboard::SubmitInlineKeyboardText(std::u16string submitted_text) {
- if (!m_is_inline_active) {
- return;
- }
-
- m_current_text += submitted_text;
-
- submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text,
- m_current_text.size());
-}
-
-void AndroidKeyboard::SubmitInlineKeyboardInput(int key_code) {
- static constexpr int KEYCODE_BACK = 4;
- static constexpr int KEYCODE_ENTER = 66;
- static constexpr int KEYCODE_DEL = 67;
-
- if (!m_is_inline_active) {
- return;
- }
-
- switch (key_code) {
- case KEYCODE_BACK:
- case KEYCODE_ENTER:
- m_is_inline_active = false;
- submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::DecidedEnter, m_current_text,
- static_cast<s32>(m_current_text.size()));
- break;
- case KEYCODE_DEL:
- m_current_text.pop_back();
- submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text,
- m_current_text.size());
- break;
- }
-}
-
-void AndroidKeyboard::SubmitNormalText(const ResultData& data) const {
- submit_normal_callback(data.result, Common::UTF8ToUTF16(data.text), true);
-}
-
-void InitJNI(JNIEnv* env) {
- s_software_keyboard_class = reinterpret_cast<jclass>(
- env->NewGlobalRef(env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard")));
- s_keyboard_config_class = reinterpret_cast<jclass>(env->NewGlobalRef(
- env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig")));
- s_keyboard_data_class = reinterpret_cast<jclass>(env->NewGlobalRef(
- env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData")));
-
- s_swkbd_execute_normal = env->GetStaticMethodID(
- s_software_keyboard_class, "executeNormal",
- "(Lorg/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Lorg/yuzu/yuzu_emu/"
- "applets/keyboard/SoftwareKeyboard$KeyboardData;");
- s_swkbd_execute_inline = env->GetStaticMethodID(
- s_software_keyboard_class, "executeInline",
- "(Lorg/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V");
-}
-
-void CleanupJNI(JNIEnv* env) {
- env->DeleteGlobalRef(s_software_keyboard_class);
- env->DeleteGlobalRef(s_keyboard_config_class);
- env->DeleteGlobalRef(s_keyboard_data_class);
-}
-
-} // namespace SoftwareKeyboard
diff --git a/src/android/app/src/main/jni/applets/software_keyboard.h b/src/android/app/src/main/jni/applets/software_keyboard.h
deleted file mode 100644
index 2affc01f6..000000000
--- a/src/android/app/src/main/jni/applets/software_keyboard.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <jni.h>
-
-#include "core/frontend/applets/software_keyboard.h"
-
-namespace SoftwareKeyboard {
-
-class AndroidKeyboard final : public Core::Frontend::SoftwareKeyboardApplet {
-public:
- ~AndroidKeyboard() override;
-
- void Close() const override {
- ExitKeyboard();
- }
-
- void InitializeKeyboard(bool is_inline,
- Core::Frontend::KeyboardInitializeParameters initialize_parameters,
- SubmitNormalCallback submit_normal_callback_,
- SubmitInlineCallback submit_inline_callback_) override;
-
- void ShowNormalKeyboard() const override;
-
- void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result,
- std::u16string text_check_message) const override;
-
- void ShowInlineKeyboard(
- Core::Frontend::InlineAppearParameters appear_parameters) const override;
-
- void HideInlineKeyboard() const override;
-
- void InlineTextChanged(Core::Frontend::InlineTextParameters text_parameters) const override;
-
- void ExitKeyboard() const override;
-
- void SubmitInlineKeyboardText(std::u16string submitted_text);
-
- void SubmitInlineKeyboardInput(int key_code);
-
-private:
- struct ResultData {
- static ResultData CreateFromFrontend(jobject object);
-
- std::string text;
- Service::AM::Frontend::SwkbdResult result{};
- };
-
- void SubmitNormalText(const ResultData& result) const;
-
- Core::Frontend::KeyboardInitializeParameters parameters{};
-
- mutable SubmitNormalCallback submit_normal_callback;
- mutable SubmitInlineCallback submit_inline_callback;
-
-private:
- mutable bool m_is_inline_active{};
- std::u16string m_current_text;
-};
-
-// Should be called in JNI_Load
-void InitJNI(JNIEnv* env);
-
-// Should be called in JNI_Unload
-void CleanupJNI(JNIEnv* env);
-
-} // namespace SoftwareKeyboard
-
-// Native function calls
-extern "C" {
-JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateFilters(
- JNIEnv* env, jclass clazz, jstring text);
-
-JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateInput(
- JNIEnv* env, jclass clazz, jstring text);
-}
diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp
index c4f631924..c927cddda 100644
--- a/src/android/app/src/main/jni/emu_window/emu_window.cpp
+++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp
@@ -3,6 +3,7 @@
#include <android/native_window_jni.h>
+#include "common/android/id_cache.h"
#include "common/logging/log.h"
#include "input_common/drivers/touch_screen.h"
#include "input_common/drivers/virtual_amiibo.h"
@@ -60,7 +61,8 @@ void EmuWindow_Android::OnRemoveNfcTag() {
void EmuWindow_Android::OnFrameDisplayed() {
if (!m_first_frame) {
- EmulationSession::GetInstance().OnEmulationStarted();
+ Common::Android::RunJNIOnFiber<void>(
+ [&](JNIEnv* env) { EmulationSession::GetInstance().OnEmulationStarted(); });
m_first_frame = true;
}
}
diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp
index 8f0da1413..c33763b47 100644
--- a/src/android/app/src/main/jni/game_metadata.cpp
+++ b/src/android/app/src/main/jni/game_metadata.cpp
@@ -1,13 +1,12 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include "common/android/android_common.h"
#include "core/core.h"
#include "core/file_sys/fs_filesystem.h"
#include "core/file_sys/patch_manager.h"
#include "core/loader/loader.h"
#include "core/loader/nro.h"
-#include "jni.h"
-#include "jni/android_common/android_common.h"
#include "native.h"
struct RomMetadata {
@@ -79,7 +78,7 @@ extern "C" {
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj,
jstring jpath) {
const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
- GetJString(env, jpath), FileSys::OpenMode::Read);
+ Common::Android::GetJString(env, jpath), FileSys::OpenMode::Read);
if (!file) {
return false;
}
@@ -104,27 +103,31 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj,
jstring jpath) {
- return ToJString(env, GetRomMetadata(GetJString(env, jpath)).title);
+ return Common::Android::ToJString(
+ env, GetRomMetadata(Common::Android::GetJString(env, jpath)).title);
}
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj,
jstring jpath) {
- return ToJString(env, std::to_string(GetRomMetadata(GetJString(env, jpath)).programId));
+ return Common::Android::ToJString(
+ env, std::to_string(GetRomMetadata(Common::Android::GetJString(env, jpath)).programId));
}
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj,
jstring jpath) {
- return ToJString(env, GetRomMetadata(GetJString(env, jpath)).developer);
+ return Common::Android::ToJString(
+ env, GetRomMetadata(Common::Android::GetJString(env, jpath)).developer);
}
jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj,
jstring jpath, jboolean jreload) {
- return ToJString(env, GetRomMetadata(GetJString(env, jpath), jreload).version);
+ return Common::Android::ToJString(
+ env, GetRomMetadata(Common::Android::GetJString(env, jpath), jreload).version);
}
jbyteArray Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj,
jstring jpath) {
- auto icon_data = GetRomMetadata(GetJString(env, jpath)).icon;
+ auto icon_data = GetRomMetadata(Common::Android::GetJString(env, jpath)).icon;
jbyteArray icon = env->NewByteArray(static_cast<jsize>(icon_data.size()));
env->SetByteArrayRegion(icon, 0, env->GetArrayLength(icon),
reinterpret_cast<jbyte*>(icon_data.data()));
@@ -133,7 +136,8 @@ jbyteArray Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobje
jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj,
jstring jpath) {
- return static_cast<jboolean>(GetRomMetadata(GetJString(env, jpath)).isHomebrew);
+ return static_cast<jboolean>(
+ GetRomMetadata(Common::Android::GetJString(env, jpath)).isHomebrew);
}
void Java_org_yuzu_yuzu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) {
diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp
deleted file mode 100644
index f30100bd8..000000000
--- a/src/android/app/src/main/jni/id_cache.cpp
+++ /dev/null
@@ -1,428 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include <jni.h>
-
-#include "common/assert.h"
-#include "common/fs/fs_android.h"
-#include "jni/applets/software_keyboard.h"
-#include "jni/id_cache.h"
-#include "video_core/rasterizer_interface.h"
-
-static JavaVM* s_java_vm;
-static jclass s_native_library_class;
-static jclass s_disk_cache_progress_class;
-static jclass s_load_callback_stage_class;
-static jclass s_game_dir_class;
-static jmethodID s_game_dir_constructor;
-static jmethodID s_exit_emulation_activity;
-static jmethodID s_disk_cache_load_progress;
-static jmethodID s_on_emulation_started;
-static jmethodID s_on_emulation_stopped;
-static jmethodID s_on_program_changed;
-
-static jclass s_game_class;
-static jmethodID s_game_constructor;
-static jfieldID s_game_title_field;
-static jfieldID s_game_path_field;
-static jfieldID s_game_program_id_field;
-static jfieldID s_game_developer_field;
-static jfieldID s_game_version_field;
-static jfieldID s_game_is_homebrew_field;
-
-static jclass s_string_class;
-static jclass s_pair_class;
-static jmethodID s_pair_constructor;
-static jfieldID s_pair_first_field;
-static jfieldID s_pair_second_field;
-
-static jclass s_overlay_control_data_class;
-static jmethodID s_overlay_control_data_constructor;
-static jfieldID s_overlay_control_data_id_field;
-static jfieldID s_overlay_control_data_enabled_field;
-static jfieldID s_overlay_control_data_landscape_position_field;
-static jfieldID s_overlay_control_data_portrait_position_field;
-static jfieldID s_overlay_control_data_foldable_position_field;
-
-static jclass s_patch_class;
-static jmethodID s_patch_constructor;
-static jfieldID s_patch_enabled_field;
-static jfieldID s_patch_name_field;
-static jfieldID s_patch_version_field;
-static jfieldID s_patch_type_field;
-static jfieldID s_patch_program_id_field;
-static jfieldID s_patch_title_id_field;
-
-static jclass s_double_class;
-static jmethodID s_double_constructor;
-static jfieldID s_double_value_field;
-
-static jclass s_integer_class;
-static jmethodID s_integer_constructor;
-static jfieldID s_integer_value_field;
-
-static jclass s_boolean_class;
-static jmethodID s_boolean_constructor;
-static jfieldID s_boolean_value_field;
-
-static constexpr jint JNI_VERSION = JNI_VERSION_1_6;
-
-namespace IDCache {
-
-JNIEnv* GetEnvForThread() {
- thread_local static struct OwnedEnv {
- OwnedEnv() {
- status = s_java_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
- if (status == JNI_EDETACHED)
- s_java_vm->AttachCurrentThread(&env, nullptr);
- }
-
- ~OwnedEnv() {
- if (status == JNI_EDETACHED)
- s_java_vm->DetachCurrentThread();
- }
-
- int status;
- JNIEnv* env = nullptr;
- } owned;
- return owned.env;
-}
-
-jclass GetNativeLibraryClass() {
- return s_native_library_class;
-}
-
-jclass GetDiskCacheProgressClass() {
- return s_disk_cache_progress_class;
-}
-
-jclass GetDiskCacheLoadCallbackStageClass() {
- return s_load_callback_stage_class;
-}
-
-jclass GetGameDirClass() {
- return s_game_dir_class;
-}
-
-jmethodID GetGameDirConstructor() {
- return s_game_dir_constructor;
-}
-
-jmethodID GetExitEmulationActivity() {
- return s_exit_emulation_activity;
-}
-
-jmethodID GetDiskCacheLoadProgress() {
- return s_disk_cache_load_progress;
-}
-
-jmethodID GetOnEmulationStarted() {
- return s_on_emulation_started;
-}
-
-jmethodID GetOnEmulationStopped() {
- return s_on_emulation_stopped;
-}
-
-jmethodID GetOnProgramChanged() {
- return s_on_program_changed;
-}
-
-jclass GetGameClass() {
- return s_game_class;
-}
-
-jmethodID GetGameConstructor() {
- return s_game_constructor;
-}
-
-jfieldID GetGameTitleField() {
- return s_game_title_field;
-}
-
-jfieldID GetGamePathField() {
- return s_game_path_field;
-}
-
-jfieldID GetGameProgramIdField() {
- return s_game_program_id_field;
-}
-
-jfieldID GetGameDeveloperField() {
- return s_game_developer_field;
-}
-
-jfieldID GetGameVersionField() {
- return s_game_version_field;
-}
-
-jfieldID GetGameIsHomebrewField() {
- return s_game_is_homebrew_field;
-}
-
-jclass GetStringClass() {
- return s_string_class;
-}
-
-jclass GetPairClass() {
- return s_pair_class;
-}
-
-jmethodID GetPairConstructor() {
- return s_pair_constructor;
-}
-
-jfieldID GetPairFirstField() {
- return s_pair_first_field;
-}
-
-jfieldID GetPairSecondField() {
- return s_pair_second_field;
-}
-
-jclass GetOverlayControlDataClass() {
- return s_overlay_control_data_class;
-}
-
-jmethodID GetOverlayControlDataConstructor() {
- return s_overlay_control_data_constructor;
-}
-
-jfieldID GetOverlayControlDataIdField() {
- return s_overlay_control_data_id_field;
-}
-
-jfieldID GetOverlayControlDataEnabledField() {
- return s_overlay_control_data_enabled_field;
-}
-
-jfieldID GetOverlayControlDataLandscapePositionField() {
- return s_overlay_control_data_landscape_position_field;
-}
-
-jfieldID GetOverlayControlDataPortraitPositionField() {
- return s_overlay_control_data_portrait_position_field;
-}
-
-jfieldID GetOverlayControlDataFoldablePositionField() {
- return s_overlay_control_data_foldable_position_field;
-}
-
-jclass GetPatchClass() {
- return s_patch_class;
-}
-
-jmethodID GetPatchConstructor() {
- return s_patch_constructor;
-}
-
-jfieldID GetPatchEnabledField() {
- return s_patch_enabled_field;
-}
-
-jfieldID GetPatchNameField() {
- return s_patch_name_field;
-}
-
-jfieldID GetPatchVersionField() {
- return s_patch_version_field;
-}
-
-jfieldID GetPatchTypeField() {
- return s_patch_type_field;
-}
-
-jfieldID GetPatchProgramIdField() {
- return s_patch_program_id_field;
-}
-
-jfieldID GetPatchTitleIdField() {
- return s_patch_title_id_field;
-}
-
-jclass GetDoubleClass() {
- return s_double_class;
-}
-
-jmethodID GetDoubleConstructor() {
- return s_double_constructor;
-}
-
-jfieldID GetDoubleValueField() {
- return s_double_value_field;
-}
-
-jclass GetIntegerClass() {
- return s_integer_class;
-}
-
-jmethodID GetIntegerConstructor() {
- return s_integer_constructor;
-}
-
-jfieldID GetIntegerValueField() {
- return s_integer_value_field;
-}
-
-jclass GetBooleanClass() {
- return s_boolean_class;
-}
-
-jmethodID GetBooleanConstructor() {
- return s_boolean_constructor;
-}
-
-jfieldID GetBooleanValueField() {
- return s_boolean_value_field;
-}
-
-} // namespace IDCache
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-jint JNI_OnLoad(JavaVM* vm, void* reserved) {
- s_java_vm = vm;
-
- JNIEnv* env;
- if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK)
- return JNI_ERR;
-
- // Initialize Java classes
- const jclass native_library_class = env->FindClass("org/yuzu/yuzu_emu/NativeLibrary");
- s_native_library_class = reinterpret_cast<jclass>(env->NewGlobalRef(native_library_class));
- s_disk_cache_progress_class = reinterpret_cast<jclass>(env->NewGlobalRef(
- env->FindClass("org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress")));
- s_load_callback_stage_class = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass(
- "org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage")));
-
- const jclass game_dir_class = env->FindClass("org/yuzu/yuzu_emu/model/GameDir");
- s_game_dir_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_dir_class));
- s_game_dir_constructor = env->GetMethodID(game_dir_class, "<init>", "(Ljava/lang/String;Z)V");
- env->DeleteLocalRef(game_dir_class);
-
- // Initialize methods
- s_exit_emulation_activity =
- env->GetStaticMethodID(s_native_library_class, "exitEmulationActivity", "(I)V");
- s_disk_cache_load_progress =
- env->GetStaticMethodID(s_disk_cache_progress_class, "loadProgress", "(III)V");
- s_on_emulation_started =
- env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V");
- s_on_emulation_stopped =
- env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V");
- s_on_program_changed =
- env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V");
-
- const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game");
- s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class));
- s_game_constructor = env->GetMethodID(game_class, "<init>",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
- "String;Ljava/lang/String;Ljava/lang/String;Z)V");
- s_game_title_field = env->GetFieldID(game_class, "title", "Ljava/lang/String;");
- s_game_path_field = env->GetFieldID(game_class, "path", "Ljava/lang/String;");
- s_game_program_id_field = env->GetFieldID(game_class, "programId", "Ljava/lang/String;");
- s_game_developer_field = env->GetFieldID(game_class, "developer", "Ljava/lang/String;");
- s_game_version_field = env->GetFieldID(game_class, "version", "Ljava/lang/String;");
- s_game_is_homebrew_field = env->GetFieldID(game_class, "isHomebrew", "Z");
- env->DeleteLocalRef(game_class);
-
- const jclass string_class = env->FindClass("java/lang/String");
- s_string_class = reinterpret_cast<jclass>(env->NewGlobalRef(string_class));
- env->DeleteLocalRef(string_class);
-
- const jclass pair_class = env->FindClass("kotlin/Pair");
- s_pair_class = reinterpret_cast<jclass>(env->NewGlobalRef(pair_class));
- s_pair_constructor =
- env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
- s_pair_first_field = env->GetFieldID(pair_class, "first", "Ljava/lang/Object;");
- s_pair_second_field = env->GetFieldID(pair_class, "second", "Ljava/lang/Object;");
- env->DeleteLocalRef(pair_class);
-
- const jclass overlay_control_data_class =
- env->FindClass("org/yuzu/yuzu_emu/overlay/model/OverlayControlData");
- s_overlay_control_data_class =
- reinterpret_cast<jclass>(env->NewGlobalRef(overlay_control_data_class));
- s_overlay_control_data_constructor =
- env->GetMethodID(overlay_control_data_class, "<init>",
- "(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;)V");
- s_overlay_control_data_id_field =
- env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;");
- s_overlay_control_data_enabled_field =
- env->GetFieldID(overlay_control_data_class, "enabled", "Z");
- s_overlay_control_data_landscape_position_field =
- env->GetFieldID(overlay_control_data_class, "landscapePosition", "Lkotlin/Pair;");
- s_overlay_control_data_portrait_position_field =
- env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;");
- s_overlay_control_data_foldable_position_field =
- env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;");
- env->DeleteLocalRef(overlay_control_data_class);
-
- const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch");
- s_patch_class = reinterpret_cast<jclass>(env->NewGlobalRef(patch_class));
- s_patch_constructor = env->GetMethodID(
- patch_class, "<init>",
- "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
- s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z");
- s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;");
- s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;");
- s_patch_type_field = env->GetFieldID(patch_class, "type", "I");
- s_patch_program_id_field = env->GetFieldID(patch_class, "programId", "Ljava/lang/String;");
- s_patch_title_id_field = env->GetFieldID(patch_class, "titleId", "Ljava/lang/String;");
- env->DeleteLocalRef(patch_class);
-
- const jclass double_class = env->FindClass("java/lang/Double");
- s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class));
- s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V");
- s_double_value_field = env->GetFieldID(double_class, "value", "D");
- env->DeleteLocalRef(double_class);
-
- const jclass int_class = env->FindClass("java/lang/Integer");
- s_integer_class = reinterpret_cast<jclass>(env->NewGlobalRef(int_class));
- s_integer_constructor = env->GetMethodID(int_class, "<init>", "(I)V");
- s_integer_value_field = env->GetFieldID(int_class, "value", "I");
- env->DeleteLocalRef(int_class);
-
- const jclass boolean_class = env->FindClass("java/lang/Boolean");
- s_boolean_class = reinterpret_cast<jclass>(env->NewGlobalRef(boolean_class));
- s_boolean_constructor = env->GetMethodID(boolean_class, "<init>", "(Z)V");
- s_boolean_value_field = env->GetFieldID(boolean_class, "value", "Z");
- env->DeleteLocalRef(boolean_class);
-
- // Initialize Android Storage
- Common::FS::Android::RegisterCallbacks(env, s_native_library_class);
-
- // Initialize applets
- SoftwareKeyboard::InitJNI(env);
-
- return JNI_VERSION;
-}
-
-void JNI_OnUnload(JavaVM* vm, void* reserved) {
- JNIEnv* env;
- if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) {
- return;
- }
-
- // UnInitialize Android Storage
- Common::FS::Android::UnRegisterCallbacks();
- env->DeleteGlobalRef(s_native_library_class);
- env->DeleteGlobalRef(s_disk_cache_progress_class);
- env->DeleteGlobalRef(s_load_callback_stage_class);
- env->DeleteGlobalRef(s_game_dir_class);
- env->DeleteGlobalRef(s_game_class);
- env->DeleteGlobalRef(s_string_class);
- env->DeleteGlobalRef(s_pair_class);
- env->DeleteGlobalRef(s_overlay_control_data_class);
- env->DeleteGlobalRef(s_patch_class);
- env->DeleteGlobalRef(s_double_class);
- env->DeleteGlobalRef(s_integer_class);
- env->DeleteGlobalRef(s_boolean_class);
-
- // UnInitialize applets
- SoftwareKeyboard::CleanupJNI(env);
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h
deleted file mode 100644
index 00e48afc0..000000000
--- a/src/android/app/src/main/jni/id_cache.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include <jni.h>
-
-#include "video_core/rasterizer_interface.h"
-
-namespace IDCache {
-
-JNIEnv* GetEnvForThread();
-jclass GetNativeLibraryClass();
-jclass GetDiskCacheProgressClass();
-jclass GetDiskCacheLoadCallbackStageClass();
-jclass GetGameDirClass();
-jmethodID GetGameDirConstructor();
-jmethodID GetExitEmulationActivity();
-jmethodID GetDiskCacheLoadProgress();
-jmethodID GetOnEmulationStarted();
-jmethodID GetOnEmulationStopped();
-jmethodID GetOnProgramChanged();
-
-jclass GetGameClass();
-jmethodID GetGameConstructor();
-jfieldID GetGameTitleField();
-jfieldID GetGamePathField();
-jfieldID GetGameProgramIdField();
-jfieldID GetGameDeveloperField();
-jfieldID GetGameVersionField();
-jfieldID GetGameIsHomebrewField();
-
-jclass GetStringClass();
-jclass GetPairClass();
-jmethodID GetPairConstructor();
-jfieldID GetPairFirstField();
-jfieldID GetPairSecondField();
-
-jclass GetOverlayControlDataClass();
-jmethodID GetOverlayControlDataConstructor();
-jfieldID GetOverlayControlDataIdField();
-jfieldID GetOverlayControlDataEnabledField();
-jfieldID GetOverlayControlDataLandscapePositionField();
-jfieldID GetOverlayControlDataPortraitPositionField();
-jfieldID GetOverlayControlDataFoldablePositionField();
-
-jclass GetPatchClass();
-jmethodID GetPatchConstructor();
-jfieldID GetPatchEnabledField();
-jfieldID GetPatchNameField();
-jfieldID GetPatchVersionField();
-jfieldID GetPatchTypeField();
-jfieldID GetPatchProgramIdField();
-jfieldID GetPatchTitleIdField();
-
-jclass GetDoubleClass();
-jmethodID GetDoubleConstructor();
-jfieldID GetDoubleValueField();
-
-jclass GetIntegerClass();
-jmethodID GetIntegerConstructor();
-jfieldID GetIntegerValueField();
-
-jclass GetBooleanClass();
-jmethodID GetBooleanConstructor();
-jfieldID GetBooleanValueField();
-
-} // namespace IDCache
diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index 654510129..4acc60956 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -20,6 +20,8 @@
#include <frontend_common/content_manager.h>
#include <jni.h>
+#include "common/android/android_common.h"
+#include "common/android/id_cache.h"
#include "common/detached_tasks.h"
#include "common/dynamic_library.h"
#include "common/fs/path_util.h"
@@ -57,8 +59,6 @@
#include "hid_core/frontend/emulated_controller.h"
#include "hid_core/hid_core.h"
#include "hid_core/hid_types.h"
-#include "jni/android_common/android_common.h"
-#include "jni/id_cache.h"
#include "jni/native.h"
#include "video_core/renderer_base.h"
#include "video_core/renderer_vulkan/renderer_vulkan.h"
@@ -228,7 +228,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window, m_vulkan_library);
// Initialize system.
- jauto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>();
+ jauto android_keyboard = std::make_unique<Common::Android::SoftwareKeyboard::AndroidKeyboard>();
m_software_keyboard = android_keyboard.get();
m_system.SetShuttingDown(false);
m_system.ApplySettings();
@@ -411,37 +411,39 @@ void EmulationSession::OnGamepadDisconnectEvent([[maybe_unused]] int index) {
controller->Disconnect();
}
-SoftwareKeyboard::AndroidKeyboard* EmulationSession::SoftwareKeyboard() {
+Common::Android::SoftwareKeyboard::AndroidKeyboard* EmulationSession::SoftwareKeyboard() {
return m_software_keyboard;
}
void EmulationSession::LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress,
int max) {
- JNIEnv* env = IDCache::GetEnvForThread();
- env->CallStaticVoidMethod(IDCache::GetDiskCacheProgressClass(),
- IDCache::GetDiskCacheLoadProgress(), static_cast<jint>(stage),
+ JNIEnv* env = Common::Android::GetEnvForThread();
+ env->CallStaticVoidMethod(Common::Android::GetDiskCacheProgressClass(),
+ Common::Android::GetDiskCacheLoadProgress(), static_cast<jint>(stage),
static_cast<jint>(progress), static_cast<jint>(max));
}
void EmulationSession::OnEmulationStarted() {
- JNIEnv* env = IDCache::GetEnvForThread();
- env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnEmulationStarted());
+ JNIEnv* env = Common::Android::GetEnvForThread();
+ env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(),
+ Common::Android::GetOnEmulationStarted());
}
void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) {
- JNIEnv* env = IDCache::GetEnvForThread();
- env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnEmulationStopped(),
- static_cast<jint>(result));
+ JNIEnv* env = Common::Android::GetEnvForThread();
+ env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(),
+ Common::Android::GetOnEmulationStopped(), static_cast<jint>(result));
}
void EmulationSession::ChangeProgram(std::size_t program_index) {
- JNIEnv* env = IDCache::GetEnvForThread();
- env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnProgramChanged(),
+ JNIEnv* env = Common::Android::GetEnvForThread();
+ env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(),
+ Common::Android::GetOnProgramChanged(),
static_cast<jint>(program_index));
}
u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) {
- auto program_id_string = GetJString(env, jprogramId);
+ auto program_id_string = Common::Android::GetJString(env, jprogramId);
try {
return std::stoull(program_id_string);
} catch (...) {
@@ -491,7 +493,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance,
[[maybe_unused]] jstring j_directory) {
- Common::FS::SetAppDirectory(GetJString(env, j_directory));
+ Common::FS::SetAppDirectory(Common::Android::GetJString(env, j_directory));
}
int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance,
@@ -501,21 +503,22 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
- ToJDouble(env, max), ToJDouble(env, progress));
- return GetJBoolean(env, jwasCancelled);
+ Common::Android::ToJDouble(env, max),
+ Common::Android::ToJDouble(env, progress));
+ return Common::Android::GetJBoolean(env, jwasCancelled);
};
return static_cast<int>(
ContentManager::InstallNSP(EmulationSession::GetInstance().System(),
*EmulationSession::GetInstance().System().GetFilesystem(),
- GetJString(env, j_file), callback));
+ Common::Android::GetJString(env, j_file), callback));
}
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj,
jstring jprogramId,
jstring jupdatePath) {
u64 program_id = EmulationSession::GetProgramId(env, jprogramId);
- std::string updatePath = GetJString(env, jupdatePath);
+ std::string updatePath = Common::Android::GetJString(env, jupdatePath);
std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>(
EmulationSession::GetInstance().System().GetFilesystem()->OpenFile(
updatePath, FileSys::OpenMode::Read));
@@ -538,8 +541,10 @@ void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* e
jstring custom_driver_name,
jstring file_redirect_dir) {
EmulationSession::GetInstance().InitializeGpuDriver(
- GetJString(env, hook_lib_dir), GetJString(env, custom_driver_dir),
- GetJString(env, custom_driver_name), GetJString(env, file_redirect_dir));
+ Common::Android::GetJString(env, hook_lib_dir),
+ Common::Android::GetJString(env, custom_driver_dir),
+ Common::Android::GetJString(env, custom_driver_name),
+ Common::Android::GetJString(env, file_redirect_dir));
}
[[maybe_unused]] static bool CheckKgslPresent() {
@@ -566,7 +571,7 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
const char* file_redirect_dir_{};
int featureFlags{};
- std::string hook_lib_dir = GetJString(env, j_hook_lib_dir);
+ std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir);
auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(),
nullptr, nullptr, file_redirect_dir_, nullptr);
auto driver_library = std::make_shared<Common::DynamicLibrary>(handle);
@@ -587,9 +592,10 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version),
VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version));
- jobjectArray j_driver_info =
- env->NewObjectArray(2, IDCache::GetStringClass(), ToJString(env, version_string));
- env->SetObjectArrayElement(j_driver_info, 1, ToJString(env, device.GetDriverName()));
+ jobjectArray j_driver_info = env->NewObjectArray(
+ 2, Common::Android::GetStringClass(), Common::Android::ToJString(env, version_string));
+ env->SetObjectArrayElement(j_driver_info, 1,
+ Common::Android::ToJString(env, device.GetDriverName()));
return j_driver_info;
}
@@ -742,15 +748,15 @@ jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jcl
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) {
if (Settings::IsNceEnabled()) {
- return ToJString(env, "NCE");
+ return Common::Android::ToJString(env, "NCE");
}
- return ToJString(env, "JIT");
+ return Common::Android::ToJString(env, "JIT");
}
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) {
- return ToJString(env,
- EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor());
+ return Common::Android::ToJString(
+ env, EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor());
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) {
@@ -764,13 +770,14 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj
void Java_org_yuzu_yuzu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path,
jint j_program_index,
jboolean j_frontend_initiated) {
- const std::string path = GetJString(env, j_path);
+ const std::string path = Common::Android::GetJString(env, j_path);
const Core::SystemResultStatus result{
RunEmulation(path, j_program_index, j_frontend_initiated)};
if (result != Core::SystemResultStatus::Success) {
- env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
- IDCache::GetExitEmulationActivity(), static_cast<int>(result));
+ env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(),
+ Common::Android::GetExitEmulationActivity(),
+ static_cast<int>(result));
}
}
@@ -781,7 +788,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass cla
void Java_org_yuzu_yuzu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz,
jstring j_text) {
- const std::u16string input = Common::UTF8ToUTF16(GetJString(env, j_text));
+ const std::u16string input = Common::UTF8ToUTF16(Common::Android::GetJString(env, j_text));
EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardText(input);
}
@@ -815,16 +822,16 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j
auto bis_system =
EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents();
if (!bis_system) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
auto applet_nca =
bis_system->GetEntry(static_cast<u64>(jid), FileSys::ContentRecordType::Program);
if (!applet_nca) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
- return ToJString(env, applet_nca->GetFullPath());
+ return Common::Android::ToJString(env, applet_nca->GetFullPath());
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz,
@@ -857,7 +864,7 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env,
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj,
jstring jpath,
jstring jprogramId) {
- const auto path = GetJString(env, jpath);
+ const auto path = Common::Android::GetJString(env, jpath);
const auto vFile =
Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path);
if (vFile == nullptr) {
@@ -875,14 +882,15 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env
auto patches = pm.GetPatches(update_raw);
jobjectArray jpatchArray =
- env->NewObjectArray(patches.size(), IDCache::GetPatchClass(), nullptr);
+ env->NewObjectArray(patches.size(), Common::Android::GetPatchClass(), nullptr);
int i = 0;
for (const auto& patch : patches) {
jobject jpatch = env->NewObject(
- IDCache::GetPatchClass(), IDCache::GetPatchConstructor(), patch.enabled,
- ToJString(env, patch.name), ToJString(env, patch.version),
- static_cast<jint>(patch.type), ToJString(env, std::to_string(patch.program_id)),
- ToJString(env, std::to_string(patch.title_id)));
+ Common::Android::GetPatchClass(), Common::Android::GetPatchConstructor(), patch.enabled,
+ Common::Android::ToJString(env, patch.name),
+ Common::Android::ToJString(env, patch.version), static_cast<jint>(patch.type),
+ Common::Android::ToJString(env, std::to_string(patch.program_id)),
+ Common::Android::ToJString(env, std::to_string(patch.title_id)));
env->SetObjectArrayElement(jpatchArray, i, jpatch);
++i;
}
@@ -906,7 +914,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj,
jstring jname) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(),
- program_id, GetJString(env, jname));
+ program_id, Common::Android::GetJString(env, jname));
}
jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env,
@@ -917,17 +925,18 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEn
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
- ToJDouble(env, max), ToJDouble(env, progress));
- return GetJBoolean(env, jwasCancelled);
+ Common::Android::ToJDouble(env, max),
+ Common::Android::ToJDouble(env, progress));
+ return Common::Android::GetJBoolean(env, jwasCancelled);
};
auto& session = EmulationSession::GetInstance();
std::vector<std::string> result = ContentManager::VerifyInstalledContents(
session.System(), *session.GetContentProvider(), callback);
- jobjectArray jresult =
- env->NewObjectArray(result.size(), IDCache::GetStringClass(), ToJString(env, ""));
+ jobjectArray jresult = env->NewObjectArray(result.size(), Common::Android::GetStringClass(),
+ Common::Android::ToJString(env, ""));
for (size_t i = 0; i < result.size(); ++i) {
- env->SetObjectArrayElement(jresult, i, ToJString(env, result[i]));
+ env->SetObjectArrayElement(jresult, i, Common::Android::ToJString(env, result[i]));
}
return jresult;
}
@@ -939,19 +948,20 @@ jint Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobje
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) {
auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod,
- ToJDouble(env, max), ToJDouble(env, progress));
- return GetJBoolean(env, jwasCancelled);
+ Common::Android::ToJDouble(env, max),
+ Common::Android::ToJDouble(env, progress));
+ return Common::Android::GetJBoolean(env, jwasCancelled);
};
auto& session = EmulationSession::GetInstance();
- return static_cast<jint>(
- ContentManager::VerifyGameContents(session.System(), GetJString(env, jpath), callback));
+ return static_cast<jint>(ContentManager::VerifyGameContents(
+ session.System(), Common::Android::GetJString(env, jpath), callback));
}
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj,
jstring jprogramId) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
if (program_id == 0) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
auto& system = EmulationSession::GetInstance().System();
@@ -968,7 +978,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j
const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath(
{}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData,
program_id, user_id->AsU128(), 0);
- return ToJString(env, user_save_data_path);
+ return Common::Android::ToJString(env, user_save_data_path);
}
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env,
@@ -981,12 +991,13 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIE
const auto user_save_data_root =
FileSys::SaveDataFactory::GetUserGameSaveDataRoot(user_id->AsU128(), jfuture);
- return ToJString(env, user_save_data_root);
+ return Common::Android::ToJString(env, user_save_data_root);
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj,
jstring jpath) {
- EmulationSession::GetInstance().ConfigureFilesystemProvider(GetJString(env, jpath));
+ EmulationSession::GetInstance().ConfigureFilesystemProvider(
+ Common::Android::GetJString(env, jpath));
}
void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) {
diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h
index e49d4e015..47936e305 100644
--- a/src/android/app/src/main/jni/native.h
+++ b/src/android/app/src/main/jni/native.h
@@ -2,13 +2,13 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <android/native_window_jni.h>
+#include "common/android/applets/software_keyboard.h"
#include "common/detached_tasks.h"
#include "core/core.h"
#include "core/file_sys/registered_cache.h"
#include "core/hle/service/acc/profile_manager.h"
#include "core/perf_stats.h"
#include "frontend_common/content_manager.h"
-#include "jni/applets/software_keyboard.h"
#include "jni/emu_window/emu_window.h"
#include "video_core/rasterizer_interface.h"
@@ -54,7 +54,7 @@ public:
void SetDeviceType([[maybe_unused]] int index, int type);
void OnGamepadConnectEvent([[maybe_unused]] int index);
void OnGamepadDisconnectEvent([[maybe_unused]] int index);
- SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard();
+ Common::Android::SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard();
static void OnEmulationStarted();
@@ -79,7 +79,7 @@ private:
Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};
std::atomic<bool> m_is_running = false;
std::atomic<bool> m_is_paused = false;
- SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
+ Common::Android::SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
int m_applet_id{1};
diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp
index c6c3343dc..8ae10fbc7 100644
--- a/src/android/app/src/main/jni/native_config.cpp
+++ b/src/android/app/src/main/jni/native_config.cpp
@@ -8,11 +8,11 @@
#include "android_config.h"
#include "android_settings.h"
+#include "common/android/android_common.h"
+#include "common/android/id_cache.h"
#include "common/logging/log.h"
#include "common/settings.h"
#include "frontend_common/config.h"
-#include "jni/android_common/android_common.h"
-#include "jni/id_cache.h"
#include "native.h"
std::unique_ptr<AndroidConfig> global_config;
@@ -20,7 +20,7 @@ std::unique_ptr<AndroidConfig> per_game_config;
template <typename T>
Settings::Setting<T>* getSetting(JNIEnv* env, jstring jkey) {
- auto key = GetJString(env, jkey);
+ auto key = Common::Android::GetJString(env, jkey);
auto basic_setting = Settings::values.linkage.by_key[key];
if (basic_setting != 0) {
return static_cast<Settings::Setting<T>*>(basic_setting);
@@ -55,7 +55,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv*
jstring jprogramId,
jstring jfileName) {
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
- auto file_name = GetJString(env, jfileName);
+ auto file_name = Common::Android::GetJString(env, jfileName);
const auto config_file_name = program_id == 0 ? file_name : fmt::format("{:016X}", program_id);
per_game_config =
std::make_unique<AndroidConfig>(config_file_name, Config::ConfigType::PerGameConfig);
@@ -186,9 +186,9 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobjec
jboolean needGlobal) {
auto setting = getSetting<std::string>(env, jkey);
if (setting == nullptr) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
- return ToJString(env, setting->GetValue(static_cast<bool>(needGlobal)));
+ return Common::Android::ToJString(env, setting->GetValue(static_cast<bool>(needGlobal)));
}
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey,
@@ -198,7 +198,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o
return;
}
- setting->SetValue(GetJString(env, value));
+ setting->SetValue(Common::Android::GetJString(env, value));
}
jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj,
@@ -214,13 +214,13 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e
jstring jkey) {
auto setting = getSetting<std::string>(env, jkey);
if (setting == nullptr) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
if (setting->PairedSetting() == nullptr) {
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
- return ToJString(env, setting->PairedSetting()->GetLabel());
+ return Common::Android::ToJString(env, setting->PairedSetting()->GetLabel());
}
jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj,
@@ -262,21 +262,21 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* en
jstring jkey) {
auto setting = getSetting<std::string>(env, jkey);
if (setting != nullptr) {
- return ToJString(env, setting->DefaultToString());
+ return Common::Android::ToJString(env, setting->DefaultToString());
}
- return ToJString(env, "");
+ return Common::Android::ToJString(env, "");
}
jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) {
- jclass gameDirClass = IDCache::GetGameDirClass();
- jmethodID gameDirConstructor = IDCache::GetGameDirConstructor();
+ jclass gameDirClass = Common::Android::GetGameDirClass();
+ jmethodID gameDirConstructor = Common::Android::GetGameDirConstructor();
jobjectArray jgameDirArray =
env->NewObjectArray(AndroidSettings::values.game_dirs.size(), gameDirClass, nullptr);
for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) {
- jobject jgameDir =
- env->NewObject(gameDirClass, gameDirConstructor,
- ToJString(env, AndroidSettings::values.game_dirs[i].path),
- static_cast<jboolean>(AndroidSettings::values.game_dirs[i].deep_scan));
+ jobject jgameDir = env->NewObject(
+ gameDirClass, gameDirConstructor,
+ Common::Android::ToJString(env, AndroidSettings::values.game_dirs[i].path),
+ static_cast<jboolean>(AndroidSettings::values.game_dirs[i].deep_scan));
env->SetObjectArrayElement(jgameDirArray, i, jgameDir);
}
return jgameDirArray;
@@ -292,14 +292,14 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject
}
jobject dir = env->GetObjectArrayElement(gameDirs, 0);
- jclass gameDirClass = IDCache::GetGameDirClass();
+ jclass gameDirClass = Common::Android::GetGameDirClass();
jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;");
jfieldID deepScanBooleanField = env->GetFieldID(gameDirClass, "deepScan", "Z");
for (int i = 0; i < size; ++i) {
dir = env->GetObjectArrayElement(gameDirs, i);
jstring juriString = static_cast<jstring>(env->GetObjectField(dir, uriStringField));
jboolean jdeepScanBoolean = env->GetBooleanField(dir, deepScanBooleanField);
- std::string uriString = GetJString(env, juriString);
+ std::string uriString = Common::Android::GetJString(env, juriString);
AndroidSettings::values.game_dirs.push_back(
AndroidSettings::GameDir{uriString, static_cast<bool>(jdeepScanBoolean)});
}
@@ -307,13 +307,13 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject
void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj,
jobject gameDir) {
- jclass gameDirClass = IDCache::GetGameDirClass();
+ jclass gameDirClass = Common::Android::GetGameDirClass();
jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;");
jfieldID deepScanBooleanField = env->GetFieldID(gameDirClass, "deepScan", "Z");
jstring juriString = static_cast<jstring>(env->GetObjectField(gameDir, uriStringField));
jboolean jdeepScanBoolean = env->GetBooleanField(gameDir, deepScanBooleanField);
- std::string uriString = GetJString(env, juriString);
+ std::string uriString = Common::Android::GetJString(env, juriString);
AndroidSettings::values.game_dirs.push_back(
AndroidSettings::GameDir{uriString, static_cast<bool>(jdeepScanBoolean)});
}
@@ -323,9 +323,11 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv
auto program_id = EmulationSession::GetProgramId(env, jprogramId);
auto& disabledAddons = Settings::values.disabled_addons[program_id];
jobjectArray jdisabledAddonsArray =
- env->NewObjectArray(disabledAddons.size(), IDCache::GetStringClass(), ToJString(env, ""));
+ env->NewObjectArray(disabledAddons.size(), Common::Android::GetStringClass(),
+ Common::Android::ToJString(env, ""));
for (size_t i = 0; i < disabledAddons.size(); ++i) {
- env->SetObjectArrayElement(jdisabledAddonsArray, i, ToJString(env, disabledAddons[i]));
+ env->SetObjectArrayElement(jdisabledAddonsArray, i,
+ Common::Android::ToJString(env, disabledAddons[i]));
}
return jdisabledAddonsArray;
}
@@ -339,7 +341,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, j
const int size = env->GetArrayLength(jdisabledAddons);
for (int i = 0; i < size; ++i) {
auto jaddon = static_cast<jstring>(env->GetObjectArrayElement(jdisabledAddons, i));
- disabled_addons.push_back(GetJString(env, jaddon));
+ disabled_addons.push_back(Common::Android::GetJString(env, jaddon));
}
Settings::values.disabled_addons[program_id] = disabled_addons;
}
@@ -348,26 +350,27 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getOverlayControlData(JN
jobject obj) {
jobjectArray joverlayControlDataArray =
env->NewObjectArray(AndroidSettings::values.overlay_control_data.size(),
- IDCache::GetOverlayControlDataClass(), nullptr);
+ Common::Android::GetOverlayControlDataClass(), nullptr);
for (size_t i = 0; i < AndroidSettings::values.overlay_control_data.size(); ++i) {
const auto& control_data = AndroidSettings::values.overlay_control_data[i];
jobject jlandscapePosition =
- env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
- ToJDouble(env, control_data.landscape_position.first),
- ToJDouble(env, control_data.landscape_position.second));
+ env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(),
+ Common::Android::ToJDouble(env, control_data.landscape_position.first),
+ Common::Android::ToJDouble(env, control_data.landscape_position.second));
jobject jportraitPosition =
- env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
- ToJDouble(env, control_data.portrait_position.first),
- ToJDouble(env, control_data.portrait_position.second));
+ env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(),
+ Common::Android::ToJDouble(env, control_data.portrait_position.first),
+ Common::Android::ToJDouble(env, control_data.portrait_position.second));
jobject jfoldablePosition =
- env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(),
- ToJDouble(env, control_data.foldable_position.first),
- ToJDouble(env, control_data.foldable_position.second));
-
- jobject jcontrolData = env->NewObject(
- IDCache::GetOverlayControlDataClass(), IDCache::GetOverlayControlDataConstructor(),
- ToJString(env, control_data.id), control_data.enabled, jlandscapePosition,
- jportraitPosition, jfoldablePosition);
+ env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(),
+ Common::Android::ToJDouble(env, control_data.foldable_position.first),
+ Common::Android::ToJDouble(env, control_data.foldable_position.second));
+
+ jobject jcontrolData =
+ env->NewObject(Common::Android::GetOverlayControlDataClass(),
+ Common::Android::GetOverlayControlDataConstructor(),
+ Common::Android::ToJString(env, control_data.id), control_data.enabled,
+ jlandscapePosition, jportraitPosition, jfoldablePosition);
env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData);
}
return joverlayControlDataArray;
@@ -384,33 +387,41 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setOverlayControlData(
for (int i = 0; i < size; ++i) {
jobject joverlayControlData = env->GetObjectArrayElement(joverlayControlDataArray, i);
- jstring jidString = static_cast<jstring>(
- env->GetObjectField(joverlayControlData, IDCache::GetOverlayControlDataIdField()));
+ jstring jidString = static_cast<jstring>(env->GetObjectField(
+ joverlayControlData, Common::Android::GetOverlayControlDataIdField()));
bool enabled = static_cast<bool>(env->GetBooleanField(
- joverlayControlData, IDCache::GetOverlayControlDataEnabledField()));
+ joverlayControlData, Common::Android::GetOverlayControlDataEnabledField()));
jobject jlandscapePosition = env->GetObjectField(
- joverlayControlData, IDCache::GetOverlayControlDataLandscapePositionField());
+ joverlayControlData, Common::Android::GetOverlayControlDataLandscapePositionField());
std::pair<double, double> landscape_position = std::make_pair(
- GetJDouble(env, env->GetObjectField(jlandscapePosition, IDCache::GetPairFirstField())),
- GetJDouble(env,
- env->GetObjectField(jlandscapePosition, IDCache::GetPairSecondField())));
+ Common::Android::GetJDouble(
+ env, env->GetObjectField(jlandscapePosition, Common::Android::GetPairFirstField())),
+ Common::Android::GetJDouble(
+ env,
+ env->GetObjectField(jlandscapePosition, Common::Android::GetPairSecondField())));
jobject jportraitPosition = env->GetObjectField(
- joverlayControlData, IDCache::GetOverlayControlDataPortraitPositionField());
+ joverlayControlData, Common::Android::GetOverlayControlDataPortraitPositionField());
std::pair<double, double> portrait_position = std::make_pair(
- GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairFirstField())),
- GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairSecondField())));
+ Common::Android::GetJDouble(
+ env, env->GetObjectField(jportraitPosition, Common::Android::GetPairFirstField())),
+ Common::Android::GetJDouble(
+ env,
+ env->GetObjectField(jportraitPosition, Common::Android::GetPairSecondField())));
jobject jfoldablePosition = env->GetObjectField(
- joverlayControlData, IDCache::GetOverlayControlDataFoldablePositionField());
+ joverlayControlData, Common::Android::GetOverlayControlDataFoldablePositionField());
std::pair<double, double> foldable_position = std::make_pair(
- GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairFirstField())),
- GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairSecondField())));
+ Common::Android::GetJDouble(
+ env, env->GetObjectField(jfoldablePosition, Common::Android::GetPairFirstField())),
+ Common::Android::GetJDouble(
+ env,
+ env->GetObjectField(jfoldablePosition, Common::Android::GetPairSecondField())));
AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{
- GetJString(env, jidString), enabled, landscape_position, portrait_position,
- foldable_position});
+ Common::Android::GetJString(env, jidString), enabled, landscape_position,
+ portrait_position, foldable_position});
}
}
diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp
index 33d691dc8..95dd1f057 100644
--- a/src/android/app/src/main/jni/native_log.cpp
+++ b/src/android/app/src/main/jni/native_log.cpp
@@ -1,31 +1,30 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include <common/android/android_common.h>
#include <common/logging/log.h>
#include <jni.h>
-#include "android_common/android_common.h"
-
extern "C" {
void Java_org_yuzu_yuzu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) {
- LOG_DEBUG(Frontend, "{}", GetJString(env, jmessage));
+ LOG_DEBUG(Frontend, "{}", Common::Android::GetJString(env, jmessage));
}
void Java_org_yuzu_yuzu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) {
- LOG_WARNING(Frontend, "{}", GetJString(env, jmessage));
+ LOG_WARNING(Frontend, "{}", Common::Android::GetJString(env, jmessage));
}
void Java_org_yuzu_yuzu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) {
- LOG_INFO(Frontend, "{}", GetJString(env, jmessage));
+ LOG_INFO(Frontend, "{}", Common::Android::GetJString(env, jmessage));
}
void Java_org_yuzu_yuzu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) {
- LOG_ERROR(Frontend, "{}", GetJString(env, jmessage));
+ LOG_ERROR(Frontend, "{}", Common::Android::GetJString(env, jmessage));
}
void Java_org_yuzu_yuzu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) {
- LOG_CRITICAL(Frontend, "{}", GetJString(env, jmessage));
+ LOG_CRITICAL(Frontend, "{}", Common::Android::GetJString(env, jmessage));
}
} // extern "C"
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 @@
android:id="@+id/overlay_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_marginHorizontal="20dp"
android:fitsSystemWindows="true">
<com.google.android.material.textview.MaterialTextView
@@ -150,7 +151,19 @@
android:layout_gravity="left"
android:clickable="false"
android:focusable="false"
- android:paddingHorizontal="20dp"
+ android:textColor="@android:color/white"
+ android:shadowColor="@android:color/black"
+ android:shadowRadius="3"
+ tools:ignore="RtlHardcoded" />
+
+ <com.google.android.material.textview.MaterialTextView
+ android:id="@+id/show_thermals_text"
+ style="@style/TextAppearance.Material3.BodySmall"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="right"
+ android:clickable="false"
+ android:focusable="false"
android:textColor="@android:color/white"
android:shadowColor="@android:color/black"
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 @@
android:checkable="true" />
<item
+ android:id="@+id/thermal_indicator"
+ android:title="@string/emulation_thermal_indicator"
+ android:checkable="true" />
+
+ <item
android:id="@+id/menu_edit_overlay"
android:title="@string/emulation_touch_overlay_edit" />
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 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
- <string name="emulation_notification_channel_name">المحاكي نشط</string>
- <string name="emulation_notification_channel_description">اظهار اشعار دائم عندما يكون المحاكي نشطاً</string>
- <string name="emulation_notification_running">يوزو قيد التشغيل</string>
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
<string name="notice_notification_channel_description">اظهار اشعار عند حصول اي مشكلة.</string>
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار</string>
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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">ئیمولەیشن کارایە</string>
- <string name="emulation_notification_channel_description">ئاگادارکردنەوەیەکی بەردەوام نیشان دەدات کاتێک ئیمولەیشن کاردەکات.</string>
- <string name="emulation_notification_running">یوزو کاردەکات</string>
<string name="notice_notification_channel_name">ئاگاداری و هەڵەکان</string>
<string name="notice_notification_channel_description">ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت.</string>
<string name="notification_permission_not_granted">مۆڵەتی ئاگادارکردنەوە نەدراوە!</string>
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 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
- <string name="emulation_notification_channel_name">Emulace je aktivní</string>
<string name="notice_notification_channel_name">Upozornění a chyby</string>
<string name="notice_notification_channel_description">Ukáže oznámení v případě chyby.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emulation ist aktiv</string>
- <string name="emulation_notification_channel_description">Zeigt eine dauerhafte Benachrichtigung an, wenn die Emulation läuft.</string>
- <string name="emulation_notification_running">yuzu läuft</string>
<string name="notice_notification_channel_name">Hinweise und Fehler</string>
<string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emulación activa</string>
- <string name="emulation_notification_channel_description">Muestra una notificación persistente cuando la emulación está activa.</string>
- <string name="emulation_notification_running">yuzu está ejecutándose</string>
<string name="notice_notification_channel_name">Avisos y errores</string>
<string name="notice_notification_channel_description">Mostrar notificaciones cuándo algo vaya mal.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">L\'émulation est active</string>
- <string name="emulation_notification_channel_description">Affiche une notification persistante lorsque l\'émulation est en cours d\'exécution.</string>
- <string name="emulation_notification_running">yuzu est en cours d\'exécution</string>
<string name="notice_notification_channel_name">Avis et erreurs</string>
<string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">אמולציה פעילה</string>
- <string name="emulation_notification_channel_description">מציג התראה מתמשכת כאשר האמולציה פועלת.</string>
- <string name="emulation_notification_running">yuzu רץ</string>
<string name="notice_notification_channel_name">התראות ותקלות</string>
<string name="notice_notification_channel_description">מציג התראות כאשר משהו הולך לא כשורה.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emuláció aktív</string>
- <string name="emulation_notification_channel_description">Állandó értesítést jelenít meg, amíg az emuláció fut.</string>
- <string name="emulation_notification_running">A yuzu fut</string>
<string name="notice_notification_channel_name">Megjegyzések és hibák</string>
<string name="notice_notification_channel_description">Értesítések megjelenítése, ha valami rosszul sül el.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">L\'emulatore è attivo</string>
- <string name="emulation_notification_channel_description">Mostra una notifica persistente quando l\'emulatore è in esecuzione.</string>
- <string name="emulation_notification_running">yuzu è in esecuzione</string>
<string name="notice_notification_channel_name">Avvisi ed errori</string>
<string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">エミュレーションが有効です</string>
- <string name="emulation_notification_channel_description">エミュレーションの実行中に常設通知を表示します。</string>
- <string name="emulation_notification_running">yuzu は実行中です</string>
<string name="notice_notification_channel_name">通知とエラー</string>
<string name="notice_notification_channel_description">問題の発生時に通知を表示します。</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">에뮬레이션이 활성화됨</string>
- <string name="emulation_notification_channel_description">에뮬레이션이 실행 중일 때 지속적으로 알림을 표시합니다.</string>
- <string name="emulation_notification_running">yuzu가 실행 중입니다.</string>
<string name="notice_notification_channel_name">알림 및 오류</string>
<string name="notice_notification_channel_description">문제가 발생하면 알림을 표시합니다.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emulering er aktiv</string>
- <string name="emulation_notification_channel_description">Viser et vedvarende varsel når emuleringen kjører.</string>
- <string name="emulation_notification_running">Yuzu kjører</string>
<string name="notice_notification_channel_name">Merknader og feil</string>
<string name="notice_notification_channel_description">Viser varsler når noe går galt.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emulacja jest uruchomiona</string>
- <string name="emulation_notification_channel_description">Pokaż trwałe powiadomienie gdy emulacja jest uruchomiona.</string>
- <string name="emulation_notification_running">yuzu jest uruchomiony</string>
<string name="notice_notification_channel_name">Powiadomienia błędy</string>
<string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">A emulação está Ativa</string>
- <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação estiver em andamento.</string>
- <string name="emulation_notification_running">O Yuzu está em execução </string>
<string name="notice_notification_channel_name">Notificações e erros</string>
<string name="notice_notification_channel_description">Mostra notificações quando algo dá errado.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Emulação está Ativa</string>
- <string name="emulation_notification_channel_description">Mostra uma notificação permanente enquanto a emulação está a correr.</string>
- <string name="emulation_notification_running">Yuzu está em execução </string>
<string name="notice_notification_channel_name">Notificações e erros</string>
<string name="notice_notification_channel_description">Mostra notificações quendo algo corre mal.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Эмуляция активна</string>
- <string name="emulation_notification_channel_description">Показывает постоянное уведомление, когда запущена эмуляция.</string>
- <string name="emulation_notification_running">yuzu запущен</string>
<string name="notice_notification_channel_name">Уведомления и ошибки</string>
<string name="notice_notification_channel_description">Показывать уведомления, когда что-то пошло не так</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Емуляція активна</string>
- <string name="emulation_notification_channel_description">Показує постійне сповіщення, коли запущено емуляцію.</string>
- <string name="emulation_notification_running">yuzu запущено</string>
<string name="notice_notification_channel_name">Сповіщення та помилки</string>
<string name="notice_notification_channel_description">Показувати сповіщення, коли щось пішло не так</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">Giả lập đang chạy</string>
- <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>
- <string name="emulation_notification_running">yuzu đang chạy</string>
<string name="notice_notification_channel_name">Thông báo và lỗi</string>
<string name="notice_notification_channel_description">Hiển thị thông báo khi có sự cố xảy ra.</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">正在进行模拟</string>
- <string name="emulation_notification_channel_description">在模拟运行时显示持久通知。</string>
- <string name="emulation_notification_running">yuzu 正在运行</string>
<string name="notice_notification_channel_name">通知及错误提醒</string>
<string name="notice_notification_channel_description">当发生错误时显示通知。</string>
<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 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<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>
- <string name="emulation_notification_channel_name">模擬進行中</string>
- <string name="emulation_notification_channel_description">在模擬執行時顯示持續通知。</string>
- <string name="emulation_notification_running">yuzu 正在執行</string>
<string name="notice_notification_channel_name">通知和錯誤</string>
<string name="notice_notification_channel_description">發生錯誤時顯示通知。</string>
<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 @@
<!-- General application strings -->
<string name="app_name" translatable="false">yuzu</string>
<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>
- <string name="emulation_notification_channel_name">Emulation is Active</string>
- <string name="emulation_notification_channel_id" translatable="false">emulationIsActive</string>
- <string name="emulation_notification_channel_description">Shows a persistent notification when emulation is running.</string>
- <string name="emulation_notification_running">yuzu is running</string>
<string name="notice_notification_channel_name">Notices and errors</string>
<string name="notice_notification_channel_id" translatable="false">noticesAndErrors</string>
<string name="notice_notification_channel_description">Shows notifications when something goes wrong.</string>
@@ -380,6 +376,7 @@
<string name="emulation_exit">Exit emulation</string>
<string name="emulation_done">Done</string>
<string name="emulation_fps_counter">FPS counter</string>
+ <string name="emulation_thermal_indicator">Thermal indicator</string>
<string name="emulation_toggle_controls">Toggle controls</string>
<string name="emulation_rel_stick_center">Relative stick center</string>
<string name="emulation_dpad_slide">D-pad slide</string>