From 3ceae8c930a22c852eb1185ba3326605465e8c78 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:55:50 +0300 Subject: [PATCH] perf(android): use surface-aware Fabric pager events --- .../java/com/reactnativepagerview/ComposePagerView.kt | 6 +++--- .../com/reactnativepagerview/event/PageScrollEvent.kt | 11 +++-------- .../event/PageScrollStateChangedEvent.kt | 10 +++++----- .../reactnativepagerview/event/PageSelectedEvent.kt | 10 +++------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/android/src/main/java/com/reactnativepagerview/ComposePagerView.kt b/android/src/main/java/com/reactnativepagerview/ComposePagerView.kt index 8695b93c..c42d5988 100644 --- a/android/src/main/java/com/reactnativepagerview/ComposePagerView.kt +++ b/android/src/main/java/com/reactnativepagerview/ComposePagerView.kt @@ -385,13 +385,13 @@ class ComposePagerView(context: Context) : FrameLayout(context) { } lastEmittedPageSelected = position UIManagerHelper.getEventDispatcherForReactTag(reactContext, id)?.dispatchEvent( - PageSelectedEvent(id, position) + PageSelectedEvent(UIManagerHelper.getSurfaceId(this), id, position) ) } private fun dispatchPageScroll(position: Int, offset: Float) { UIManagerHelper.getEventDispatcherForReactTag(reactContext, id)?.dispatchEvent( - PageScrollEvent(id, position, offset) + PageScrollEvent(UIManagerHelper.getSurfaceId(this), id, position, offset) ) } @@ -401,7 +401,7 @@ class ComposePagerView(context: Context) : FrameLayout(context) { } lastEmittedScrollState = state UIManagerHelper.getEventDispatcherForReactTag(reactContext, id)?.dispatchEvent( - PageScrollStateChangedEvent(id, state) + PageScrollStateChangedEvent(UIManagerHelper.getSurfaceId(this), id, state) ) } diff --git a/android/src/main/java/com/reactnativepagerview/event/PageScrollEvent.kt b/android/src/main/java/com/reactnativepagerview/event/PageScrollEvent.kt index 53a65580..bd926f40 100644 --- a/android/src/main/java/com/reactnativepagerview/event/PageScrollEvent.kt +++ b/android/src/main/java/com/reactnativepagerview/event/PageScrollEvent.kt @@ -3,7 +3,6 @@ package com.reactnativepagerview.event 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 java.lang.Float.isInfinite import java.lang.Float.isNaN @@ -18,17 +17,14 @@ import java.lang.Float.isNaN * (1 - x) fraction of the page at "position" index is visible, and x fraction of the next page * is visible. */ -class PageScrollEvent(viewTag: Int, private val mPosition: Int, offset: Float) : Event(viewTag) { +class PageScrollEvent(surfaceId: Int, viewTag: Int, private val mPosition: Int, offset: Float) : Event(surfaceId, viewTag) { + constructor(viewTag: Int, mPosition: Int, offset: Float) : this(-1, viewTag, mPosition, offset) private val mOffset: Float = if (isInfinite(offset) || isNaN(offset)) 0.0f else offset override fun getEventName(): String { return EVENT_NAME } - override fun dispatch(rctEventEmitter: RCTEventEmitter) { - rctEventEmitter.receiveEvent(viewTag, eventName, serializeEventData()) - } - - private fun serializeEventData(): WritableMap { + override fun getEventData(): WritableMap { val eventData = Arguments.createMap() eventData.putInt("position", mPosition) eventData.putDouble("offset", mOffset.toDouble()) @@ -44,4 +40,3 @@ class PageScrollEvent(viewTag: Int, private val mPosition: Int, offset: Float) : // folly::toJson default options don't support serialize NaN or Infinite value } } - diff --git a/android/src/main/java/com/reactnativepagerview/event/PageScrollStateChangedEvent.kt b/android/src/main/java/com/reactnativepagerview/event/PageScrollStateChangedEvent.kt index 04bfa063..650d6c1d 100644 --- a/android/src/main/java/com/reactnativepagerview/event/PageScrollStateChangedEvent.kt +++ b/android/src/main/java/com/reactnativepagerview/event/PageScrollStateChangedEvent.kt @@ -3,7 +3,6 @@ package com.reactnativepagerview.event 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 /** @@ -12,16 +11,17 @@ import com.facebook.react.uimanager.events.RCTEventEmitter * Additional data provided by this event: * - pageScrollState - {Idle,Dragging,Settling} */ -class PageScrollStateChangedEvent(viewTag: Int, private val mPageScrollState: String) : Event(viewTag) { +class PageScrollStateChangedEvent(surfaceId: Int, viewTag: Int, private val mPageScrollState: String) : Event(surfaceId, viewTag) { + constructor(viewTag: Int, mPageScrollState: String) : this(-1, viewTag, mPageScrollState) override fun getEventName(): String { return EVENT_NAME } - override fun dispatch(rctEventEmitter: RCTEventEmitter) { - rctEventEmitter.receiveEvent(viewTag, eventName, serializeEventData()) + override fun canCoalesce(): Boolean { + return false } - private fun serializeEventData(): WritableMap { + override fun getEventData(): WritableMap { val eventData = Arguments.createMap() eventData.putString("pageScrollState", mPageScrollState) return eventData diff --git a/android/src/main/java/com/reactnativepagerview/event/PageSelectedEvent.kt b/android/src/main/java/com/reactnativepagerview/event/PageSelectedEvent.kt index e5adccc6..316b3bfe 100644 --- a/android/src/main/java/com/reactnativepagerview/event/PageSelectedEvent.kt +++ b/android/src/main/java/com/reactnativepagerview/event/PageSelectedEvent.kt @@ -3,7 +3,6 @@ package com.reactnativepagerview.event 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 /** @@ -12,7 +11,8 @@ import com.facebook.react.uimanager.events.RCTEventEmitter * Additional data provided by this event: * - position - index of page that has been selected */ -class PageSelectedEvent(viewTag: Int, private val mPosition: Int) : Event(viewTag) { +class PageSelectedEvent(surfaceId: Int, viewTag: Int, private val mPosition: Int) : Event(surfaceId, viewTag) { + constructor(viewTag: Int, mPosition: Int) : this(-1, viewTag, mPosition) override fun getEventName(): String { return EVENT_NAME } @@ -21,11 +21,7 @@ class PageSelectedEvent(viewTag: Int, private val mPosition: Int) : Event