|
|
|
@ -38,12 +38,13 @@ 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 |
|
|
|
import org.yuzu.yuzu_emu.fragments.IndeterminateProgressDialogFragment |
|
|
|
import org.yuzu.yuzu_emu.fragments.ProgressDialogFragment |
|
|
|
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment |
|
|
|
import org.yuzu.yuzu_emu.model.AddonViewModel |
|
|
|
import org.yuzu.yuzu_emu.model.DriverViewModel |
|
|
|
import org.yuzu.yuzu_emu.model.GamesViewModel |
|
|
|
import org.yuzu.yuzu_emu.model.HomeViewModel |
|
|
|
import org.yuzu.yuzu_emu.model.InstallResult |
|
|
|
import org.yuzu.yuzu_emu.model.TaskState |
|
|
|
import org.yuzu.yuzu_emu.model.TaskViewModel |
|
|
|
import org.yuzu.yuzu_emu.utils.* |
|
|
|
@ -369,26 +370,23 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
return@registerForActivityResult |
|
|
|
} |
|
|
|
|
|
|
|
val inputZip = contentResolver.openInputStream(result) |
|
|
|
if (inputZip == null) { |
|
|
|
Toast.makeText( |
|
|
|
applicationContext, |
|
|
|
getString(R.string.fatal_error), |
|
|
|
Toast.LENGTH_LONG |
|
|
|
).show() |
|
|
|
return@registerForActivityResult |
|
|
|
} |
|
|
|
|
|
|
|
val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") } |
|
|
|
|
|
|
|
val firmwarePath = |
|
|
|
File(DirectoryInitialization.userDirectory + "/nand/system/Contents/registered/") |
|
|
|
val cacheFirmwareDir = File("${cacheDir.path}/registered/") |
|
|
|
|
|
|
|
val task: () -> Any = { |
|
|
|
ProgressDialogFragment.newInstance( |
|
|
|
this, |
|
|
|
R.string.firmware_installing |
|
|
|
) { progressCallback, _ -> |
|
|
|
var messageToShow: Any |
|
|
|
try { |
|
|
|
FileUtil.unzipToInternalStorage(BufferedInputStream(inputZip), cacheFirmwareDir) |
|
|
|
FileUtil.unzipToInternalStorage( |
|
|
|
result.toString(), |
|
|
|
cacheFirmwareDir, |
|
|
|
progressCallback |
|
|
|
) |
|
|
|
val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 |
|
|
|
val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 |
|
|
|
messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) { |
|
|
|
@ -404,18 +402,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
getString(R.string.save_file_imported_success) |
|
|
|
} |
|
|
|
} catch (e: Exception) { |
|
|
|
Log.error("[MainActivity] Firmware install failed - ${e.message}") |
|
|
|
messageToShow = getString(R.string.fatal_error) |
|
|
|
} finally { |
|
|
|
cacheFirmwareDir.deleteRecursively() |
|
|
|
} |
|
|
|
messageToShow |
|
|
|
} |
|
|
|
|
|
|
|
IndeterminateProgressDialogFragment.newInstance( |
|
|
|
this, |
|
|
|
R.string.firmware_installing, |
|
|
|
task = task |
|
|
|
).show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) |
|
|
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG) |
|
|
|
} |
|
|
|
|
|
|
|
val getAmiiboKey = |
|
|
|
@ -474,11 +467,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
return@registerForActivityResult |
|
|
|
} |
|
|
|
|
|
|
|
IndeterminateProgressDialogFragment.newInstance( |
|
|
|
ProgressDialogFragment.newInstance( |
|
|
|
this@MainActivity, |
|
|
|
R.string.verifying_content, |
|
|
|
false |
|
|
|
) { |
|
|
|
) { _, _ -> |
|
|
|
var updatesMatchProgram = true |
|
|
|
for (document in documents) { |
|
|
|
val valid = NativeLibrary.doesUpdateMatchProgram( |
|
|
|
@ -501,44 +494,42 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
positiveAction = { homeViewModel.setContentToInstall(documents) } |
|
|
|
) |
|
|
|
} |
|
|
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) |
|
|
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG) |
|
|
|
} |
|
|
|
|
|
|
|
private fun installContent(documents: List<Uri>) { |
|
|
|
IndeterminateProgressDialogFragment.newInstance( |
|
|
|
ProgressDialogFragment.newInstance( |
|
|
|
this@MainActivity, |
|
|
|
R.string.installing_game_content |
|
|
|
) { |
|
|
|
) { progressCallback, messageCallback -> |
|
|
|
var installSuccess = 0 |
|
|
|
var installOverwrite = 0 |
|
|
|
var errorBaseGame = 0 |
|
|
|
var errorExtension = 0 |
|
|
|
var errorOther = 0 |
|
|
|
var error = 0 |
|
|
|
documents.forEach { |
|
|
|
messageCallback.invoke(FileUtil.getFilename(it)) |
|
|
|
when ( |
|
|
|
NativeLibrary.installFileToNand( |
|
|
|
it.toString(), |
|
|
|
FileUtil.getExtension(it) |
|
|
|
InstallResult.from( |
|
|
|
NativeLibrary.installFileToNand( |
|
|
|
it.toString(), |
|
|
|
progressCallback |
|
|
|
) |
|
|
|
) |
|
|
|
) { |
|
|
|
NativeLibrary.InstallFileToNandResult.Success -> { |
|
|
|
InstallResult.Success -> { |
|
|
|
installSuccess += 1 |
|
|
|
} |
|
|
|
|
|
|
|
NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> { |
|
|
|
InstallResult.Overwrite -> { |
|
|
|
installOverwrite += 1 |
|
|
|
} |
|
|
|
|
|
|
|
NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> { |
|
|
|
InstallResult.BaseInstallAttempted -> { |
|
|
|
errorBaseGame += 1 |
|
|
|
} |
|
|
|
|
|
|
|
NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> { |
|
|
|
errorExtension += 1 |
|
|
|
} |
|
|
|
|
|
|
|
else -> { |
|
|
|
errorOther += 1 |
|
|
|
InstallResult.Failure -> { |
|
|
|
error += 1 |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -565,7 +556,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
) |
|
|
|
installResult.append(separator) |
|
|
|
} |
|
|
|
val errorTotal: Int = errorBaseGame + errorExtension + errorOther |
|
|
|
val errorTotal: Int = errorBaseGame + error |
|
|
|
if (errorTotal > 0) { |
|
|
|
installResult.append(separator) |
|
|
|
installResult.append( |
|
|
|
@ -582,14 +573,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
) |
|
|
|
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) { |
|
|
|
if (error > 0) { |
|
|
|
installResult.append( |
|
|
|
getString(R.string.install_game_content_failure_description) |
|
|
|
) |
|
|
|
@ -608,7 +592,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
descriptionString = installResult.toString().trim() |
|
|
|
) |
|
|
|
} |
|
|
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) |
|
|
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG) |
|
|
|
} |
|
|
|
|
|
|
|
val exportUserData = registerForActivityResult( |
|
|
|
@ -618,16 +602,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
return@registerForActivityResult |
|
|
|
} |
|
|
|
|
|
|
|
IndeterminateProgressDialogFragment.newInstance( |
|
|
|
ProgressDialogFragment.newInstance( |
|
|
|
this, |
|
|
|
R.string.exporting_user_data, |
|
|
|
true |
|
|
|
) { |
|
|
|
) { progressCallback, _ -> |
|
|
|
val zipResult = FileUtil.zipFromInternalStorage( |
|
|
|
File(DirectoryInitialization.userDirectory!!), |
|
|
|
DirectoryInitialization.userDirectory!!, |
|
|
|
BufferedOutputStream(contentResolver.openOutputStream(result)), |
|
|
|
taskViewModel.cancelled, |
|
|
|
progressCallback, |
|
|
|
compression = false |
|
|
|
) |
|
|
|
return@newInstance when (zipResult) { |
|
|
|
@ -635,7 +619,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
TaskState.Failed -> R.string.export_failed |
|
|
|
TaskState.Cancelled -> R.string.user_data_export_cancelled |
|
|
|
} |
|
|
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) |
|
|
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG) |
|
|
|
} |
|
|
|
|
|
|
|
val importUserData = |
|
|
|
@ -644,10 +628,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
return@registerForActivityResult |
|
|
|
} |
|
|
|
|
|
|
|
IndeterminateProgressDialogFragment.newInstance( |
|
|
|
ProgressDialogFragment.newInstance( |
|
|
|
this, |
|
|
|
R.string.importing_user_data |
|
|
|
) { |
|
|
|
) { progressCallback, _ -> |
|
|
|
val checkStream = |
|
|
|
ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result))) |
|
|
|
var isYuzuBackup = false |
|
|
|
@ -676,8 +660,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
// Copy archive to internal storage |
|
|
|
try { |
|
|
|
FileUtil.unzipToInternalStorage( |
|
|
|
BufferedInputStream(contentResolver.openInputStream(result)), |
|
|
|
File(DirectoryInitialization.userDirectory!!) |
|
|
|
result.toString(), |
|
|
|
File(DirectoryInitialization.userDirectory!!), |
|
|
|
progressCallback |
|
|
|
) |
|
|
|
} catch (e: Exception) { |
|
|
|
return@newInstance MessageDialogFragment.newInstance( |
|
|
|
@ -694,6 +679,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { |
|
|
|
driverViewModel.reloadDriverData() |
|
|
|
|
|
|
|
return@newInstance getString(R.string.user_data_import_success) |
|
|
|
}.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) |
|
|
|
}.show(supportFragmentManager, ProgressDialogFragment.TAG) |
|
|
|
} |
|
|
|
} |