Merge pull request #11420 from t895/long-install-fix
android: Fix game content installer
This commit is contained in:
commit
5ce41fa213
6 changed files with 118 additions and 174 deletions
|
@ -45,8 +45,8 @@ class HomeSettingAdapter(
|
||||||
holder.option.onClick.invoke()
|
holder.option.onClick.invoke()
|
||||||
} else {
|
} else {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
holder.option.disabledTitleId,
|
titleId = holder.option.disabledTitleId,
|
||||||
holder.option.disabledMessageId
|
descriptionId = holder.option.disabledMessageId
|
||||||
).show(activity.supportFragmentManager, MessageDialogFragment.TAG)
|
).show(activity.supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,8 +187,8 @@ class ImportExportSavesFragment : DialogFragment() {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
if (!validZip) {
|
if (!validZip) {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.save_file_invalid_zip_structure,
|
titleId = R.string.save_file_invalid_zip_structure,
|
||||||
R.string.save_file_invalid_zip_structure_description
|
descriptionId = R.string.save_file_invalid_zip_structure_description
|
||||||
).show(activity.supportFragmentManager, MessageDialogFragment.TAG)
|
).show(activity.supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
return@withContext
|
return@withContext
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ class IndeterminateProgressDialogFragment : DialogFragment() {
|
||||||
when (val result = taskViewModel.result.value) {
|
when (val result = taskViewModel.result.value) {
|
||||||
is String -> Toast.makeText(requireContext(), result, Toast.LENGTH_LONG).show()
|
is String -> Toast.makeText(requireContext(), result, Toast.LENGTH_LONG).show()
|
||||||
is MessageDialogFragment -> result.show(
|
is MessageDialogFragment -> result.show(
|
||||||
parentFragmentManager,
|
requireActivity().supportFragmentManager,
|
||||||
MessageDialogFragment.TAG
|
MessageDialogFragment.TAG
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.fragments
|
|
||||||
|
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
|
||||||
import androidx.fragment.app.DialogFragment
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
|
|
||||||
class LongMessageDialogFragment : DialogFragment() {
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
||||||
val titleId = requireArguments().getInt(TITLE)
|
|
||||||
val description = requireArguments().getString(DESCRIPTION)
|
|
||||||
val helpLinkId = requireArguments().getInt(HELP_LINK)
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
|
||||||
.setPositiveButton(R.string.close, null)
|
|
||||||
.setTitle(titleId)
|
|
||||||
.setMessage(description)
|
|
||||||
|
|
||||||
if (helpLinkId != 0) {
|
|
||||||
dialog.setNeutralButton(R.string.learn_more) { _, _ ->
|
|
||||||
openLink(getString(helpLinkId))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return dialog.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun openLink(link: String) {
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link))
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val TAG = "LongMessageDialogFragment"
|
|
||||||
|
|
||||||
private const val TITLE = "Title"
|
|
||||||
private const val DESCRIPTION = "Description"
|
|
||||||
private const val HELP_LINK = "Link"
|
|
||||||
|
|
||||||
fun newInstance(
|
|
||||||
titleId: Int,
|
|
||||||
description: String,
|
|
||||||
helpLinkId: Int = 0
|
|
||||||
): LongMessageDialogFragment {
|
|
||||||
val dialog = LongMessageDialogFragment()
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.apply {
|
|
||||||
putInt(TITLE, titleId)
|
|
||||||
putString(DESCRIPTION, description)
|
|
||||||
putInt(HELP_LINK, helpLinkId)
|
|
||||||
}
|
|
||||||
dialog.arguments = bundle
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -13,14 +13,20 @@ import org.yuzu.yuzu_emu.R
|
||||||
|
|
||||||
class MessageDialogFragment : DialogFragment() {
|
class MessageDialogFragment : DialogFragment() {
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
val titleId = requireArguments().getInt(TITLE)
|
val titleId = requireArguments().getInt(TITLE_ID)
|
||||||
val descriptionId = requireArguments().getInt(DESCRIPTION)
|
val titleString = requireArguments().getString(TITLE_STRING)!!
|
||||||
|
val descriptionId = requireArguments().getInt(DESCRIPTION_ID)
|
||||||
|
val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!!
|
||||||
val helpLinkId = requireArguments().getInt(HELP_LINK)
|
val helpLinkId = requireArguments().getInt(HELP_LINK)
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
val dialog = MaterialAlertDialogBuilder(requireContext())
|
||||||
.setPositiveButton(R.string.close, null)
|
.setPositiveButton(R.string.close, null)
|
||||||
.setTitle(titleId)
|
|
||||||
.setMessage(descriptionId)
|
if (titleId != 0) dialog.setTitle(titleId)
|
||||||
|
if (titleString.isNotEmpty()) dialog.setTitle(titleString)
|
||||||
|
|
||||||
|
if (descriptionId != 0) dialog.setMessage(descriptionId)
|
||||||
|
if (descriptionString.isNotEmpty()) dialog.setMessage(descriptionString)
|
||||||
|
|
||||||
if (helpLinkId != 0) {
|
if (helpLinkId != 0) {
|
||||||
dialog.setNeutralButton(R.string.learn_more) { _, _ ->
|
dialog.setNeutralButton(R.string.learn_more) { _, _ ->
|
||||||
|
@ -39,20 +45,26 @@ class MessageDialogFragment : DialogFragment() {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "MessageDialogFragment"
|
const val TAG = "MessageDialogFragment"
|
||||||
|
|
||||||
private const val TITLE = "Title"
|
private const val TITLE_ID = "Title"
|
||||||
private const val DESCRIPTION = "Description"
|
private const val TITLE_STRING = "TitleString"
|
||||||
|
private const val DESCRIPTION_ID = "DescriptionId"
|
||||||
|
private const val DESCRIPTION_STRING = "DescriptionString"
|
||||||
private const val HELP_LINK = "Link"
|
private const val HELP_LINK = "Link"
|
||||||
|
|
||||||
fun newInstance(
|
fun newInstance(
|
||||||
titleId: Int,
|
titleId: Int = 0,
|
||||||
descriptionId: Int,
|
titleString: String = "",
|
||||||
|
descriptionId: Int = 0,
|
||||||
|
descriptionString: String = "",
|
||||||
helpLinkId: Int = 0
|
helpLinkId: Int = 0
|
||||||
): MessageDialogFragment {
|
): MessageDialogFragment {
|
||||||
val dialog = MessageDialogFragment()
|
val dialog = MessageDialogFragment()
|
||||||
val bundle = Bundle()
|
val bundle = Bundle()
|
||||||
bundle.apply {
|
bundle.apply {
|
||||||
putInt(TITLE, titleId)
|
putInt(TITLE_ID, titleId)
|
||||||
putInt(DESCRIPTION, descriptionId)
|
putString(TITLE_STRING, titleString)
|
||||||
|
putInt(DESCRIPTION_ID, descriptionId)
|
||||||
|
putString(DESCRIPTION_STRING, descriptionString)
|
||||||
putInt(HELP_LINK, helpLinkId)
|
putInt(HELP_LINK, helpLinkId)
|
||||||
}
|
}
|
||||||
dialog.arguments = bundle
|
dialog.arguments = bundle
|
||||||
|
|
|
@ -42,7 +42,6 @@ import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||||
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
|
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
|
||||||
import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment
|
import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment
|
||||||
import org.yuzu.yuzu_emu.fragments.LongMessageDialogFragment
|
|
||||||
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
||||||
import org.yuzu.yuzu_emu.model.GamesViewModel
|
import org.yuzu.yuzu_emu.model.GamesViewModel
|
||||||
import org.yuzu.yuzu_emu.model.HomeViewModel
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
|
@ -301,8 +300,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
fun processKey(result: Uri): Boolean {
|
fun processKey(result: Uri): Boolean {
|
||||||
if (FileUtil.getExtension(result) != "keys") {
|
if (FileUtil.getExtension(result) != "keys") {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.reading_keys_failure,
|
titleId = R.string.reading_keys_failure,
|
||||||
R.string.install_prod_keys_failure_extension_description
|
descriptionId = R.string.install_prod_keys_failure_extension_description
|
||||||
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -330,9 +329,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.invalid_keys_error,
|
titleId = R.string.invalid_keys_error,
|
||||||
R.string.install_keys_failure_description,
|
descriptionId = R.string.install_keys_failure_description,
|
||||||
R.string.dumping_keys_quickstart_link
|
helpLinkId = R.string.dumping_keys_quickstart_link
|
||||||
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -370,8 +369,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2
|
val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2
|
||||||
messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) {
|
messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.firmware_installed_failure,
|
titleId = R.string.firmware_installed_failure,
|
||||||
R.string.firmware_installed_failure_description
|
descriptionId = R.string.firmware_installed_failure_description
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
firmwarePath.deleteRecursively()
|
firmwarePath.deleteRecursively()
|
||||||
|
@ -401,8 +400,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
|
|
||||||
if (FileUtil.getExtension(result) != "bin") {
|
if (FileUtil.getExtension(result) != "bin") {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.reading_keys_failure,
|
titleId = R.string.reading_keys_failure,
|
||||||
R.string.install_amiibo_keys_failure_extension_description
|
descriptionId = R.string.install_amiibo_keys_failure_extension_description
|
||||||
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
return@registerForActivityResult
|
return@registerForActivityResult
|
||||||
}
|
}
|
||||||
|
@ -428,9 +427,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
).show()
|
).show()
|
||||||
} else {
|
} else {
|
||||||
MessageDialogFragment.newInstance(
|
MessageDialogFragment.newInstance(
|
||||||
R.string.invalid_keys_error,
|
titleId = R.string.invalid_keys_error,
|
||||||
R.string.install_keys_failure_description,
|
descriptionId = R.string.install_keys_failure_description,
|
||||||
R.string.dumping_keys_quickstart_link
|
helpLinkId = R.string.dumping_keys_quickstart_link
|
||||||
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
).show(supportFragmentManager, MessageDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -502,96 +501,91 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
var errorBaseGame = 0
|
var errorBaseGame = 0
|
||||||
var errorExtension = 0
|
var errorExtension = 0
|
||||||
var errorOther = 0
|
var errorOther = 0
|
||||||
var errorTotal = 0
|
documents.forEach {
|
||||||
lifecycleScope.launch {
|
when (NativeLibrary.installFileToNand(it.toString())) {
|
||||||
documents.forEach {
|
NativeLibrary.InstallFileToNandResult.Success -> {
|
||||||
when (NativeLibrary.installFileToNand(it.toString())) {
|
installSuccess += 1
|
||||||
NativeLibrary.InstallFileToNandResult.Success -> {
|
|
||||||
installSuccess += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> {
|
|
||||||
installOverwrite += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> {
|
|
||||||
errorBaseGame += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> {
|
|
||||||
errorExtension += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> {
|
|
||||||
errorOther += 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
withContext(Dispatchers.Main) {
|
NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> {
|
||||||
val separator = System.getProperty("line.separator") ?: "\n"
|
installOverwrite += 1
|
||||||
val installResult = StringBuilder()
|
|
||||||
if (installSuccess > 0) {
|
|
||||||
installResult.append(
|
|
||||||
getString(
|
|
||||||
R.string.install_game_content_success_install,
|
|
||||||
installSuccess
|
|
||||||
)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
}
|
}
|
||||||
if (installOverwrite > 0) {
|
|
||||||
installResult.append(
|
NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> {
|
||||||
getString(
|
errorBaseGame += 1
|
||||||
R.string.install_game_content_success_overwrite,
|
|
||||||
installOverwrite
|
|
||||||
)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
}
|
}
|
||||||
errorTotal = errorBaseGame + errorExtension + errorOther
|
|
||||||
if (errorTotal > 0) {
|
NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> {
|
||||||
installResult.append(separator)
|
errorExtension += 1
|
||||||
installResult.append(
|
}
|
||||||
getString(
|
|
||||||
R.string.install_game_content_failed_count,
|
else -> {
|
||||||
errorTotal
|
errorOther += 1
|
||||||
)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
if (errorBaseGame > 0) {
|
|
||||||
installResult.append(separator)
|
|
||||||
installResult.append(
|
|
||||||
getString(R.string.install_game_content_failure_base)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
}
|
|
||||||
if (errorExtension > 0) {
|
|
||||||
installResult.append(separator)
|
|
||||||
installResult.append(
|
|
||||||
getString(R.string.install_game_content_failure_file_extension)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
}
|
|
||||||
if (errorOther > 0) {
|
|
||||||
installResult.append(
|
|
||||||
getString(R.string.install_game_content_failure_description)
|
|
||||||
)
|
|
||||||
installResult.append(separator)
|
|
||||||
}
|
|
||||||
LongMessageDialogFragment.newInstance(
|
|
||||||
R.string.install_game_content_failure,
|
|
||||||
installResult.toString().trim(),
|
|
||||||
R.string.install_game_content_help_link
|
|
||||||
).show(supportFragmentManager, LongMessageDialogFragment.TAG)
|
|
||||||
} else {
|
|
||||||
LongMessageDialogFragment.newInstance(
|
|
||||||
R.string.install_game_content_success,
|
|
||||||
installResult.toString().trim()
|
|
||||||
).show(supportFragmentManager, LongMessageDialogFragment.TAG)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return@newInstance installSuccess + installOverwrite + errorTotal
|
|
||||||
|
val separator = System.getProperty("line.separator") ?: "\n"
|
||||||
|
val installResult = StringBuilder()
|
||||||
|
if (installSuccess > 0) {
|
||||||
|
installResult.append(
|
||||||
|
getString(
|
||||||
|
R.string.install_game_content_success_install,
|
||||||
|
installSuccess
|
||||||
|
)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
}
|
||||||
|
if (installOverwrite > 0) {
|
||||||
|
installResult.append(
|
||||||
|
getString(
|
||||||
|
R.string.install_game_content_success_overwrite,
|
||||||
|
installOverwrite
|
||||||
|
)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
}
|
||||||
|
val errorTotal: Int = errorBaseGame + errorExtension + errorOther
|
||||||
|
if (errorTotal > 0) {
|
||||||
|
installResult.append(separator)
|
||||||
|
installResult.append(
|
||||||
|
getString(
|
||||||
|
R.string.install_game_content_failed_count,
|
||||||
|
errorTotal
|
||||||
|
)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
if (errorBaseGame > 0) {
|
||||||
|
installResult.append(separator)
|
||||||
|
installResult.append(
|
||||||
|
getString(R.string.install_game_content_failure_base)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
}
|
||||||
|
if (errorExtension > 0) {
|
||||||
|
installResult.append(separator)
|
||||||
|
installResult.append(
|
||||||
|
getString(R.string.install_game_content_failure_file_extension)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
}
|
||||||
|
if (errorOther > 0) {
|
||||||
|
installResult.append(
|
||||||
|
getString(R.string.install_game_content_failure_description)
|
||||||
|
)
|
||||||
|
installResult.append(separator)
|
||||||
|
}
|
||||||
|
return@newInstance MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.install_game_content_failure,
|
||||||
|
descriptionString = installResult.toString().trim(),
|
||||||
|
helpLinkId = R.string.install_game_content_help_link
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return@newInstance MessageDialogFragment.newInstance(
|
||||||
|
titleId = R.string.install_game_content_success,
|
||||||
|
descriptionString = installResult.toString().trim()
|
||||||
|
)
|
||||||
|
}
|
||||||
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue