diff options
-rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 217 | ||||
-rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileBrowserHelper.kt | 29 |
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 - } -} |