// 1. RCTEventEmitter was deprecated in favor of RCTModernEventEmitter interface // 2. Event#init() with only viewTag was deprecated in favor of two arg c-tor // 3. Event#receiveEvent() with 3 args was deprecated in favor of 4 args version // ref: https://github.com/facebook/react-native/commit/2fbbdbb2ce897e8da3f471b08b93f167d566db1d @file:Suppress("DEPRECATION") package com.swmansion.gesturehandler.react import androidx.core.util.Pools import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap import com.facebook.react.uimanager.events.Event import com.facebook.react.uimanager.events.RCTEventEmitter import com.swmansion.gesturehandler.GestureHandler class RNGestureHandlerEvent private constructor() : Event() { private var extraData: WritableMap? = null private var coalescingKey: Short = 0 private fun > init( handler: T, dataExtractor: RNGestureHandlerEventDataExtractor?, ) { super.init(handler.view!!.id) extraData = createEventData(handler, dataExtractor) coalescingKey = handler.eventCoalescingKey } override fun onDispose() { extraData = null EVENTS_POOL.release(this) } override fun getEventName() = EVENT_NAME override fun canCoalesce() = true override fun getCoalescingKey() = coalescingKey override fun dispatch(rctEventEmitter: RCTEventEmitter) { rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData) } companion object { const val EVENT_NAME = "onGestureHandlerEvent" private const val TOUCH_EVENTS_POOL_SIZE = 7 // magic private val EVENTS_POOL = Pools.SynchronizedPool(TOUCH_EVENTS_POOL_SIZE) fun > obtain( handler: T, dataExtractor: RNGestureHandlerEventDataExtractor?, ): RNGestureHandlerEvent = (EVENTS_POOL.acquire() ?: RNGestureHandlerEvent()).apply { init(handler, dataExtractor) } fun > createEventData( handler: T, dataExtractor: RNGestureHandlerEventDataExtractor? ): WritableMap = Arguments.createMap().apply { dataExtractor?.extractEventData(handler, this) putInt("handlerTag", handler.tag) putInt("state", handler.state) } } }