|
|
|
@ -5,12 +5,12 @@ package org.yuzu.yuzu_emu.ui.main |
|
|
|
|
|
|
|
import android.content.DialogInterface |
|
|
|
import android.content.Intent |
|
|
|
import android.net.Uri |
|
|
|
import android.os.Bundle |
|
|
|
import android.view.Menu |
|
|
|
import android.view.MenuItem |
|
|
|
import android.view.View |
|
|
|
import android.widget.Toast |
|
|
|
import androidx.activity.result.contract.ActivityResultContracts |
|
|
|
import androidx.appcompat.app.AppCompatActivity |
|
|
|
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen |
|
|
|
import androidx.core.view.ViewCompat |
|
|
|
@ -110,16 +110,8 @@ class MainActivity : AppCompatActivity(), MainView { |
|
|
|
|
|
|
|
override fun launchFileListActivity(request: Int) { |
|
|
|
when (request) { |
|
|
|
MainPresenter.REQUEST_ADD_DIRECTORY -> FileBrowserHelper.openDirectoryPicker( |
|
|
|
this, |
|
|
|
MainPresenter.REQUEST_ADD_DIRECTORY, |
|
|
|
R.string.select_game_folder |
|
|
|
) |
|
|
|
MainPresenter.REQUEST_INSTALL_KEYS -> FileBrowserHelper.openFilePicker( |
|
|
|
this, |
|
|
|
MainPresenter.REQUEST_INSTALL_KEYS, |
|
|
|
R.string.install_keys |
|
|
|
) |
|
|
|
MainPresenter.REQUEST_ADD_DIRECTORY -> getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) |
|
|
|
MainPresenter.REQUEST_INSTALL_KEYS -> getProdKey.launch(arrayOf("*/*")) |
|
|
|
MainPresenter.REQUEST_SELECT_GPU_DRIVER -> { |
|
|
|
// Get the driver name for the dialog message. |
|
|
|
var driverName = GpuDriverHelper.customDriverName |
|
|
|
@ -140,111 +132,13 @@ class MainActivity : AppCompatActivity(), MainView { |
|
|
|
).show() |
|
|
|
} |
|
|
|
.setNeutralButton(R.string.select_gpu_driver_install) { _: DialogInterface?, _: Int -> |
|
|
|
FileBrowserHelper.openFilePicker( |
|
|
|
this, |
|
|
|
MainPresenter.REQUEST_SELECT_GPU_DRIVER, |
|
|
|
R.string.select_gpu_driver |
|
|
|
) |
|
|
|
getDriver.launch(arrayOf("application/zip")) |
|
|
|
} |
|
|
|
.show() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param requestCode An int describing whether the Activity that is returning did so successfully. |
|
|
|
* @param resultCode An int describing what Activity is giving us this callback. |
|
|
|
* @param result The information the returning Activity is providing us. |
|
|
|
*/ |
|
|
|
override fun onActivityResult(requestCode: Int, resultCode: Int, result: Intent?) { |
|
|
|
super.onActivityResult(requestCode, resultCode, result) |
|
|
|
when (requestCode) { |
|
|
|
MainPresenter.REQUEST_ADD_DIRECTORY -> if (resultCode == RESULT_OK) { |
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
Uri.parse(result!!.dataString), |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
// When a new directory is picked, we currently will reset the existing games |
|
|
|
// database. This effectively means that only one game directory is supported. |
|
|
|
// TODO(bunnei): Consider fixing this in the future, or removing code for this. |
|
|
|
contentResolver.insert(GameProvider.URI_RESET, null) |
|
|
|
// Add the new directory |
|
|
|
presenter.onDirectorySelected(FileBrowserHelper.getSelectedDirectory(result)) |
|
|
|
} |
|
|
|
MainPresenter.REQUEST_INSTALL_KEYS -> if (resultCode == RESULT_OK) { |
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
Uri.parse(result!!.dataString), |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
val dstPath = DirectoryInitialization.userDirectory + "/keys/" |
|
|
|
if (FileUtil.copyUriToInternalStorage(this, result.data, dstPath, "prod.keys")) { |
|
|
|
if (NativeLibrary.ReloadKeys()) { |
|
|
|
Toast.makeText( |
|
|
|
this, |
|
|
|
R.string.install_keys_success, |
|
|
|
Toast.LENGTH_SHORT |
|
|
|
).show() |
|
|
|
refreshFragment() |
|
|
|
} else { |
|
|
|
Toast.makeText( |
|
|
|
this, |
|
|
|
R.string.install_keys_failure, |
|
|
|
Toast.LENGTH_LONG |
|
|
|
).show() |
|
|
|
launchFileListActivity(MainPresenter.REQUEST_INSTALL_KEYS) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
MainPresenter.REQUEST_SELECT_GPU_DRIVER -> if (resultCode == RESULT_OK) { |
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
Uri.parse(result!!.dataString), |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
|
|
|
|
val progressBinding = DialogProgressBarBinding.inflate(layoutInflater) |
|
|
|
progressBinding.progressBar.isIndeterminate = true |
|
|
|
val installationDialog = MaterialAlertDialogBuilder(this) |
|
|
|
.setTitle(R.string.installing_driver) |
|
|
|
.setView(progressBinding.root) |
|
|
|
.show() |
|
|
|
|
|
|
|
lifecycleScope.launch { |
|
|
|
withContext(Dispatchers.IO) { |
|
|
|
// Ignore file exceptions when a user selects an invalid zip |
|
|
|
try { |
|
|
|
GpuDriverHelper.installCustomDriver(applicationContext, result.data) |
|
|
|
} catch (_: IOException) {} |
|
|
|
|
|
|
|
withContext(Dispatchers.Main) { |
|
|
|
installationDialog.dismiss() |
|
|
|
|
|
|
|
val driverName = GpuDriverHelper.customDriverName |
|
|
|
if (driverName != null) { |
|
|
|
Toast.makeText( |
|
|
|
applicationContext, |
|
|
|
getString(R.string.select_gpu_driver_install_success, driverName), |
|
|
|
Toast.LENGTH_SHORT |
|
|
|
).show() |
|
|
|
} else { |
|
|
|
Toast.makeText( |
|
|
|
applicationContext, |
|
|
|
R.string.select_gpu_driver_error, |
|
|
|
Toast.LENGTH_LONG |
|
|
|
).show() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Called by the framework whenever any actionbar/toolbar icon is clicked. |
|
|
|
* |
|
|
|
@ -275,4 +169,107 @@ class MainActivity : AppCompatActivity(), MainView { |
|
|
|
windowInsets |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private val getGamesDirectory = |
|
|
|
registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> |
|
|
|
if (result == null) |
|
|
|
return@registerForActivityResult |
|
|
|
|
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
result, |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
|
|
|
|
// When a new directory is picked, we currently will reset the existing games |
|
|
|
// database. This effectively means that only one game directory is supported. |
|
|
|
// TODO(bunnei): Consider fixing this in the future, or removing code for this. |
|
|
|
contentResolver.insert(GameProvider.URI_RESET, null) |
|
|
|
// Add the new directory |
|
|
|
presenter.onDirectorySelected(result.toString()) |
|
|
|
} |
|
|
|
|
|
|
|
private val getProdKey = |
|
|
|
registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> |
|
|
|
if (result == null) |
|
|
|
return@registerForActivityResult |
|
|
|
|
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
result, |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
|
|
|
|
val dstPath = DirectoryInitialization.userDirectory + "/keys/" |
|
|
|
if (FileUtil.copyUriToInternalStorage(this, result, dstPath, "prod.keys")) { |
|
|
|
if (NativeLibrary.ReloadKeys()) { |
|
|
|
Toast.makeText( |
|
|
|
this, |
|
|
|
R.string.install_keys_success, |
|
|
|
Toast.LENGTH_SHORT |
|
|
|
).show() |
|
|
|
refreshFragment() |
|
|
|
} else { |
|
|
|
Toast.makeText( |
|
|
|
this, |
|
|
|
R.string.install_keys_failure, |
|
|
|
Toast.LENGTH_LONG |
|
|
|
).show() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private val getDriver = |
|
|
|
registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> |
|
|
|
if (result == null) |
|
|
|
return@registerForActivityResult |
|
|
|
|
|
|
|
val takeFlags = |
|
|
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
|
contentResolver.takePersistableUriPermission( |
|
|
|
result, |
|
|
|
takeFlags |
|
|
|
) |
|
|
|
|
|
|
|
val progressBinding = DialogProgressBarBinding.inflate(layoutInflater) |
|
|
|
progressBinding.progressBar.isIndeterminate = true |
|
|
|
val installationDialog = MaterialAlertDialogBuilder(this) |
|
|
|
.setTitle(R.string.installing_driver) |
|
|
|
.setView(progressBinding.root) |
|
|
|
.show() |
|
|
|
|
|
|
|
lifecycleScope.launch { |
|
|
|
withContext(Dispatchers.IO) { |
|
|
|
// Ignore file exceptions when a user selects an invalid zip |
|
|
|
try { |
|
|
|
GpuDriverHelper.installCustomDriver(applicationContext, result) |
|
|
|
} catch (_: IOException) { |
|
|
|
} |
|
|
|
|
|
|
|
withContext(Dispatchers.Main) { |
|
|
|
installationDialog.dismiss() |
|
|
|
|
|
|
|
val driverName = GpuDriverHelper.customDriverName |
|
|
|
if (driverName != null) { |
|
|
|
Toast.makeText( |
|
|
|
applicationContext, |
|
|
|
getString( |
|
|
|
R.string.select_gpu_driver_install_success, |
|
|
|
driverName |
|
|
|
), |
|
|
|
Toast.LENGTH_SHORT |
|
|
|
).show() |
|
|
|
} else { |
|
|
|
Toast.makeText( |
|
|
|
applicationContext, |
|
|
|
R.string.select_gpu_driver_error, |
|
|
|
Toast.LENGTH_LONG |
|
|
|
).show() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |