diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.java deleted file mode 100644 index 96d35518bcffdd..00000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.java +++ /dev/null @@ -1,109 +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.bridge; - -import androidx.annotation.Nullable; -import com.facebook.common.logging.FLog; -import com.facebook.infer.annotation.Nullsafe; -import com.facebook.react.common.ReactConstants; - -/** Implementation of Dynamic wrapping a ReadableArray. */ -@Nullsafe(Nullsafe.Mode.LOCAL) -public class DynamicFromObject implements Dynamic { - private @Nullable Object mObject; - - public DynamicFromObject(@Nullable Object obj) { - mObject = obj; - } - - @Override - public void recycle() { - // Noop - nothing to recycle since there is no pooling - } - - @Override - public boolean isNull() { - return mObject == null; - } - - @Override - public boolean asBoolean() { - if (mObject == null || !(mObject instanceof Boolean)) { - throw new ClassCastException("Dynamic value from Object is not a boolean"); - } - return (boolean) mObject; - } - - @Override - public double asDouble() { - if (mObject == null || !(mObject instanceof Number)) { - throw new ClassCastException("Dynamic value from Object is not a number"); - } - return (double) mObject; - } - - @Override - public int asInt() { - if (mObject == null || !(mObject instanceof Number)) { - throw new ClassCastException("Dynamic value from Object is not a number"); - } - // Numbers from JS are always Doubles - return ((Double) mObject).intValue(); - } - - @Override - public String asString() { - if (mObject == null || !(mObject instanceof String)) { - throw new ClassCastException("Dynamic value from Object is not a string"); - } - return (String) mObject; - } - - @Override - public ReadableArray asArray() { - if (mObject == null || !(mObject instanceof ReadableArray)) { - throw new ClassCastException("Dynamic value from Object is not a ReadableArray"); - } - return (ReadableArray) mObject; - } - - @Override - public ReadableMap asMap() { - if (mObject == null || !(mObject instanceof ReadableMap)) { - throw new ClassCastException("Dynamic value from Object is not a ReadableMap"); - } - return (ReadableMap) mObject; - } - - @Override - public ReadableType getType() { - if (isNull()) { - return ReadableType.Null; - } - if (mObject instanceof Boolean) { - return ReadableType.Boolean; - } - if (mObject instanceof Number) { - return ReadableType.Number; - } - if (mObject instanceof String) { - return ReadableType.String; - } - if (mObject instanceof ReadableMap) { - return ReadableType.Map; - } - if (mObject instanceof ReadableArray) { - return ReadableType.Array; - } - FLog.e( - ReactConstants.TAG, - "Unmapped object type " - + (mObject == null ? "" : mObject.getClass().getName())); - return ReadableType.Null; - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.kt new file mode 100644 index 00000000000000..ef424f9730f4a3 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromObject.kt @@ -0,0 +1,83 @@ +/* + * 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.bridge + +import com.facebook.common.logging.FLog +import com.facebook.react.common.ReactConstants + +/** Implementation of Dynamic wrapping a ReadableArray. */ +public class DynamicFromObject(private val value: Any?) : Dynamic { + override fun recycle() { + // Noop - nothing to recycle since there is no pooling + } + + override val isNull: Boolean + get() = value == null + + override fun asBoolean(): Boolean { + if (value is Boolean) { + return value + } + throw ClassCastException("Dynamic value from Object is not a boolean") + } + + override fun asDouble(): Double { + if (value is Number) { + return value as Double + } + throw ClassCastException("Dynamic value from Object is not a number") + } + + override fun asInt(): Int { + if (value is Number) { + // Numbers from JS are always Doubles + return (value as Double).toInt() + } + throw ClassCastException("Dynamic value from Object is not a number") + } + + override fun asString(): String { + if (value is String) { + return value + } + throw ClassCastException("Dynamic value from Object is not a string") + } + + override fun asArray(): ReadableArray { + if (value is ReadableArray) { + return value + } + throw ClassCastException("Dynamic value from Object is not a ReadableArray") + } + + override fun asMap(): ReadableMap { + if (value is ReadableMap) { + return value + } + throw ClassCastException("Dynamic value from Object is not a ReadableMap") + } + + override val type: ReadableType + get() { + return when (value) { + null -> ReadableType.Null + is Boolean -> ReadableType.Boolean + is Number -> ReadableType.Number + is String -> ReadableType.String + is ReadableMap -> ReadableType.Map + is ReadableArray -> ReadableType.Array + else -> { + FLog.e( + ReactConstants.TAG, + "Unmapped object type " + (value.javaClass.name) + ) + ReadableType.Null + } + } + } +}