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