Merge pull request #11420 from t895/long-install-fix

android: Fix game content installer
This commit is contained in:
Charles Lombardo 2023-08-30 23:44:35 -04:00 committed by GitHub
commit 5ce41fa213
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 118 additions and 174 deletions

View file

@ -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)
} }
} }

View file

@ -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
} }

View file

@ -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
) )
} }

View file

@ -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
}
}
}

View file

@ -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

View file

@ -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)
} }
} }