/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.animated; import com.facebook.react.bridge.JavaOnlyArray; import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import java.util.ArrayList; import java.util.List; /** * Native counterpart of transform animated node (see AnimatedTransform class in AnimatedImplementation.js) */ /* package */ class TransformAnimatedNode extends AnimatedNode { private class TransformConfig { public String mProperty; } private class AnimatedTransformConfig extends TransformConfig { public int mNodeTag; } private class StaticTransformConfig extends TransformConfig { public double mValue; } private final NativeAnimatedNodesManager mNativeAnimatedNodesManager; private final List<TransformConfig> mTransformConfigs; TransformAnimatedNode(ReadableMap config, NativeAnimatedNodesManager nativeAnimatedNodesManager) { ReadableArray transforms = config.getArray("transforms"); mTransformConfigs = new ArrayList<>(transforms.size()); for (int i = 0; i < transforms.size(); i++) { ReadableMap transformConfigMap = transforms.getMap(i); String property = transformConfigMap.getString("property"); String type = transformConfigMap.getString("type"); if (type.equals("animated")) { AnimatedTransformConfig transformConfig = new AnimatedTransformConfig(); transformConfig.mProperty = property; transformConfig.mNodeTag = transformConfigMap.getInt("nodeTag"); mTransformConfigs.add(transformConfig); } else { StaticTransformConfig transformConfig = new StaticTransformConfig(); transformConfig.mProperty = property; transformConfig.mValue = transformConfigMap.getDouble("value"); mTransformConfigs.add(transformConfig); } } mNativeAnimatedNodesManager = nativeAnimatedNodesManager; } public void collectViewUpdates(JavaOnlyMap propsMap) { List<JavaOnlyMap> transforms = new ArrayList<>(mTransformConfigs.size()); for (TransformConfig transformConfig : mTransformConfigs) { double value; if (transformConfig instanceof AnimatedTransformConfig) { int nodeTag = ((AnimatedTransformConfig) transformConfig).mNodeTag; AnimatedNode node = mNativeAnimatedNodesManager.getNodeById(nodeTag); if (node == null) { throw new IllegalArgumentException("Mapped style node does not exists"); } else if (node instanceof ValueAnimatedNode) { value = ((ValueAnimatedNode) node).getValue(); } else { throw new IllegalArgumentException("Unsupported type of node used as a transform child " + "node " + node.getClass()); } } else { value = ((StaticTransformConfig) transformConfig).mValue; } transforms.add(JavaOnlyMap.of(transformConfig.mProperty, value)); } propsMap.putArray("transform", JavaOnlyArray.from(transforms)); } }