Kotlinify EventAnimationDriver (#45766)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45766

# Changelog:
[Internal] -

As in the title.

Reviewed By: cortinico

Differential Revision: D60348157

fbshipit-source-id: 02a7053025ede3662473c5fa2cfadd637e2413b2
This commit is contained in:
Ruslan Shestopalyuk
2024-07-30 05:22:16 -07:00
committed by Facebook GitHub Bot
parent 163db1dab1
commit 3c6ea7e7ce
3 changed files with 110 additions and 126 deletions
@@ -1,116 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.animated;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.UnexpectedNativeTypeException;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.EventCategoryDef;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
import com.facebook.react.uimanager.events.TouchEvent;
import java.util.List;
/** Handles updating a {@link ValueAnimatedNode} when an event gets dispatched. */
/* package */ class EventAnimationDriver implements RCTModernEventEmitter {
private List<String> mEventPath;
/* package */ ValueAnimatedNode mValueNode;
/* package */ String mEventName;
/* package */ int mViewTag;
public EventAnimationDriver(
String eventName, int viewTag, List<String> eventPath, ValueAnimatedNode valueNode) {
mEventName = eventName;
mViewTag = viewTag;
mEventPath = eventPath;
mValueNode = valueNode;
}
@Override
public void receiveEvent(int targetReactTag, String eventName, @Nullable WritableMap event) {
receiveEvent(-1, targetReactTag, eventName, event);
}
@Override
public void receiveEvent(
int surfaceId, int targetTag, String eventName, @Nullable WritableMap event) {
// We assume this event can't be coalesced. `customCoalesceKey` has no meaning in Fabric.
receiveEvent(surfaceId, targetTag, eventName, false, 0, event, EventCategoryDef.UNSPECIFIED);
}
@Override
public void receiveTouches(
String eventName, WritableArray touches, WritableArray changedIndices) {
throw new UnsupportedOperationException(
"receiveTouches is not support by native animated events");
}
@Override
public void receiveTouches(TouchEvent touchEvent) {
throw new UnsupportedOperationException(
"receiveTouches is not support by native animated events");
}
@Override
public void receiveEvent(
int surfaceId,
int targetTag,
String eventName,
boolean canCoalesceEvent,
int customCoalesceKey,
@Nullable WritableMap event,
@EventCategoryDef int category) {
if (event == null) {
throw new IllegalArgumentException("Native animated events must have event data.");
}
// Get the new value for the node by looking into the event map using the provided event path.
ReadableMap currMap = event;
ReadableArray currArray = null;
for (int i = 0; i < mEventPath.size() - 1; i++) {
if (currMap != null) {
String key = mEventPath.get(i);
ReadableType keyType = currMap.getType(key);
if (keyType == ReadableType.Map) {
currMap = currMap.getMap(key);
currArray = null;
} else if (keyType == ReadableType.Array) {
currArray = currMap.getArray(key);
currMap = null;
} else {
throw new UnexpectedNativeTypeException(
"Unexpected type " + keyType + " for key '" + key + "'");
}
} else {
int index = Integer.parseInt(mEventPath.get(i));
ReadableType keyType = currArray.getType(index);
if (keyType == ReadableType.Map) {
currMap = currArray.getMap(index);
currArray = null;
} else if (keyType == ReadableType.Array) {
currArray = currArray.getArray(index);
currMap = null;
} else {
throw new UnexpectedNativeTypeException(
"Unexpected type " + keyType + " for index '" + index + "'");
}
}
}
String lastKey = mEventPath.get(mEventPath.size() - 1);
if (currMap != null) {
mValueNode.nodeValue = currMap.getDouble(lastKey);
} else {
int lastIndex = Integer.parseInt(lastKey);
mValueNode.nodeValue = currArray.getDouble(lastIndex);
}
}
}
@@ -0,0 +1,100 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.animated
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.ReadableType
import com.facebook.react.bridge.UnexpectedNativeTypeException
import com.facebook.react.bridge.WritableArray
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.EventCategoryDef
import com.facebook.react.uimanager.events.RCTModernEventEmitter
import com.facebook.react.uimanager.events.TouchEvent
/** Handles updating a [ValueAnimatedNode] when an event gets dispatched. */
internal class EventAnimationDriver(
@JvmField var eventName: String,
@JvmField internal var viewTag: Int,
private val eventPath: List<String>,
@JvmField internal var valueNode: ValueAnimatedNode
) : RCTModernEventEmitter {
override fun receiveEvent(targetReactTag: Int, eventName: String, event: WritableMap?) =
receiveEvent(-1, targetReactTag, eventName, event)
override fun receiveEvent(
surfaceId: Int,
targetTag: Int,
eventName: String,
event: WritableMap?
) =
// We assume this event can't be coalesced. `customCoalesceKey` has no meaning in Fabric.
receiveEvent(surfaceId, targetTag, eventName, false, 0, event, EventCategoryDef.UNSPECIFIED)
override fun receiveTouches(
eventName: String,
touches: WritableArray,
changedIndices: WritableArray
) {
throw UnsupportedOperationException("receiveTouches is not support by native animated events")
}
override fun receiveTouches(touchEvent: TouchEvent) {
throw UnsupportedOperationException("receiveTouches is not support by native animated events")
}
override fun receiveEvent(
surfaceId: Int,
targetTag: Int,
eventName: String,
canCoalesceEvent: Boolean,
customCoalesceKey: Int,
event: WritableMap?,
@EventCategoryDef category: Int
) {
requireNotNull(event) { "Native animated events must have event data." }
// Get the new value for the node by looking into the event map using the provided event path.
var currMap: ReadableMap? = event
var currArray: ReadableArray? = null
for (i in 0 until eventPath.size - 1) {
if (currMap != null) {
val key = eventPath[i]
val keyType = currMap.getType(key)
if (keyType == ReadableType.Map) {
currMap = currMap.getMap(key)
currArray = null
} else if (keyType == ReadableType.Array) {
currArray = currMap.getArray(key)
currMap = null
} else {
throw UnexpectedNativeTypeException("Unexpected type $keyType for key '$key'")
}
} else {
val index = eventPath[i].toInt()
val keyType = currArray?.getType(index)
if (keyType == ReadableType.Map) {
currMap = currArray?.getMap(index)
currArray = null
} else if (keyType == ReadableType.Array) {
currArray = currArray?.getArray(index)
currMap = null
} else {
throw UnexpectedNativeTypeException("Unexpected type $keyType for index '$index'")
}
}
}
val lastKey = eventPath[eventPath.size - 1]
if (currMap != null) {
valueNode.nodeValue = currMap.getDouble(lastKey)
} else {
val lastIndex = lastKey.toInt()
valueNode.nodeValue = currArray?.getDouble(lastIndex) ?: 0.0
}
}
}
@@ -563,9 +563,9 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener {
ListIterator<EventAnimationDriver> it = mEventDrivers.listIterator();
while (it.hasNext()) {
EventAnimationDriver driver = it.next();
if (eventName.equals(driver.mEventName)
&& viewTag == driver.mViewTag
&& animatedValueTag == driver.mValueNode.tag) {
if (eventName.equals(driver.eventName)
&& viewTag == driver.viewTag
&& animatedValueTag == driver.valueNode.tag) {
it.remove();
break;
}
@@ -609,11 +609,11 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener {
boolean foundAtLeastOneDriver = false;
Event.EventAnimationDriverMatchSpec matchSpec = event.getEventAnimationDriverMatchSpec();
for (EventAnimationDriver driver : mEventDrivers) {
if (matchSpec.match(driver.mViewTag, driver.mEventName)) {
if (matchSpec.match(driver.viewTag, driver.eventName)) {
foundAtLeastOneDriver = true;
stopAnimationsForNode(driver.mValueNode);
stopAnimationsForNode(driver.valueNode);
event.dispatchModern(driver);
mRunUpdateNodeList.add(driver.mValueNode);
mRunUpdateNodeList.add(driver.valueNode);
}
}
@@ -704,10 +704,10 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener {
while (it.hasNext()) {
EventAnimationDriver driver = it.next();
if (driver != null) {
if (eventName.equals(driver.mEventName) && tag == driver.mViewTag) {
tags.add(driver.mViewTag);
if (driver.mValueNode != null && driver.mValueNode.children != null) {
for (AnimatedNode node : driver.mValueNode.children) {
if (eventName.equals(driver.eventName) && tag == driver.viewTag) {
tags.add(driver.viewTag);
if (driver.valueNode != null && driver.valueNode.children != null) {
for (AnimatedNode node : driver.valueNode.children) {
tags.add(node.tag);
}
}