diff options
| author | 2023-06-01 14:16:57 -0400 | |
|---|---|---|
| committer | 2023-06-03 00:06:08 -0700 | |
| commit | 20abd49a21e977d0ca3f2175b5ae9ce4a5ea4bff (patch) | |
| tree | beada6d5fe0cbeabad11e1ca396201ed07fbb546 | |
| parent | android: vk_turbo_mode: Remove unnecessary device recreation. (diff) | |
| download | yuzu-20abd49a21e977d0ca3f2175b5ae9ce4a5ea4bff.tar.gz yuzu-20abd49a21e977d0ca3f2175b5ae9ce4a5ea4bff.tar.xz yuzu-20abd49a21e977d0ca3f2175b5ae9ce4a5ea4bff.zip | |
android: Warning dialogs for key errors
Diffstat (limited to '')
3 files changed, 95 insertions, 31 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt new file mode 100644 index 000000000..2db38fdc2 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.fragments | ||
| 5 | |||
| 6 | import android.app.Dialog | ||
| 7 | import android.content.Intent | ||
| 8 | import android.net.Uri | ||
| 9 | import android.os.Bundle | ||
| 10 | import androidx.fragment.app.DialogFragment | ||
| 11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | ||
| 12 | import org.yuzu.yuzu_emu.R | ||
| 13 | |||
| 14 | class MessageDialogFragment : DialogFragment() { | ||
| 15 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { | ||
| 16 | val titleId = requireArguments().getInt(TITLE) | ||
| 17 | val descriptionId = requireArguments().getInt(DESCRIPTION) | ||
| 18 | val helpLinkId = requireArguments().getInt(HELP_LINK) | ||
| 19 | |||
| 20 | val dialog = MaterialAlertDialogBuilder(requireContext()) | ||
| 21 | .setPositiveButton(R.string.close, null) | ||
| 22 | .setTitle(titleId) | ||
| 23 | .setMessage(descriptionId) | ||
| 24 | |||
| 25 | if (helpLinkId != 0) { | ||
| 26 | dialog.setNeutralButton(R.string.learn_more) { _, _ -> | ||
| 27 | openLink(getString(helpLinkId)) | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | return dialog.show() | ||
| 32 | } | ||
| 33 | |||
| 34 | private fun openLink(link: String) { | ||
| 35 | val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) | ||
| 36 | startActivity(intent) | ||
| 37 | } | ||
| 38 | |||
| 39 | companion object { | ||
| 40 | const val TAG = "MessageDialogFragment" | ||
| 41 | |||
| 42 | private const val TITLE = "Title" | ||
| 43 | private const val DESCRIPTION = "Description" | ||
| 44 | private const val HELP_LINK = "Link" | ||
| 45 | |||
| 46 | fun newInstance( | ||
| 47 | titleId: Int, | ||
| 48 | descriptionId: Int, | ||
| 49 | helpLinkId: Int = 0 | ||
| 50 | ): MessageDialogFragment { | ||
| 51 | val dialog = MessageDialogFragment() | ||
| 52 | val bundle = Bundle() | ||
| 53 | bundle.apply { | ||
| 54 | putInt(TITLE, titleId) | ||
| 55 | putInt(DESCRIPTION, descriptionId) | ||
| 56 | putInt(HELP_LINK, helpLinkId) | ||
| 57 | } | ||
| 58 | dialog.arguments = bundle | ||
| 59 | return dialog | ||
| 60 | } | ||
| 61 | } | ||
| 62 | } | ||
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 b1329db74..f8bca11bb 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 | |||
| @@ -37,6 +37,7 @@ import org.yuzu.yuzu_emu.databinding.DialogProgressBarBinding | |||
| 37 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 37 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 38 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity | 38 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity |
| 39 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | 39 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile |
| 40 | import org.yuzu.yuzu_emu.fragments.MessageDialogFragment | ||
| 40 | import org.yuzu.yuzu_emu.model.GamesViewModel | 41 | import org.yuzu.yuzu_emu.model.GamesViewModel |
| 41 | import org.yuzu.yuzu_emu.model.HomeViewModel | 42 | import org.yuzu.yuzu_emu.model.HomeViewModel |
| 42 | import org.yuzu.yuzu_emu.utils.* | 43 | import org.yuzu.yuzu_emu.utils.* |
| @@ -251,11 +252,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 251 | if (result == null) | 252 | if (result == null) |
| 252 | return@registerForActivityResult | 253 | return@registerForActivityResult |
| 253 | 254 | ||
| 254 | val takeFlags = | ||
| 255 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION | ||
| 256 | contentResolver.takePersistableUriPermission( | 255 | contentResolver.takePersistableUriPermission( |
| 257 | result, | 256 | result, |
| 258 | takeFlags | 257 | Intent.FLAG_GRANT_READ_URI_PERMISSION |
| 259 | ) | 258 | ) |
| 260 | 259 | ||
| 261 | // When a new directory is picked, we currently will reset the existing games | 260 | // When a new directory is picked, we currently will reset the existing games |
| @@ -279,19 +278,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 279 | return@registerForActivityResult | 278 | return@registerForActivityResult |
| 280 | 279 | ||
| 281 | if (!FileUtil.hasExtension(result.toString(), "keys")) { | 280 | if (!FileUtil.hasExtension(result.toString(), "keys")) { |
| 282 | Toast.makeText( | 281 | MessageDialogFragment.newInstance( |
| 283 | applicationContext, | 282 | R.string.reading_keys_failure, |
| 284 | R.string.invalid_keys_file, | 283 | R.string.install_keys_failure_extension_description |
| 285 | Toast.LENGTH_SHORT | 284 | ).show(supportFragmentManager, MessageDialogFragment.TAG) |
| 286 | ).show() | ||
| 287 | return@registerForActivityResult | 285 | return@registerForActivityResult |
| 288 | } | 286 | } |
| 289 | 287 | ||
| 290 | val takeFlags = | ||
| 291 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION | ||
| 292 | contentResolver.takePersistableUriPermission( | 288 | contentResolver.takePersistableUriPermission( |
| 293 | result, | 289 | result, |
| 294 | takeFlags | 290 | Intent.FLAG_GRANT_READ_URI_PERMISSION |
| 295 | ) | 291 | ) |
| 296 | 292 | ||
| 297 | val dstPath = DirectoryInitialization.userDirectory + "/keys/" | 293 | val dstPath = DirectoryInitialization.userDirectory + "/keys/" |
| @@ -310,11 +306,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 310 | ).show() | 306 | ).show() |
| 311 | gamesViewModel.reloadGames(true) | 307 | gamesViewModel.reloadGames(true) |
| 312 | } else { | 308 | } else { |
| 313 | Toast.makeText( | 309 | MessageDialogFragment.newInstance( |
| 314 | applicationContext, | 310 | R.string.invalid_keys_error, |
| 315 | R.string.install_keys_failure, | 311 | R.string.install_keys_failure_description, |
| 316 | Toast.LENGTH_LONG | 312 | R.string.dumping_keys_quickstart_link |
| 317 | ).show() | 313 | ).show(supportFragmentManager, MessageDialogFragment.TAG) |
| 318 | } | 314 | } |
| 319 | } | 315 | } |
| 320 | } | 316 | } |
| @@ -325,19 +321,16 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 325 | return@registerForActivityResult | 321 | return@registerForActivityResult |
| 326 | 322 | ||
| 327 | if (!FileUtil.hasExtension(result.toString(), "bin")) { | 323 | if (!FileUtil.hasExtension(result.toString(), "bin")) { |
| 328 | Toast.makeText( | 324 | MessageDialogFragment.newInstance( |
| 329 | applicationContext, | 325 | R.string.reading_keys_failure, |
| 330 | R.string.invalid_keys_file, | 326 | R.string.install_keys_failure_extension_description |
| 331 | Toast.LENGTH_SHORT | 327 | ).show(supportFragmentManager, MessageDialogFragment.TAG) |
| 332 | ).show() | ||
| 333 | return@registerForActivityResult | 328 | return@registerForActivityResult |
| 334 | } | 329 | } |
| 335 | 330 | ||
| 336 | val takeFlags = | ||
| 337 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION | ||
| 338 | contentResolver.takePersistableUriPermission( | 331 | contentResolver.takePersistableUriPermission( |
| 339 | result, | 332 | result, |
| 340 | takeFlags | 333 | Intent.FLAG_GRANT_READ_URI_PERMISSION |
| 341 | ) | 334 | ) |
| 342 | 335 | ||
| 343 | val dstPath = DirectoryInitialization.userDirectory + "/keys/" | 336 | val dstPath = DirectoryInitialization.userDirectory + "/keys/" |
| @@ -355,11 +348,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { | |||
| 355 | Toast.LENGTH_SHORT | 348 | Toast.LENGTH_SHORT |
| 356 | ).show() | 349 | ).show() |
| 357 | } else { | 350 | } else { |
| 358 | Toast.makeText( | 351 | MessageDialogFragment.newInstance( |
| 359 | applicationContext, | 352 | R.string.invalid_keys_error, |
| 360 | R.string.install_amiibo_keys_failure, | 353 | R.string.install_keys_failure_description, |
| 361 | Toast.LENGTH_LONG | 354 | R.string.dumping_keys_quickstart_link |
| 362 | ).show() | 355 | ).show(supportFragmentManager, MessageDialogFragment.TAG) |
| 363 | } | 356 | } |
| 364 | } | 357 | } |
| 365 | } | 358 | } |
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5e44551ad..afc681fed 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml | |||
| @@ -64,8 +64,15 @@ | |||
| 64 | <string name="install_amiibo_keys_description">Required to use Amiibo in game</string> | 64 | <string name="install_amiibo_keys_description">Required to use Amiibo in game</string> |
| 65 | <string name="invalid_keys_file">Invalid keys file selected</string> | 65 | <string name="invalid_keys_file">Invalid keys file selected</string> |
| 66 | <string name="install_keys_success">Keys successfully installed</string> | 66 | <string name="install_keys_success">Keys successfully installed</string> |
| 67 | <string name="install_keys_failure">Keys file (prod.keys) is invalid</string> | 67 | <string name="reading_keys_failure">Error reading encryption keys</string> |
| 68 | <string name="install_amiibo_keys_failure">Keys file (key_retail.bin) is invalid</string> | 68 | <string name="install_keys_failure_extension_description"> |
| 69 | 1. Verify your keys have the .keys extension.\n\n | ||
| 70 | 2. Keys must not be stored in the Downloads folder.\n\n | ||
| 71 | Resolve the issue(s) and try again. | ||
| 72 | </string> | ||
| 73 | <string name="invalid_keys_error">Invalid encryption keys</string> | ||
| 74 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | ||
| 75 | <string name="install_keys_failure_description">The selected file is incorrect or corrupt. Please redump your keys.</string> | ||
| 69 | <string name="install_gpu_driver">Install GPU driver</string> | 76 | <string name="install_gpu_driver">Install GPU driver</string> |
| 70 | <string name="install_gpu_driver_description">Install alternative drivers for potentially better performance or accuracy</string> | 77 | <string name="install_gpu_driver_description">Install alternative drivers for potentially better performance or accuracy</string> |
| 71 | <string name="advanced_settings">Advanced settings</string> | 78 | <string name="advanced_settings">Advanced settings</string> |
| @@ -164,6 +171,8 @@ | |||
| 164 | <string name="reset_all_settings">Reset all settings?</string> | 171 | <string name="reset_all_settings">Reset all settings?</string> |
| 165 | <string name="reset_all_settings_description">All Advanced Settings will be reset to their default configuration. This can not be undone.</string> | 172 | <string name="reset_all_settings_description">All Advanced Settings will be reset to their default configuration. This can not be undone.</string> |
| 166 | <string name="settings_reset">Settings reset</string> | 173 | <string name="settings_reset">Settings reset</string> |
| 174 | <string name="close">Close</string> | ||
| 175 | <string name="learn_more">Learn More</string> | ||
| 167 | 176 | ||
| 168 | <!-- GPU driver installation --> | 177 | <!-- GPU driver installation --> |
| 169 | <string name="select_gpu_driver">Select GPU driver</string> | 178 | <string name="select_gpu_driver">Select GPU driver</string> |