summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt217
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileBrowserHelper.kt29
2 files changed, 107 insertions, 139 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
index dd8750c4f..b87125d1c 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt
@@ -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,11 +132,7 @@ 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()
}
@@ -152,100 +140,6 @@ class MainActivity : AppCompatActivity(), MainView {
}
/**
- * @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.
*
* @param item The icon that was clicked on.
@@ -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()
+ }
+ }
+ }
+ }
+ }
}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileBrowserHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileBrowserHelper.kt
deleted file mode 100644
index 91f670255..000000000
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileBrowserHelper.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-package org.yuzu.yuzu_emu.utils
-
-import android.content.Intent
-import androidx.fragment.app.FragmentActivity
-
-object FileBrowserHelper {
- fun openDirectoryPicker(activity: FragmentActivity, requestCode: Int, title: Int) {
- val i = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
- i.putExtra(Intent.EXTRA_TITLE, title)
- activity.startActivityForResult(i, requestCode)
- }
-
- fun openFilePicker(activity: FragmentActivity, requestCode: Int, title: Int) {
- val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
- intent.addCategory(Intent.CATEGORY_OPENABLE)
- intent.flags =
- Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
- intent.putExtra(Intent.EXTRA_TITLE, title)
- intent.type = "*/*"
- activity.startActivityForResult(intent, requestCode)
- }
-
- fun getSelectedDirectory(result: Intent): String? {
- return result.dataString
- }
-}