Skip to content

Commit b210571

Browse files
javachefacebook-github-bot
authored andcommitted
Support Animated.event extracting values from array
Summary: `onPointerMove` events get dispatched with an `offset: [x, y]` attribute (API is not yet available in OSS, so subject to change), but `EventAnimationDriver` in RN Android is not able to extract values with such keys (even though the equivalent JS implementation does allow it). (TODO: verify iOS behaviour) Changelog: [General][Added] - Animated.event can be used to extract values with numeric keys from native events Reviewed By: mdvacca Differential Revision: D32531117 fbshipit-source-id: 918a5443c5d8f5f8200d86bb67f84e8bc175c1d3
1 parent c338fff commit b210571

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java

+39-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
package com.facebook.react.animated;
99

1010
import androidx.annotation.Nullable;
11+
import com.facebook.react.bridge.ReadableArray;
1112
import com.facebook.react.bridge.ReadableMap;
13+
import com.facebook.react.bridge.ReadableType;
14+
import com.facebook.react.bridge.UnexpectedNativeTypeException;
1215
import com.facebook.react.bridge.WritableArray;
1316
import com.facebook.react.bridge.WritableMap;
1417
import com.facebook.react.uimanager.events.RCTEventEmitter;
@@ -31,12 +34,45 @@ public void receiveEvent(int targetTag, String eventName, @Nullable WritableMap
3134
}
3235

3336
// Get the new value for the node by looking into the event map using the provided event path.
34-
ReadableMap curMap = event;
37+
ReadableMap currMap = event;
38+
ReadableArray currArray = null;
3539
for (int i = 0; i < mEventPath.size() - 1; i++) {
36-
curMap = curMap.getMap(mEventPath.get(i));
40+
if (currMap != null) {
41+
String key = mEventPath.get(i);
42+
ReadableType keyType = currMap.getType(key);
43+
if (keyType == ReadableType.Map) {
44+
currMap = currMap.getMap(key);
45+
currArray = null;
46+
} else if (keyType == ReadableType.Array) {
47+
currArray = currMap.getArray(key);
48+
currMap = null;
49+
} else {
50+
throw new UnexpectedNativeTypeException(
51+
"Unexpected type " + keyType + " for key '" + key + "'");
52+
}
53+
} else {
54+
int index = Integer.parseInt(mEventPath.get(i));
55+
ReadableType keyType = currArray.getType(index);
56+
if (keyType == ReadableType.Map) {
57+
currMap = currArray.getMap(index);
58+
currArray = null;
59+
} else if (keyType == ReadableType.Array) {
60+
currArray = currArray.getArray(index);
61+
currMap = null;
62+
} else {
63+
throw new UnexpectedNativeTypeException(
64+
"Unexpected type " + keyType + " for index '" + index + "'");
65+
}
66+
}
3767
}
3868

39-
mValueNode.mValue = curMap.getDouble(mEventPath.get(mEventPath.size() - 1));
69+
String lastKey = mEventPath.get(mEventPath.size() - 1);
70+
if (currMap != null) {
71+
mValueNode.mValue = currMap.getDouble(lastKey);
72+
} else {
73+
int lastIndex = Integer.parseInt(lastKey);
74+
mValueNode.mValue = currArray.getDouble(lastIndex);
75+
}
4076
}
4177

4278
@Override

0 commit comments

Comments
 (0)