// 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 RNGestureHandlerStateChangeEvent private constructor() : Event() { private var extraData: WritableMap? = null private fun > init( handler: T, newState: Int, oldState: Int, dataExtractor: RNGestureHandlerEventDataExtractor?, ) { super.init(handler.view!!.id) extraData = createEventData(handler, dataExtractor, newState, oldState) } override fun onDispose() { extraData = null EVENTS_POOL.release(this) } override fun getEventName() = EVENT_NAME // TODO: coalescing override fun canCoalesce() = false // TODO: coalescing override fun getCoalescingKey(): Short = 0 override fun dispatch(rctEventEmitter: RCTEventEmitter) { rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData) } companion object { const val EVENT_NAME = "onGestureHandlerStateChange" private const val TOUCH_EVENTS_POOL_SIZE = 7 // magic private val EVENTS_POOL = Pools.SynchronizedPool(TOUCH_EVENTS_POOL_SIZE) fun > obtain( handler: T, newState: Int, oldState: Int, dataExtractor: RNGestureHandlerEventDataExtractor?, ): RNGestureHandlerStateChangeEvent = (EVENTS_POOL.acquire() ?: RNGestureHandlerStateChangeEvent()).apply { init(handler, newState, oldState, dataExtractor) } fun > createEventData( handler: T, dataExtractor: RNGestureHandlerEventDataExtractor?, newState: Int, oldState: Int, ): WritableMap = Arguments.createMap().apply { dataExtractor?.extractEventData(handler, this) putInt("handlerTag", handler.tag) putInt("state", newState) putInt("oldState", oldState) } } }