Android: Update advanced mapping dialog when devices change

Without this, there was a bug where if you turned the device's screen
off and on again while in the advanced mapping dialog, the input
indicators would stop updating. This is because turning the screen on
again causes devices to refresh, which causes all devices to be
recreated, leaving the AdvancedMappingControlViewHolders stuck
referencing controls belonging to devices that are no longer being
updated.
This commit is contained in:
JosJuice
2025-05-16 18:12:21 +02:00
parent 1002f29691
commit 43b254aaad
3 changed files with 47 additions and 5 deletions

View File

@ -30,10 +30,14 @@ object ControllerInterface {
private var inputStateUpdatePending = AtomicBoolean(false)
private val inputStateVersion = MutableLiveData(0)
private val devicesVersion = MutableLiveData(0)
val inputStateChanged: LiveData<Int>
get() = inputStateVersion
val devicesChanged: LiveData<Int>
get() = devicesVersion
/**
* Activities which want to pass on inputs to native code
* should call this in their own dispatchKeyEvent method.
@ -117,6 +121,14 @@ object ControllerInterface {
}
}
@Keep
@JvmStatic
private fun onDevicesChanged() {
Handler(Looper.getMainLooper()).post {
devicesVersion.value = devicesVersion.value?.plus(1)
}
}
@Keep
@JvmStatic
private fun registerInputDeviceListener() {

View File

@ -25,7 +25,7 @@ class AdvancedMappingDialog(
private val controlReference: ControlReference,
private val controller: EmulatedController
) : AlertDialog(context), OnItemClickListener {
private val devices: Array<String> = ControllerInterface.getAllDeviceStrings()
private lateinit var devices: Array<String>
private val controlAdapter: AdvancedMappingControlAdapter
private lateinit var selectedDevice: String
@ -36,10 +36,6 @@ class AdvancedMappingDialog(
binding.dropdownDevice.onItemClickListener = this
val deviceAdapter =
ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, devices)
binding.dropdownDevice.setAdapter(deviceAdapter)
controlAdapter = AdvancedMappingControlAdapter(lifecycle, controlReference.isInput()) {
control: String -> onControlClicked(control)
}
@ -52,6 +48,12 @@ class AdvancedMappingDialog(
binding.editExpression.setText(controlReference.getExpression())
ControllerInterface.devicesChanged.observe(this) {
onDevicesChanged()
setSelectedDevice(selectedDevice)
}
onDevicesChanged()
selectDefaultDevice()
}
@ -72,6 +74,13 @@ class AdvancedMappingDialog(
return super.dispatchGenericMotionEvent(event)
}
private fun onDevicesChanged() {
devices = ControllerInterface.getAllDeviceStrings()
binding.dropdownDevice.setAdapter(
ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, devices)
)
}
private fun setSelectedDevice(deviceString: String) {
selectedDevice = deviceString