summaryrefslogtreecommitdiff
path: root/Source/Android
diff options
context:
space:
mode:
authorSergio Torres <sergiotorres20000@gmail.com>2026-08-25 23:40:07 +0200
committerSergio Torres <sergiotorres20000@gmail.com>2026-08-26 00:49:43 +0200
commitb1e360e1e4f520818f6e0c8fdcd5be7becf7e1ed (patch)
treea4939f1c74c5c65639e932310a361a0a0ad49428 /Source/Android
parent123d32248e455ec242866e3a75fea70dcecfd567 (diff)
Android: Use OpenDocument for NFC figures and fix crash (Fixes #13956)
- Switch from ActivityResultContracts.GetContent() to OpenDocument() which restores ACTION_OPEN_DOCUMENT behavior, granting write access to file descriptors opened in C++ via ContentHandler.openFd(). - Replace unsafe force-unwraps (!!) in EmulationActivity with null checks.
Diffstat (limited to 'Source/Android')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt29
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/infinitybase/ui/FigureSlotAdapter.kt2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/skylanders/ui/SkylanderSlotAdapter.kt2
-rw-r--r--Source/Android/app/src/main/res/values/strings.xml1
4 files changed, 21 insertions, 13 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt
index 8a1d8addbd..23ffe96cd6 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt
@@ -43,6 +43,7 @@ import org.dolphinemu.dolphinemu.features.infinitybase.ui.FigureSlotAdapter
import org.dolphinemu.dolphinemu.features.input.model.ControllerInterface
import org.dolphinemu.dolphinemu.features.input.model.DolphinSensorEventListener
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting
+import org.dolphinemu.dolphinemu.utils.ContentHandler
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting
import org.dolphinemu.dolphinemu.features.settings.model.Settings
import org.dolphinemu.dolphinemu.features.settings.model.StringSetting
@@ -104,17 +105,21 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider {
}
val requestSkylanderFile = registerForActivityResult(
- ActivityResultContracts.GetContent()
+ ActivityResultContracts.OpenDocument()
) { uri: Uri? ->
if (uri != null) {
val slot = SkylanderConfig.loadSkylander(
skylanderSlots[skylanderSlot].portalSlot,
uri.toString()
- )!!
- clearSkylander(skylanderSlot)
- skylanderSlots[skylanderSlot].portalSlot = slot.first!!
- skylanderSlots[skylanderSlot].label = slot.second!!
- skylandersBinding.figureManager.adapter!!.notifyItemChanged(skylanderSlot)
+ )
+ if (slot != null && slot.first != null && slot.second != null) {
+ clearSkylander(skylanderSlot)
+ skylanderSlots[skylanderSlot].portalSlot = slot.first!!
+ skylanderSlots[skylanderSlot].label = slot.second!!
+ skylandersBinding.figureManager.adapter?.notifyItemChanged(skylanderSlot)
+ } else {
+ Toast.makeText(this, R.string.skylander_load_failed, Toast.LENGTH_SHORT).show()
+ }
skylanderSlot = -1
skylanderData = Skylander.BLANK_SKYLANDER
}
@@ -131,10 +136,12 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider {
uri.toString(),
skylanderSlots[skylanderSlot].portalSlot
)
- clearSkylander(skylanderSlot)
- skylanderSlots[skylanderSlot].portalSlot = slot.first
- skylanderSlots[skylanderSlot].label = slot.second
- skylandersBinding.figureManager.adapter?.notifyItemChanged(skylanderSlot)
+ if (slot.first != -1) {
+ clearSkylander(skylanderSlot)
+ skylanderSlots[skylanderSlot].portalSlot = slot.first
+ skylanderSlots[skylanderSlot].label = slot.second
+ skylandersBinding.figureManager.adapter?.notifyItemChanged(skylanderSlot)
+ }
skylanderSlot = -1
skylanderData = Skylander.BLANK_SKYLANDER
}
@@ -142,7 +149,7 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider {
}
val requestInfinityFigureFile = registerForActivityResult(
- ActivityResultContracts.GetContent()
+ ActivityResultContracts.OpenDocument()
) { uri: Uri? ->
if (uri != null) {
val label = InfinityConfig.loadFigure(infinityPosition, uri.toString())
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/infinitybase/ui/FigureSlotAdapter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/infinitybase/ui/FigureSlotAdapter.kt
index 0613274c30..6839d6f803 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/infinitybase/ui/FigureSlotAdapter.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/infinitybase/ui/FigureSlotAdapter.kt
@@ -51,7 +51,7 @@ class FigureSlotAdapter(
holder.binding.buttonLoadFigure.setOnClickListener {
activity.setInfinityFigureData(0, "", figure.position, position)
- activity.requestInfinityFigureFile.launch("*/*")
+ activity.requestInfinityFigureFile.launch(arrayOf("*/*"))
}
val inflater = LayoutInflater.from(activity)
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/skylanders/ui/SkylanderSlotAdapter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/skylanders/ui/SkylanderSlotAdapter.kt
index ed3dde3e40..4c23eb4a3c 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/skylanders/ui/SkylanderSlotAdapter.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/skylanders/ui/SkylanderSlotAdapter.kt
@@ -47,7 +47,7 @@ class SkylanderSlotAdapter(
holder.binding.buttonLoadFigure.setOnClickListener {
activity.setSkylanderData(0, 0, "", position)
- activity.requestSkylanderFile.launch("*/*")
+ activity.requestSkylanderFile.launch(arrayOf("*/*"))
}
val inflater = LayoutInflater.from(activity)
diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index 2f41de8fc7..ccd5ee3b70 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -956,6 +956,7 @@ It can efficiently compress both junk data and encrypted Wii data.
<string name="skylander_id">ID</string>
<string name="skylander_variant">Variant</string>
<string name="invalid_skylander">Invalid Skylander Selection</string>
+ <string name="skylander_load_failed">Failed to load Skylander figure</string>
<string name="emulate_infinity_base">Infinity Base</string>
<string name="infinity_manager">Infinity Manager</string>