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