From b2105711a0b90859f8e3fc1aaec4998e252c2d14 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 18 Jan 2022 13:51:58 -0800 Subject: [PATCH] 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 --- .../react/animated/EventAnimationDriver.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java b/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java index 1aed300895d..fce99e38ba4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java @@ -8,7 +8,10 @@ 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.RCTEventEmitter; @@ -31,12 +34,45 @@ import java.util.List; } // Get the new value for the node by looking into the event map using the provided event path. - ReadableMap curMap = event; + ReadableMap currMap = event; + ReadableArray currArray = null; for (int i = 0; i < mEventPath.size() - 1; i++) { - curMap = curMap.getMap(mEventPath.get(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 + "'"); + } + } } - mValueNode.mValue = curMap.getDouble(mEventPath.get(mEventPath.size() - 1)); + String lastKey = mEventPath.get(mEventPath.size() - 1); + if (currMap != null) { + mValueNode.mValue = currMap.getDouble(lastKey); + } else { + int lastIndex = Integer.parseInt(lastKey); + mValueNode.mValue = currArray.getDouble(lastIndex); + } } @Override