android: Fix crash when user directory permissions are lost (#1110)

* android: Fix crash when user directory permissions are lost

---------

Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
This commit is contained in:
PabloMK7 2025-06-03 23:06:46 +02:00 committed by GitHub
parent 2acbcd333c
commit fe7fe3ed24
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 21 additions and 13 deletions

View File

@ -27,7 +27,7 @@ class SelectUserDirectoryDialogFragment : DialogFragment() {
.setTitle(R.string.select_citra_user_folder)
.setMessage(R.string.selecting_user_directory_without_write_permissions)
.setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int ->
mainActivity?.openCitraDirectory?.launch(null)
mainActivity?.openCitraDirectoryLostPermission?.launch(null)
}
.show()
}

View File

@ -478,7 +478,7 @@ class SetupFragment : Fragment() {
return@registerForActivityResult
}
CitraDirectoryHelper(requireActivity()).showCitraDirectoryDialog(result, pageButtonCallback, checkForButtonState)
CitraDirectoryHelper(requireActivity(), true).showCitraDirectoryDialog(result, pageButtonCallback, checkForButtonState)
}
private val getGamesDirectory =

View File

@ -12,6 +12,7 @@ import android.view.ViewGroup.MarginLayoutParams
import android.view.WindowManager
import android.view.animation.PathInterpolator
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
@ -307,15 +308,21 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
windowInsets
}
val openCitraDirectory = registerForActivityResult(
ActivityResultContracts.OpenDocumentTree()
) { result: Uri? ->
private fun createOpenCitraDirectoryLauncher(
permissionsLost: Boolean
): ActivityResultLauncher<Uri?> {
return registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result: Uri? ->
if (result == null) {
return@registerForActivityResult
}
CitraDirectoryHelper(this@MainActivity).showCitraDirectoryDialog(result, buttonState = {})
CitraDirectoryHelper(this@MainActivity, permissionsLost)
.showCitraDirectoryDialog(result, buttonState = {})
}
}
val openCitraDirectory = createOpenCitraDirectoryLauncher(permissionsLost = false)
val openCitraDirectoryLostPermission = createOpenCitraDirectoryLauncher(permissionsLost = true)
val ciaFileInstaller = registerForActivityResult(
OpenFileResultContract()

View File

@ -16,7 +16,7 @@ import org.citra.citra_emu.viewmodel.HomeViewModel
/**
* Citra directory initialization ui flow controller.
*/
class CitraDirectoryHelper(private val fragmentActivity: FragmentActivity) {
class CitraDirectoryHelper(private val fragmentActivity: FragmentActivity, private val lostPermission: Boolean) {
fun showCitraDirectoryDialog(result: Uri, callback: SetupCallback? = null, buttonState: () -> Unit) {
val citraDirectoryDialog = CitraDirectoryDialogFragment.newInstance(
fragmentActivity,
@ -24,7 +24,7 @@ class CitraDirectoryHelper(private val fragmentActivity: FragmentActivity) {
CitraDirectoryDialogFragment.Listener { moveData: Boolean, path: Uri ->
val previous = PermissionsHandler.citraDirectory
// Do noting if user select the previous path.
if (path == previous) {
if (path == previous && !lostPermission) {
return@Listener
}

View File

@ -1,4 +1,4 @@
// Copyright 2023 Citra Emulator Project
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
@ -34,7 +34,8 @@ object PermissionsHandler {
context.contentResolver.releasePersistableUriPermission(uri, takeFlags)
} catch (e: Exception) {
Log.error("[PermissionsHandler]: Cannot check citra data directory permission, error: " + e.message)
// Do not use native library logging, as the native library may not be loaded yet
android.util.Log.e("PermissionsHandler", "Cannot check citra data directory permission, error: ${e.message}")
}
return false
}