diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt index 634e7b372..988f90ccc 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt @@ -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() } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt index eecf3e4f9..fa47f99b8 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt @@ -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 = diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt index d88d61103..3e4f36591 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt @@ -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,16 +308,22 @@ class MainActivity : AppCompatActivity(), ThemeProvider { windowInsets } - val openCitraDirectory = registerForActivityResult( - ActivityResultContracts.OpenDocumentTree() - ) { result: Uri? -> - if (result == null) { - return@registerForActivityResult - } + private fun createOpenCitraDirectoryLauncher( + permissionsLost: Boolean + ): ActivityResultLauncher { + 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() ) { result: Intent? -> diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/CitraDirectoryHelper.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/CitraDirectoryHelper.kt index fa492a7bf..58eb5cc22 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/CitraDirectoryHelper.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/CitraDirectoryHelper.kt @@ -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 } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt index 913780964..8f1e9193f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt @@ -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 }