package com.ea.ironmonkey import android.content.Context import android.hardware.input.InputManager import android.util.Log import android.view.InputDevice import androidx.activity.ComponentActivity import com.bda.controller.ControllerListener import com.bda.controller.KeyEvent import com.bda.controller.MotionEvent import com.bda.controller.StateEvent object MogaController : ControllerListener { external fun nativeOnKeyEvent(keyEvent: KeyEvent?) external fun nativeOnMotionEvent(motionEvent: MotionEvent?) external fun nativeOnStateEvent(stateEvent: StateEvent?) override fun onKeyEvent(keyEvent: KeyEvent?) { nativeOnKeyEvent(keyEvent) } override fun onMotionEvent(motionEvent: MotionEvent?) { nativeOnMotionEvent(motionEvent) } override fun onStateEvent(stateEvent: StateEvent?) { nativeOnStateEvent(stateEvent) } fun doForAllControllers( action: (Int) -> Unit ){ val deviceIds = InputDevice.getDeviceIds() deviceIds.forEach { if(deviceIsController(it)) action(it) } } infix fun Int.isFlag(flag: Int) = this and flag == flag fun deviceIsController(deviceId: Int): Boolean { val inputDevice = InputDevice.getDevice(deviceId) ?: return false if(inputDevice.id == -1) return false return (inputDevice.sources isFlag InputDevice.SOURCE_GAMEPAD) && (inputDevice.sources isFlag InputDevice.SOURCE_JOYSTICK) } fun registerControllerHandlers( context: Context, onInputDeviceAdded: (Int) -> Unit, onInputDeviceRemoved: (Int) -> Unit, onInputDeviceChanged: (Int) -> Unit = {}, ){ val inputManager = context.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: android.view.KeyEvent) = KeyEvent( keyEvent.eventTime, keyEvent.deviceId, keyEvent.keyCode, keyEvent.action ) fun androidMotionEventToBda(motionEvent: android.view.MotionEvent) = MotionEvent( motionEvent.eventTime, motionEvent.deviceId, motionEvent.x, motionEvent.y, motionEvent.rawX, motionEvent.rawY, motionEvent.xPrecision, motionEvent.yPrecision ) }