Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1199,42 +1199,22 @@ public void receiveEvent(
return;
}

EventEmitterWrapper eventEmitter = mMountingManager.getEventEmitter(surfaceId, reactTag);
if (eventEmitter == null) {
if (mMountingManager.getViewExists(reactTag)) {
// The view is pre-allocated and created. However, it hasn't been mounted yet. We will have
// access to the event emitter later when the view is mounted. For now just save the event
// in the view state and trigger it later.
mMountingManager.enqueuePendingEvent(
surfaceId,
reactTag,
eventName,
canCoalesceEvent,
params,
eventCategory,
eventTimestamp);
} else {
// This can happen if the view has disappeared from the screen (because of async events)
FLog.i(TAG, "Unable to invoke event: " + eventName + " for reactTag: " + reactTag);
}
return;
}

if (experimentalIsSynchronous) {
UiThreadUtil.assertOnUiThread();
// add() returns true only if there are no equivalent events already in the set
boolean firstEventForFrame =
mSynchronousEvents.add(new SynchronousEvent(surfaceId, reactTag, eventName));
if (firstEventForFrame) {
eventEmitter.dispatchEventSynchronously(eventName, params, eventTimestamp);
}
} else {
if (canCoalesceEvent) {
eventEmitter.dispatchUnique(eventName, params, eventTimestamp);
} else {
eventEmitter.dispatch(eventName, params, eventCategory, eventTimestamp);
EventEmitterWrapper eventEmitter = mMountingManager.getEventEmitter(surfaceId, reactTag);
if (eventEmitter != null) {
// add() returns true only if there are no equivalent events already in the set
boolean firstEventForFrame =
mSynchronousEvents.add(new SynchronousEvent(surfaceId, reactTag, eventName));
if (firstEventForFrame) {
eventEmitter.dispatchEventSynchronously(eventName, params, eventTimestamp);
}
return;
}
}

mMountingManager.dispatchEvent(
surfaceId, reactTag, eventName, canCoalesceEvent, params, eventCategory, eventTimestamp);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ internal class MountingManager(
attachmentsPositions,
)

fun enqueuePendingEvent(
fun dispatchEvent(
surfaceId: Int,
reactTag: Int,
eventName: String,
Expand All @@ -338,22 +338,16 @@ internal class MountingManager(
) {
val smm = getSurfaceMountingManager(surfaceId, reactTag)
if (smm == null) {
FLog.d(
FLog.i(
TAG,
"Cannot queue event without valid surface mounting manager for tag: %d, surfaceId: %d",
"Unable to invoke event %s for tag [%d] in surfaceId [%d]",
eventName,
reactTag,
surfaceId,
)
return
}
smm.enqueuePendingEvent(
reactTag,
eventName,
canCoalesceEvent,
params,
eventCategory,
eventTimestamp,
)
smm.dispatchEvent(reactTag, eventName, canCoalesceEvent, params, eventCategory, eventTimestamp)
}

private fun getSurfaceMountingManager(surfaceId: Int, reactTag: Int): SurfaceMountingManager? =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1241,6 +1241,45 @@ internal constructor(
}
}

@AnyThread
internal fun dispatchEvent(
reactTag: Int,
eventName: String,
canCoalesceEvent: Boolean,
params: WritableMap?,
@EventCategoryDef eventCategory: Int,
eventTimestamp: Long,
) {
val viewState = registryGet(reactTag)
if (viewState == null) {
// This can happen if the view has disappeared from the screen (because of async events)
FLog.i(TAG, "Unable to invoke event: %s for reactTag: %d", eventName, reactTag)
return
}

val eventEmitter = viewState.eventEmitter
if (eventEmitter == null) {
// The view is pre-allocated and created. However, it hasn't been mounted yet. We will have
// access to the event emitter later when the view is mounted. For now just save the event
// in the view state and trigger it later.
enqueuePendingEvent(
reactTag,
eventName,
canCoalesceEvent,
params,
eventCategory,
eventTimestamp,
)
return
}

if (canCoalesceEvent) {
eventEmitter.dispatchUnique(eventName, params, eventTimestamp)
} else {
eventEmitter.dispatch(eventName, params, eventCategory, eventTimestamp)
}
}

public fun markActiveTouchForTag(reactTag: Int): Unit {
viewsWithActiveTouches.add(reactTag)
}
Expand Down
Loading