diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
index 554369a45..2fa77aaa4 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
@@ -220,14 +220,6 @@ object NativeLibrary {
val title: String
val message: String
when (error) {
- CoreError.ErrorSystemFiles -> {
- title = emulationActivity.getString(R.string.system_archive_not_found)
- message = emulationActivity.getString(
- R.string.system_archive_not_found_message,
- details.ifEmpty { emulationActivity.getString(R.string.system_archive_general) }
- )
- }
-
CoreError.ErrorSavestate -> {
title = emulationActivity.getString(R.string.save_load_error)
message = details
@@ -410,7 +402,6 @@ object NativeLibrary {
const val ErrorLoader = 4
const val ErrorLoader_ErrorEncrypted = 5
const val ErrorLoader_ErrorInvalidFormat = 6
- const val ErrorSystemFiles = 7
const val ShutdownRequested = 11
const val ErrorUnknown = 12
@@ -629,7 +620,6 @@ object NativeLibrary {
}
enum class CoreError {
- ErrorSystemFiles,
ErrorSavestate,
ErrorUnknown
}
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/DownloadSystemFilesDialogFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/DownloadSystemFilesDialogFragment.kt
deleted file mode 100644
index 3f5abfd14..000000000
--- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/DownloadSystemFilesDialogFragment.kt
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2023 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-package org.citra.citra_emu.fragments
-
-import android.app.Dialog
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.appcompat.app.AlertDialog
-import androidx.fragment.app.DialogFragment
-import androidx.fragment.app.activityViewModels
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import kotlinx.coroutines.flow.collect
-import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.launch
-import org.citra.citra_emu.NativeLibrary.InstallStatus
-import org.citra.citra_emu.R
-import org.citra.citra_emu.databinding.DialogProgressBarBinding
-import org.citra.citra_emu.viewmodel.GamesViewModel
-import org.citra.citra_emu.viewmodel.SystemFilesViewModel
-
-class DownloadSystemFilesDialogFragment : DialogFragment() {
- private var _binding: DialogProgressBarBinding? = null
- private val binding get() = _binding!!
-
- private val downloadViewModel: SystemFilesViewModel by activityViewModels()
- private val gamesViewModel: GamesViewModel by activityViewModels()
-
- private lateinit var titles: LongArray
-
- override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- _binding = DialogProgressBarBinding.inflate(layoutInflater)
-
- titles = requireArguments().getLongArray(TITLES)!!
-
- binding.progressText.visibility = View.GONE
-
- binding.progressBar.min = 0
- binding.progressBar.max = titles.size
- if (downloadViewModel.isDownloading.value != true) {
- binding.progressBar.progress = 0
- }
-
- isCancelable = false
- return MaterialAlertDialogBuilder(requireContext())
- .setView(binding.root)
- .setTitle(R.string.downloading_files)
- .setMessage(R.string.downloading_files_description)
- .setNegativeButton(android.R.string.cancel, null)
- .create()
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- return binding.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- viewLifecycleOwner.lifecycleScope.apply {
- launch {
- repeatOnLifecycle(Lifecycle.State.CREATED) {
- downloadViewModel.progress.collectLatest { binding.progressBar.progress = it }
- }
- }
- launch {
- repeatOnLifecycle(Lifecycle.State.CREATED) {
- downloadViewModel.result.collect {
- when (it) {
- InstallStatus.Success -> {
- downloadViewModel.clear()
- dismiss()
- MessageDialogFragment.newInstance(R.string.download_success, 0)
- .show(requireActivity().supportFragmentManager, MessageDialogFragment.TAG)
- gamesViewModel.setShouldSwapData(true)
- }
-
- InstallStatus.ErrorFailedToOpenFile,
- InstallStatus.ErrorEncrypted,
- InstallStatus.ErrorFileNotFound,
- InstallStatus.ErrorInvalid,
- InstallStatus.ErrorAborted -> {
- downloadViewModel.clear()
- dismiss()
- MessageDialogFragment.newInstance(
- R.string.download_failed,
- R.string.download_failed_description
- ).show(requireActivity().supportFragmentManager, MessageDialogFragment.TAG)
- gamesViewModel.setShouldSwapData(true)
- }
-
- InstallStatus.Cancelled -> {
- downloadViewModel.clear()
- dismiss()
- MessageDialogFragment.newInstance(
- R.string.download_cancelled,
- R.string.download_cancelled_description
- ).show(requireActivity().supportFragmentManager, MessageDialogFragment.TAG)
- }
-
- // Do nothing on null
- else -> {}
- }
- }
- }
- }
- }
-
- // Consider using WorkManager here. While the home menu can only really amount to
- // about 150MBs, this could be a problem on inconsistent networks
- downloadViewModel.download(titles)
- }
-
- override fun onResume() {
- super.onResume()
- val alertDialog = dialog as AlertDialog
- val negativeButton = alertDialog.getButton(Dialog.BUTTON_NEGATIVE)
- negativeButton.setOnClickListener {
- downloadViewModel.cancel()
- dialog?.setTitle(R.string.cancelling)
- binding.progressBar.isIndeterminate = true
- }
- }
-
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
-
- companion object {
- const val TAG = "DownloadSystemFilesDialogFragment"
-
- const val TITLES = "Titles"
-
- fun newInstance(titles: LongArray): DownloadSystemFilesDialogFragment {
- val dialog = DownloadSystemFilesDialogFragment()
- val args = Bundle()
- args.putLongArray(TITLES, titles)
- dialog.arguments = args
- return dialog
- }
- }
-}
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt
index 32f6a56b1..34d8ef4ca 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt
@@ -76,16 +76,6 @@ class HomeSettingsFragment : Fragment() {
R.drawable.ic_settings,
{ SettingsActivity.launch(requireContext(), SettingsFile.FILE_NAME_CONFIG, "") }
),
- /*HomeSetting(
- R.string.system_files,
- R.string.system_files_description,
- R.drawable.ic_system_update,
- {
- exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
- parentFragmentManager.primaryNavigationFragment?.findNavController()
- ?.navigate(R.id.action_homeSettingsFragment_to_systemFilesFragment)
- }
- ),*/
HomeSetting(
R.string.install_game_content,
R.string.install_game_content_description,
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SystemFilesFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SystemFilesFragment.kt
deleted file mode 100644
index 812218375..000000000
--- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SystemFilesFragment.kt
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2023 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-package org.citra.citra_emu.fragments
-
-import android.content.res.Resources
-import android.os.Bundle
-import android.text.Html
-import android.text.method.LinkMovementMethod
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.AdapterView
-import android.widget.ArrayAdapter
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import androidx.core.view.updatePadding
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.navigation.findNavController
-import androidx.preference.PreferenceManager
-import com.google.android.material.textfield.MaterialAutoCompleteTextView
-import com.google.android.material.transition.MaterialSharedAxis
-import kotlinx.coroutines.launch
-import org.citra.citra_emu.CitraApplication
-import org.citra.citra_emu.HomeNavigationDirections
-import org.citra.citra_emu.NativeLibrary
-import org.citra.citra_emu.R
-import org.citra.citra_emu.activities.EmulationActivity
-import org.citra.citra_emu.databinding.FragmentSystemFilesBinding
-import org.citra.citra_emu.features.settings.model.Settings
-import org.citra.citra_emu.model.Game
-import org.citra.citra_emu.utils.SystemSaveGame
-import org.citra.citra_emu.viewmodel.GamesViewModel
-import org.citra.citra_emu.viewmodel.HomeViewModel
-import org.citra.citra_emu.viewmodel.SystemFilesViewModel
-import org.citra.citra_emu.vr.VrActivity
-
-class SystemFilesFragment : Fragment() {
- private var _binding: FragmentSystemFilesBinding? = null
- private val binding get() = _binding!!
-
- private val homeViewModel: HomeViewModel by activityViewModels()
- private val systemFilesViewModel: SystemFilesViewModel by activityViewModels()
- private val gamesViewModel: GamesViewModel by activityViewModels()
-
- private lateinit var regionValues: IntArray
-
- private val systemTypeDropdown = DropdownItem(R.array.systemFileTypeValues)
- private val systemRegionDropdown = DropdownItem(R.array.systemFileRegionValues)
-
- private val SYS_TYPE = "SysType"
- private val REGION = "Region"
- private val REGION_START = "RegionStart"
-
- private val homeMenuMap: MutableMap = mutableMapOf()
-
- private val WARNING_SHOWN = "SystemFilesWarningShown"
-
- private class DropdownItem(val valuesId: Int) : AdapterView.OnItemClickListener {
- var position = 0
-
- fun getValue(resources: Resources): Int {
- return resources.getIntArray(valuesId)[position]
- }
-
- override fun onItemClick(p0: AdapterView<*>?, view: View?, position: Int, id: Long) {
- this.position = position
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
- returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
- SystemSaveGame.load()
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- _binding = FragmentSystemFilesBinding.inflate(layoutInflater)
- return binding.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- homeViewModel.setNavigationVisibility(visible = false, animated = true)
- homeViewModel.setStatusBarShadeVisibility(visible = false)
-
- val preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
- if (!preferences.getBoolean(WARNING_SHOWN, false)) {
- MessageDialogFragment.newInstance(
- R.string.home_menu_warning,
- R.string.home_menu_warning_description
- ).show(childFragmentManager, MessageDialogFragment.TAG)
- preferences.edit()
- .putBoolean(WARNING_SHOWN, true)
- .apply()
- }
-
- binding.toolbarSystemFiles.setNavigationOnClickListener {
- binding.root.findNavController().popBackStack()
- }
-
- // TODO: Remove workaround for text filtering issue in material components when fixed
- // https://github.com/material-components/material-components-android/issues/1464
- binding.dropdownSystemType.isSaveEnabled = false
- binding.dropdownSystemRegion.isSaveEnabled = false
- binding.dropdownSystemRegionStart.isSaveEnabled = false
-
- viewLifecycleOwner.lifecycleScope.launch {
- repeatOnLifecycle(Lifecycle.State.CREATED) {
- systemFilesViewModel.shouldRefresh.collect {
- if (it) {
- reloadUi()
- systemFilesViewModel.setShouldRefresh(false)
- }
- }
- }
- }
-
- reloadUi()
- if (savedInstanceState != null) {
- setDropdownSelection(
- binding.dropdownSystemType,
- systemTypeDropdown,
- savedInstanceState.getInt(SYS_TYPE)
- )
- setDropdownSelection(
- binding.dropdownSystemRegion,
- systemRegionDropdown,
- savedInstanceState.getInt(REGION)
- )
- binding.dropdownSystemRegionStart
- .setText(savedInstanceState.getString(REGION_START), false)
- }
-
- setInsets()
- }
-
- override fun onSaveInstanceState(outState: Bundle) {
- outState.putInt(SYS_TYPE, systemTypeDropdown.position)
- outState.putInt(REGION, systemRegionDropdown.position)
- outState.putString(REGION_START, binding.dropdownSystemRegionStart.text.toString())
- }
-
- override fun onPause() {
- super.onPause()
- SystemSaveGame.save()
- }
-
- private fun reloadUi() {
- val preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
-
- binding.switchRunSystemSetup.isChecked = SystemSaveGame.getIsSystemSetupNeeded()
- binding.switchRunSystemSetup.setOnCheckedChangeListener { _, isChecked ->
- SystemSaveGame.setSystemSetupNeeded(isChecked)
- }
-
- val showHomeApps = preferences.getBoolean(Settings.PREF_SHOW_HOME_APPS, false)
- binding.switchShowApps.isChecked = showHomeApps
- binding.switchShowApps.setOnCheckedChangeListener { _, isChecked ->
- preferences.edit()
- .putBoolean(Settings.PREF_SHOW_HOME_APPS, isChecked)
- .apply()
- gamesViewModel.setShouldSwapData(true)
- }
-
- if (!NativeLibrary.areKeysAvailable()) {
- binding.apply {
- systemType.isEnabled = false
- systemRegion.isEnabled = false
- buttonDownloadHomeMenu.isEnabled = false
- textKeysMissing.visibility = View.VISIBLE
- textKeysMissingHelp.visibility = View.VISIBLE
- textKeysMissingHelp.text =
- Html.fromHtml(getString(R.string.how_to_get_keys), Html.FROM_HTML_MODE_LEGACY)
- textKeysMissingHelp.movementMethod = LinkMovementMethod.getInstance()
- }
- } else {
- populateDownloadOptions()
- }
-
- binding.buttonDownloadHomeMenu.setOnClickListener {
- val titleIds = NativeLibrary.getSystemTitleIds(
- systemTypeDropdown.getValue(resources),
- systemRegionDropdown.getValue(resources)
- )
-
- DownloadSystemFilesDialogFragment.newInstance(titleIds).show(
- childFragmentManager,
- DownloadSystemFilesDialogFragment.TAG
- )
- }
-
- populateHomeMenuOptions()
- binding.buttonStartHomeMenu.setOnClickListener {
- val menuPath = homeMenuMap[binding.dropdownSystemRegionStart.text.toString()]!!
- val menu = Game(
- title = getString(R.string.home_menu),
- path = menuPath,
- filename = ""
- )
- // val action = HomeNavigationDirections.actionGlobalEmulationActivity(menu)
- // binding.root.findNavController().navigate(action)
- VrActivity.launch(CitraApplication.appContext, menu.path, menu.title)
- }
- }
-
- private fun populateDropdown(
- dropdown: MaterialAutoCompleteTextView,
- valuesId: Int,
- dropdownItem: DropdownItem
- ) {
- val valuesAdapter = ArrayAdapter.createFromResource(
- requireContext(),
- valuesId,
- R.layout.support_simple_spinner_dropdown_item
- )
- dropdown.setAdapter(valuesAdapter)
- dropdown.onItemClickListener = dropdownItem
- }
-
- private fun setDropdownSelection(
- dropdown: MaterialAutoCompleteTextView,
- dropdownItem: DropdownItem,
- selection: Int
- ) {
- if (dropdown.adapter != null) {
- dropdown.setText(dropdown.adapter.getItem(selection).toString(), false)
- }
- dropdownItem.position = selection
- }
-
- private fun populateDownloadOptions() {
- populateDropdown(binding.dropdownSystemType, R.array.systemFileTypes, systemTypeDropdown)
- populateDropdown(
- binding.dropdownSystemRegion,
- R.array.systemFileRegions,
- systemRegionDropdown
- )
-
- setDropdownSelection(
- binding.dropdownSystemType,
- systemTypeDropdown,
- systemTypeDropdown.position
- )
- setDropdownSelection(
- binding.dropdownSystemRegion,
- systemRegionDropdown,
- systemRegionDropdown.position
- )
- }
-
- private fun populateHomeMenuOptions() {
- regionValues = resources.getIntArray(R.array.systemFileRegionValues)
- val regionEntries = resources.getStringArray(R.array.systemFileRegions)
- regionValues.forEachIndexed { i: Int, region: Int ->
- val regionString = regionEntries[i]
- val regionPath = NativeLibrary.getHomeMenuPath(region)
- homeMenuMap[regionString] = regionPath
- }
-
- val availableMenus = homeMenuMap.filter { it.value != "" }
- if (availableMenus.isNotEmpty()) {
- binding.systemRegionStart.isEnabled = true
- binding.buttonStartHomeMenu.isEnabled = true
-
- binding.dropdownSystemRegionStart.setAdapter(
- ArrayAdapter(
- requireContext(),
- R.layout.support_simple_spinner_dropdown_item,
- availableMenus.keys.toList()
- )
- )
- binding.dropdownSystemRegionStart.setText(availableMenus.keys.first(), false)
- }
- }
-
- private fun setInsets() =
- ViewCompat.setOnApplyWindowInsetsListener(
- binding.root
- ) { _: View, windowInsets: WindowInsetsCompat ->
- val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
- val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
-
- val leftInsets = barInsets.left + cutoutInsets.left
- val rightInsets = barInsets.right + cutoutInsets.right
-
- val mlpAppBar = binding.toolbarSystemFiles.layoutParams as ViewGroup.MarginLayoutParams
- mlpAppBar.leftMargin = leftInsets
- mlpAppBar.rightMargin = rightInsets
- binding.toolbarSystemFiles.layoutParams = mlpAppBar
-
- val mlpScrollSystemFiles =
- binding.scrollSystemFiles.layoutParams as ViewGroup.MarginLayoutParams
- mlpScrollSystemFiles.leftMargin = leftInsets
- mlpScrollSystemFiles.rightMargin = rightInsets
- binding.scrollSystemFiles.layoutParams = mlpScrollSystemFiles
-
- binding.scrollSystemFiles.updatePadding(bottom = barInsets.bottom)
-
- windowInsets
- }
-}
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/SystemFilesViewModel.kt b/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/SystemFilesViewModel.kt
deleted file mode 100644
index d4f654d5c..000000000
--- a/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/SystemFilesViewModel.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2023 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-package org.citra.citra_emu.viewmodel
-
-import androidx.lifecycle.ViewModel
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.cancelChildren
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.yield
-import org.citra.citra_emu.NativeLibrary
-import org.citra.citra_emu.NativeLibrary.InstallStatus
-import org.citra.citra_emu.utils.Log
-import java.util.concurrent.atomic.AtomicInteger
-import kotlin.coroutines.CoroutineContext
-import kotlin.math.min
-
-class SystemFilesViewModel : ViewModel() {
- private var job: Job
- private val coroutineContext: CoroutineContext
- get() = Dispatchers.IO + job
-
- val isDownloading get() = _isDownloading.asStateFlow()
- private val _isDownloading = MutableStateFlow(false)
-
- val progress get() = _progress.asStateFlow()
- private val _progress = MutableStateFlow(0)
-
- val result get() = _result.asStateFlow()
- private val _result = MutableStateFlow(null)
-
- val shouldRefresh get() = _shouldRefresh.asStateFlow()
- private val _shouldRefresh = MutableStateFlow(false)
-
- private var cancelled = false
-
- private val RETRY_AMOUNT = 3
-
- init {
- job = Job()
- clear()
- }
-
- fun setShouldRefresh(refresh: Boolean) {
- _shouldRefresh.value = refresh
- }
-
- fun setProgress(progress: Int) {
- _progress.value = progress
- }
-
- fun download(titles: LongArray) {
- if (isDownloading.value) {
- return
- }
- clear()
- _isDownloading.value = true
- Log.debug("System menu download started.")
-
- val minExecutors = min(Runtime.getRuntime().availableProcessors(), titles.size)
- val segment = (titles.size / minExecutors)
- val atomicProgress = AtomicInteger(0)
- for (i in 0 until minExecutors) {
- val titlesSegment = if (i < minExecutors - 1) {
- titles.copyOfRange(i * segment, (i + 1) * segment)
- } else {
- titles.copyOfRange(i * segment, titles.size)
- }
-
- CoroutineScope(coroutineContext).launch {
- titlesSegment.forEach { title: Long ->
- // Notify UI of cancellation before ending coroutine
- if (cancelled) {
- _result.value = InstallStatus.ErrorAborted
- cancelled = false
- }
-
- // Takes a moment to see if the coroutine was cancelled
- yield()
-
- // Retry downloading a title repeatedly
- for (j in 0 until RETRY_AMOUNT) {
- val result = tryDownloadTitle(title)
- if (result == InstallStatus.Success) {
- break
- } else if (j == RETRY_AMOUNT - 1) {
- _result.value = result
- return@launch
- }
- Log.warning("Download for title{$title} failed, retrying in 3s...")
- delay(3000L)
- }
-
- Log.debug("Successfully installed title - $title")
- setProgress(atomicProgress.incrementAndGet())
-
- Log.debug("System File Progress - ${atomicProgress.get()} / ${titles.size}")
- if (atomicProgress.get() == titles.size) {
- _result.value = InstallStatus.Success
- setShouldRefresh(true)
- }
- }
- }
- }
- }
-
- private fun tryDownloadTitle(title: Long): InstallStatus {
- val result = NativeLibrary.downloadTitleFromNus(title)
- if (result != InstallStatus.Success) {
- Log.error("Failed to install title $title with error - $result")
- }
- return result
- }
-
- fun clear() {
- Log.debug("Clearing")
- job.cancelChildren()
- job = Job()
- _progress.value = 0
- _result.value = null
- _isDownloading.value = false
- cancelled = false
- }
-
- fun cancel() {
- Log.debug("Canceling system file download.")
- cancelled = true
- job.cancelChildren()
- job = Job()
- _progress.value = 0
- _result.value = InstallStatus.Cancelled
- }
-}
diff --git a/src/android/app/src/main/res/layout/fragment_system_files.xml b/src/android/app/src/main/res/layout/fragment_system_files.xml
deleted file mode 100644
index 6c833f876..000000000
--- a/src/android/app/src/main/res/layout/fragment_system_files.xml
+++ /dev/null
@@ -1,219 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/android/app/src/main/res/navigation/home_navigation.xml b/src/android/app/src/main/res/navigation/home_navigation.xml
index ec8a02afe..29eb67099 100644
--- a/src/android/app/src/main/res/navigation/home_navigation.xml
+++ b/src/android/app/src/main/res/navigation/home_navigation.xml
@@ -16,9 +16,6 @@
-
@@ -70,11 +67,6 @@
app:destination="@id/emulationActivity"
app:launchSingleTop="true" />
-
-
Diese Eingabe muss an einen Gamepad-Analogstick oder das Steuerkreuz gebunden sein!Diese Eingabe muss an einen Gamepad-Knopf gebunden sein!
-
- Systemdateien
- Systemdateien herunterladen
- Systemtyp
- Download
- Start
- Minimal
- New 3DS
- Dateien werden heruntergeladen...
- Bitte nicht die App schließen.
- Download fehlgeschlagen
- Download abgeschlossen!
- Download abgebrochen
- Abbrechen...
- HOME-Menü
- Systemdatei-Warnung
- Aufgrund der langsamen Zugriffsgeschwindigkeit von Android auf CitraVRs Dateien, kann das Herunterladen mehrerer Versionen von Systemdateien das Laden von Spielen, Speicherständen und der Spieleliste erheblich verlangsamen. Laden Sie nur die Dateien herunter, die Sie benötigen, um Probleme mit den Ladezeiten zu vermeiden.
-
KnöpfeKnopf
@@ -545,4 +527,6 @@ Nachdem die Shader geladen wurden, werden sie auf dem Gerät gespeichert und ver
Stellt ein, wie stark die Bewegung nach links/rechts/oben/unten die Kameraperspektive im Spiel beeinflusst (0 = deaktiviert).Positionale Bewegungsfaktor-VerstärkerStellt ein, wie stark sich die Bewegung nach links/rechts/hoch/runter auf die Spielkamera auswirkt. Manche Spiele erfordern größere Werte, daher multipliziert dies den Positionsfaktor für die Bewegung.
+ Abbruch...
+ Start
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 1481fdc55..bf04745d2 100644
--- a/src/android/app/src/main/res/values-es/strings.xml
+++ b/src/android/app/src/main/res/values-es/strings.xml
@@ -116,33 +116,6 @@
¡Este control debe asignarse a un stick analógico del mando o a un eje del Pad de Control!¡Este control debe asignarse a un botón del mando!
-
- Archivos de Sistema
- Descarga archivos de sistema para obtener los archivos de Mii, cargar el menú HOME, y más.
- Descargar Archivos de Sistema
- Cargar el Menú HOME
- Tipo de Sistema
- Descargar
- Iniciar
- CitraVR no tiene las claves para descargar los archivos de sistema.
- ¿Cómo obtener las claves?]]>
- Mostrar las apps del menú HOME en la lista de juegos
- Ejecutar la Configuración de la consola cuando se ejecute el Menú HOME
- Mínimo
- Old 3DS
- New 3DS
- Descargando Archivos...
- Por favor, no cierre la app.
- Descarga Fallida
- Asegúrese de estar conectado/a al Internet e inténtelo de nuevo.
- ¡Descarga Completada!
- Descarga Cancelada
- Por favor, reinicie la descarga para prevenir problemas con los archivos de sistema incompletos.
- Cancelando...
- Menú HOME
- Advertencia de los Archivos de Sistema
- Debido a la lentitud del framework de Android de acceso al almacenamiento para acceder a los archivos de CitraVR, descargar múltiples versiones de los archivos de sistema pueden aumentar trágicamente los tiempos de carga para los juegos, los estados, y la lista de juegos. Sólo descarga los archivos que necesites para evitar problemas con las velocidades de carga.
-
BotonesBotón
@@ -687,4 +660,6 @@ Después de que los shaders se carguen, se almacenan en el dispositivo, lo que e
Ajusta cuánto afecta el movimiento hacia la izquierda/derecha/arriba/abajo a la cámara del juego (0 = desactivado)Multiplicador del Factor de Movimiento PosicionalAjusta cuánto afecta el movimiento izquierda/derecha/arriba/abajo a la cámara del juego, algunos juegos requieren valores más grandes, por lo que esto multiplica el Factor de Movimiento Posicional.
+ Cancelando...
+ Comienzo
diff --git a/src/android/app/src/main/res/values-fi/strings.xml b/src/android/app/src/main/res/values-fi/strings.xml
index d7b8e1b3a..2143160b6 100644
--- a/src/android/app/src/main/res/values-fi/strings.xml
+++ b/src/android/app/src/main/res/values-fi/strings.xml
@@ -122,4 +122,6 @@ Shadereiden latautumisen jälkeen ne tallennetaan laitteeseen, mikä estää nä
Säätää, kuinka paljon liike vasemmalle/oikealle/ylös/alas vaikuttaa pelikameraan (0 = pois käytöstä)Paikallisen Liikkeen Tekijän KerroinSäätää kuinka paljon liikkuminen vasemmalta/oikealta/ylös/alas vaikuttaa pelikameraan, joidenkin pelien vaatiessa suurempia arvoja, joten tämä kertoo Liike Kertoimen sijaintiin vaikuttavalta tekijältä.
+ Peruutetaan...
+ Käynnistä
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 0b1223804..9743f121f 100644
--- a/src/android/app/src/main/res/values-fr/strings.xml
+++ b/src/android/app/src/main/res/values-fr/strings.xml
@@ -117,34 +117,6 @@
Cette commande doit être rattachée à un stick analogique de manette ou à un axe de la croix directionnelle !Cette commande doit être rattachée à un bouton de manette !
-
- Fichiers système
- Téléchargez les fichiers système pour obtenir des fichiers Mii, démarrer le menu HOME, et plus encore.
- Télécharger les fichiers système
- Démarrer le menu HOME
- Type de système
- Télécharger
- Démarrer
- CitraVR ne dispose pas des clés nécessaires pour télécharger les fichiers système.
- Comment obtenir des clés ?]]>
- Afficher les applications du menu HOME dans la liste des jeux
- Exécuter la configuration système lorsque le menu HOME est lancé
- Minimal
- Old 3DS
- New 3DS
- Téléchargement des fichiers...
- Veuillez ne pas fermer l\'application.
- Échec du téléchargement
-
- Veuillez vous assurer que vous êtes connecté à Internet et réessayez.
- Téléchargement terminé !
- Téléchargement annulé
- Veuillez redémarrer le téléchargement pour éviter des problèmes avec des fichiers système incomplets.
- Annulation...
- Menu HOME
- Avertissement sur les fichiers système
- En raison de la lenteur du framework d\'accès au stockage d\'Android pour accéder aux fichiers de CitraVR, le téléchargement de plusieurs versions de fichiers système peut considérablement ralentir le chargement des jeux, des états de sauvegarde et de la liste des jeux. Téléchargez uniquement les fichiers dont vous avez besoin pour éviter tout problème de vitesse de chargement.
-
BoutonsBouton
@@ -687,4 +659,6 @@ Une fois les shaders chargés, ils sont enregistrés sur l\'appareil, ce qui emp
Ajuste la mesure dans laquelle le mouvement gauche/droite/haut/bas affecte la caméra du jeu (0 = désactivé).Multiplicateur du Facteur de Mouvement PositionnelAjuste la façon dont le mouvement gauche/droite/haut/bas affecte la caméra du jeu, certains jeux nécessitent des valeurs plus grandes, donc cela multiplie le facteur de mouvement positionnel.
+ Annulation...
+ Commencer
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 eea485b8d..324784479 100644
--- a/src/android/app/src/main/res/values-it/strings.xml
+++ b/src/android/app/src/main/res/values-it/strings.xml
@@ -276,4 +276,6 @@ Después de que se carguen los sombreadores, estos se guardan en el dispositivo,
Regola quanto il movimento destra/sinistra/su/giù influisce sulla telecamera del gioco (0 = disattivato)Moltiplicatore del Fattore di Movimento PosizionaleRegola quanto i movimenti sinistra/destra/su/giù influiscono sulla telecamera di gioco; alcuni giochi richiedono valori più elevati, quindi questo moltiplica il fattore di movimento posizionale.
+ Annullamento in corso...
+ Inizio
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 cae531063..08143ce67 100644
--- a/src/android/app/src/main/res/values-ja/strings.xml
+++ b/src/android/app/src/main/res/values-ja/strings.xml
@@ -138,4 +138,6 @@
「ゲームのカメラに左/右/上/下の移動がどれくらい影響を与えるかを調整します(0 = 無効)」位置移動ファクターの乗数変更ゲームカメラに左右、上下の移動がどれだけ影響するかを調整します。一部のゲームではより大きな値が必要になる場合があるため、これは位置移動係数を乗算します。
+ キャンセル中...
+ 開始
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 261bc3608..247c1fdf7 100644
--- a/src/android/app/src/main/res/values-ko/strings.xml
+++ b/src/android/app/src/main/res/values-ko/strings.xml
@@ -193,4 +193,6 @@
게임 카메라에 좌/우/상/하로 움직임이 얼마나 영향을 미치는지 조절합니다 (0 = 비활성화)위치 이동 요소 배수게임 카메라에 좌/우/위/아래로 이동이 얼마나 영향을 미치는지 조정합니다. 일부 게임에서는 더 큰 값이 필요할 수 있으므로 이 설정은 위치 이동 계수에 곱해집니다.
+ 취소 중...
+ 시작
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 def816112..f5d90a24e 100644
--- a/src/android/app/src/main/res/values-nb/strings.xml
+++ b/src/android/app/src/main/res/values-nb/strings.xml
@@ -191,4 +191,6 @@
Justerer hvor mye bevegelse venstre/høyre/opp/ned påvirker spilkameraet (0 = deaktivert)Posisjonell Bevegelsesfaktor MultiplikatorJusterer hvor mye bevegelse venstre/høyre/opp/ned påvirker spillekameraet, noen spill krever større verdier, så dette multipliserer den posisjonelle bevegelsesfaktoren.
+ Avbryter...
+ Starte
diff --git a/src/android/app/src/main/res/values-pt/strings.xml b/src/android/app/src/main/res/values-pt/strings.xml
index 91e7effa1..ef36cfd5d 100644
--- a/src/android/app/src/main/res/values-pt/strings.xml
+++ b/src/android/app/src/main/res/values-pt/strings.xml
@@ -110,24 +110,6 @@
Este controle tem de ser mapeado a um eixo analógico do gamepad ou um eixo de D-pad!Este controle tem de ser mapeado a um botão do gamepad!
-
- Arquivos do Sistema
- Iniciar o MENU INICIAL
- Tipo de sistema
- Baixar
- Mostrar aplicativos do MENU INICIAL na lista de jogos
- 3DS Antigo
- Novo 3DS
- Baixando arquivos...
- Por favor, não feche o aplicativo.
- Falha no download
- Por favor, certifique-se de que está conectado à internet e tente novamente.
- Download Completo!
- Download Cancelado
- Por favor, reinicie o download para evitar problemas com arquivos do sistema incompletos.
- Cancelando...
- MENU INICIAL
- Aviso de Arquivos do SistemaBotões
@@ -347,4 +329,6 @@ Após os shaders serem carregados, eles são armazenados no dispositivo, evitand
Ajusta o quanto o movimento para esquerda/direita/cima/baixo afeta a câmera do jogo (0 = desativado).Fator de Multiplicação do Fator de Movimento PosicionalAjusta o quanto o movimento para a esquerda/direita/cima/baixo afeta a câmera do jogo, alguns jogos exigem valores maiores, então isso multiplica o Fator de Movimento Posicional.
+ Cancelando...
+ Iniciar
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 6b7b2ffb3..ce4b18c7e 100644
--- a/src/android/app/src/main/res/values-ru/strings.xml
+++ b/src/android/app/src/main/res/values-ru/strings.xml
@@ -116,33 +116,6 @@
Данный элемент управления должен быть привязан к аналоговому стику или крестовине геймпада!Данный элемент управления должен быть привязан к кнопке геймпада!
-
- Системные файлы
- Загрузка системных файлов для получения файлов Mii, запуска меню HOME и другое
- Загрузка системных файлов
- Запуск меню HOME
- Тип системы
- Скачать
- Запустить
- В CitraVR отсутствуют ключи для загрузки системных файлов.
- Как получить ключи?]]>
- Показывать приложения меню HOME в списке игр
- Запускать настройку системы при загрузке меню HOME
- Минимальный
- Старая модель 3DS
- Новая модель 3DS
- Загрузка файлов...
- Пожалуйста, не закрывайте приложение.
- Ошибка загрузки
- Пожалуйста, проверьте соединение с Интернет и повторите попытку.
- Загрузка завершена!
- Загрузка отменена.
- Пожалуйста, повторно запустите загрузку, чтобы избежать ошибок из-за неполных системных файлов.
- Отмена...
- Меню HOME
- Предупреждение о системных файлах
- Используемый в Android фреймворк SAF замедляет доступ к файлам CitraVR, поэтому скачивание нескольких версий системных файлов может существенно снизить скорость загрузки игр, сохранений и списка игр. Во избежание проблем со скоростью загрузки скачивайте только необходимые файлы.
-
КнопкиКнопка
@@ -687,4 +660,6 @@
Регулирует, насколько движение влево/вправо/вверх/вниз влияет на игровую камеру (0 = отключено).Множитель фактора позиционного перемещенияНастройка определяет, насколько движение влево/вправо/вверх/вниз влияет на камеру игры; в некоторых играх требуются большие значения, поэтому это умножает фактор перемещения положения.
+ Отмена...
+ Начать
diff --git a/src/android/app/src/main/res/values-zh/strings.xml b/src/android/app/src/main/res/values-zh/strings.xml
index 15770b259..dc2aa115f 100644
--- a/src/android/app/src/main/res/values-zh/strings.xml
+++ b/src/android/app/src/main/res/values-zh/strings.xml
@@ -116,33 +116,6 @@
此操作只能绑定到游戏手柄的摇杆或十字方向键上!此操作只能绑定到游戏手柄的按键上!
-
- 系统文件
- 下载系统文件以获取 Mii 文件、启动 HOME 菜单以及更多
- 下载系统文件
- 启动 HOME 菜单
- 系统类型
- 下载
- 开始
- CitraVR 缺失下载系统文件所需的密钥。
- 如何获取密钥?]]>
- 在游戏列表中显示 HOME 菜单小程序
- 启动 HOME 菜单时运行系统设置
- 最小化
- 老版 3DS
- 新版 3DS
- 下载中...
- 请不要关闭 CitraVR。
- 下载失败
- 请确保您的网络连接正常,然后重试。
- 下载完成!
- 下载已取消
- 请重新下载,以防止系统文件不完整。
- 取消中...
- HOME 菜单
- 系统文件警告
- 由于 Android 存储访问框架访问 CitraVR 文件的速度非常慢,下载多个版本的系统文件会大大降低游戏加载、即时存档和刷新游戏列表的速度。只下载您需要的文件,以免加载速度出现问题。
-
按键按键
@@ -685,4 +658,6 @@
调整左/右/上/下运动对游戏摄像机的影响程度(0 = 禁用)位置运动因子倍增器调整左/右/上/下的运动对游戏摄像机的影响程度,某些游戏需要更大的值,因此这个设置会将位置运动因子乘以一个标量。
+ 取消中...
+ 开始
diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml
index d49fd5bbb..93671ca91 100644
--- a/src/android/app/src/main/res/values/arrays.xml
+++ b/src/android/app/src/main/res/values/arrays.xml
@@ -200,36 +200,6 @@
2
-
- @string/system_region_jpn
- @string/system_region_usa
- @string/system_region_eur
- @string/system_region_aus
- @string/system_region_chn
- @string/system_region_kor
- @string/system_region_twn
-
-
- 0
- 1
- 2
- 3
- 4
- 5
- 6
-
-
-
- @string/system_type_minimal
- @string/system_type_old_3ds
- @string/system_type_new_3ds
-
-
- 1
- 2
- 4
-
-
@string/mono@string/stereo
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index da6a51bc8..60de10dab 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -130,36 +130,11 @@
This control must be bound to a gamepad analog stick or D-pad axis!This control must be bound to a gamepad button!
-
- System Files
- Download system files to get Mii files, boot the HOME menu, and more
- Download System Files
- Boot the HOME Menu
- System Type
- Download
- Start
- CitraVR is missing keys to download system files.
- How to get keys?]]>
- Show HOME menu apps in games list
- Run System Setup when the HOME Menu is launched
- Minimal
- Old 3DS
- New 3DS
- Downloading Files…
- Please do not close the app.
- Download Failed
- Please make sure you are connected to the internet and try again.
- Download Complete!
- Download Cancelled
- Please restart the download to prevent issues with having incomplete system files.
- Cancelling…
- HOME Menu
- System Files Warning
- Due to how slow Android\'s storage access framework is for accessing CitraVR\'s files, downloading multiple versions of system files can dramatically slow down loading for games, save states, and the games list. Only download the files that you require to avoid any issues with loading speeds.
-
ButtonsButton
+ Cancelling...
+ StartCPU JIT