91 lines
2.5 KiB
Kotlin
91 lines
2.5 KiB
Kotlin
package com.megboyzz
|
|
|
|
import android.content.Context
|
|
import android.hardware.input.InputManager
|
|
import android.view.InputDevice
|
|
import androidx.activity.ComponentActivity
|
|
import com.bda.controller.KeyEvent
|
|
import com.bda.controller.MotionEvent
|
|
import android.view.KeyEvent as androidKeyEvent
|
|
import android.view.MotionEvent as androidMotionEvent
|
|
import com.bda.controller.StateEvent
|
|
|
|
|
|
fun actionForAllControllers(
|
|
action: (Int) -> Unit
|
|
){
|
|
val deviceIds = InputDevice.getDeviceIds()
|
|
deviceIds.forEach {
|
|
if(deviceIsController(it)) action(it)
|
|
}
|
|
}
|
|
|
|
fun deviceIsController(deviceId: Int): Boolean {
|
|
val inputDevice = InputDevice.getDevice(deviceId) ?: return false
|
|
|
|
return (inputDevice.sources and InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD ||
|
|
(inputDevice.sources and InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK
|
|
}
|
|
|
|
fun Context.registerControllerHandlers(
|
|
onInputDeviceAdded: (Int) -> Unit,
|
|
onInputDeviceRemoved: (Int) -> Unit,
|
|
onInputDeviceChanged: (Int) -> Unit = {},
|
|
){
|
|
|
|
val inputManager = getSystemService(ComponentActivity.INPUT_SERVICE) as InputManager
|
|
|
|
inputManager.registerInputDeviceListener(object : InputManager.InputDeviceListener {
|
|
|
|
var lastControllerId: Int = 0;
|
|
|
|
override fun onInputDeviceAdded(deviceId: Int) {
|
|
if(deviceIsController(deviceId)) {
|
|
lastControllerId = deviceId
|
|
onInputDeviceAdded(deviceId)
|
|
}
|
|
}
|
|
|
|
override fun onInputDeviceRemoved(deviceId: Int) {
|
|
|
|
if(deviceIsController(deviceId) || lastControllerId == deviceId) onInputDeviceRemoved(deviceId)
|
|
}
|
|
|
|
override fun onInputDeviceChanged(deviceId: Int) {
|
|
if(deviceIsController(deviceId)) onInputDeviceChanged(deviceId)
|
|
}
|
|
}, null)
|
|
|
|
}
|
|
|
|
fun createDisconnectEvent(deviceId: Int) = StateEvent(
|
|
System.currentTimeMillis(),
|
|
deviceId,
|
|
StateEvent.STATE_UNKNOWN,
|
|
StateEvent.ACTION_DISCONNECTED
|
|
)
|
|
|
|
fun createConnectEvent(deviceId: Int) = StateEvent(
|
|
System.currentTimeMillis(),
|
|
deviceId,
|
|
StateEvent.STATE_CONNECTION,
|
|
StateEvent.ACTION_CONNECTED
|
|
)
|
|
|
|
fun androidKeyEventToBda(keyEvent: androidKeyEvent) = KeyEvent(
|
|
keyEvent.eventTime,
|
|
keyEvent.deviceId,
|
|
keyEvent.keyCode,
|
|
keyEvent.action
|
|
)
|
|
|
|
fun androidMotionEventToBda(motionEvent: androidMotionEvent) = MotionEvent(
|
|
motionEvent.eventTime,
|
|
motionEvent.deviceId,
|
|
motionEvent.x,
|
|
motionEvent.y,
|
|
motionEvent.rawX,
|
|
motionEvent.rawY,
|
|
motionEvent.xPrecision,
|
|
motionEvent.yPrecision
|
|
) |