Skip to content

Commit 203def5

Browse files
javachefacebook-github-bot
authored andcommitted
Convert com.facebook.react.bridge.ReadableNativeArray to Kotlin (facebook#47484)
Summary: Pull Request resolved: facebook#47484 Small change to types in the base class: all non-primitives return optional from ReadableArray, which matches the semantics in ReadableMap. We already rely on this in some cases, but the current nullability annotations were incorrect, and null values from the array would be passed through from `getMap` and `getArray`. Changelog: [Internal] Differential Revision: D65596278
1 parent 13bc4a2 commit 203def5

File tree

21 files changed

+135
-224
lines changed

21 files changed

+135
-224
lines changed

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1481,7 +1481,7 @@ public class com/facebook/react/bridge/ReadableNativeArray : com/facebook/react/
14811481
public fun getDouble (I)D
14821482
public fun getDynamic (I)Lcom/facebook/react/bridge/Dynamic;
14831483
public fun getInt (I)I
1484-
public static fun getJNIPassCounter ()I
1484+
public static final fun getJNIPassCounter ()I
14851485
public fun getLong (I)J
14861486
public synthetic fun getMap (I)Lcom/facebook/react/bridge/ReadableMap;
14871487
public fun getMap (I)Lcom/facebook/react/bridge/ReadableNativeMap;

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/InterpolationAnimatedNode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public class InterpolationAnimatedNode(config: ReadableMap) : ValueAnimatedNode(
130130
val outputRange = arrayOfNulls<DoubleArray>(size)
131131

132132
// Match the first pattern into a List, since we don't know its length yet
133-
var m = numericPattern.matcher(array.getString(0))
133+
var m = numericPattern.matcher(array.getString(0) ?: "")
134134
val firstOutputRange: MutableList<Double> = ArrayList()
135135
while (m.find()) {
136136
firstOutputRange.add(m.group().toDouble())
@@ -143,7 +143,7 @@ public class InterpolationAnimatedNode(config: ReadableMap) : ValueAnimatedNode(
143143
for (i in 1 until size) {
144144
val outputArr = DoubleArray(firstOutputRangeArr.size)
145145
var j = 0
146-
m = numericPattern.matcher(array.getString(i))
146+
m = numericPattern.matcher(array.getString(i) ?: "")
147147
while (m.find() && j < firstOutputRangeArr.size) {
148148
outputArr[j++] = m.group().toDouble()
149149
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/ObjectAnimatedNode.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ internal class ObjectAnimatedNode(
4545
ReadableType.String -> result.pushString(source.getString(i))
4646
ReadableType.Map -> {
4747
val map = source.getMap(i)
48-
if (map.hasKey(NODE_TAG_KEY) && map.getType(NODE_TAG_KEY) == ReadableType.Number) {
48+
if (map != null &&
49+
map.hasKey(NODE_TAG_KEY) &&
50+
map.getType(NODE_TAG_KEY) == ReadableType.Number) {
4951
val node = nativeAnimatedNodesManager.getNodeById(map.getInt(NODE_TAG_KEY))
5052
requireNotNull(node) { "Mapped value node does not exist" }
5153
if (node is ValueAnimatedNode) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/TransformAnimatedNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal class TransformAnimatedNode(
2727
if (transforms == null) mutableListOf()
2828
else
2929
MutableList<TransformConfig>(transforms.size()) { i ->
30-
val transformConfigMap = transforms.getMap(i)
30+
val transformConfigMap = transforms.getMap(i)!!
3131
val property = transformConfigMap.getString("property")
3232
val type = transformConfigMap.getString("type")
3333
if (type == "animated") {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ColorPropConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private static boolean supportWideGamut() {
3434
private static final String ATTR_SEGMENT = "attr/";
3535

3636
@Nullable
37-
private static Integer getColorInteger(Object value, Context context) {
37+
private static Integer getColorInteger(@Nullable Object value, Context context) {
3838
if (value == null) {
3939
return null;
4040
}
@@ -84,7 +84,7 @@ private static Integer getColorInteger(Object value, Context context) {
8484
}
8585

8686
@Nullable
87-
public static Color getColorInstance(Object value, Context context) {
87+
public static Color getColorInstance(@Nullable Object value, Context context) {
8888
if (value == null) {
8989
return null;
9090
}
@@ -136,7 +136,7 @@ public static Color getColorInstance(Object value, Context context) {
136136
"ColorValue: the value must be a number or Object.");
137137
}
138138

139-
public static Integer getColor(Object value, Context context) {
139+
public static Integer getColor(@Nullable Object value, Context context) {
140140
try {
141141
if (supportWideGamut()) {
142142
Color color = getColorInstance(value, context);
@@ -150,7 +150,7 @@ public static Integer getColor(Object value, Context context) {
150150
return getColorInteger(value, context);
151151
}
152152

153-
public static Integer getColor(Object value, Context context, int defaultInt) {
153+
public static Integer getColor(@Nullable Object value, Context context, int defaultInt) {
154154
try {
155155
return getColor(value, context);
156156
} catch (JSApplicationCausedNativeException e) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyArray.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ public class JavaOnlyArray : ReadableArray, WritableArray {
7373

7474
override fun getLong(index: Int): Long = (backingList[index] as Number).toLong()
7575

76-
override fun getString(index: Int): String = backingList[index] as String
76+
override fun getString(index: Int): String? = backingList[index] as String?
7777

78-
override fun getArray(index: Int): ReadableArray = backingList[index] as ReadableArray
78+
override fun getArray(index: Int): ReadableArray? = backingList[index] as ReadableArray?
7979

8080
override fun getBoolean(index: Int): Boolean = backingList[index] as Boolean
8181

82-
override fun getMap(index: Int): ReadableMap = backingList[index] as ReadableMap
82+
override fun getMap(index: Int): ReadableMap? = backingList[index] as ReadableMap?
8383

8484
override fun getDynamic(index: Int): Dynamic = DynamicFromArray.create(this, index)
8585

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableArray.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import java.util.ArrayList
1414
* to Kotlin.
1515
*/
1616
public interface ReadableArray {
17-
public fun getArray(index: Int): ReadableArray
17+
public fun getArray(index: Int): ReadableArray?
1818

1919
public fun getBoolean(index: Int): Boolean
2020

@@ -26,9 +26,9 @@ public interface ReadableArray {
2626

2727
public fun getLong(index: Int): Long
2828

29-
public fun getMap(index: Int): ReadableMap
29+
public fun getMap(index: Int): ReadableMap?
3030

31-
public fun getString(index: Int): String
31+
public fun getString(index: Int): String?
3232

3333
public fun getType(index: Int): ReadableType
3434

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeArray.java

Lines changed: 0 additions & 171 deletions
This file was deleted.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.bridge
9+
10+
import com.facebook.proguard.annotations.DoNotStrip
11+
import java.util.ArrayList
12+
import java.util.Arrays
13+
import kotlin.jvm.JvmStatic
14+
15+
/**
16+
* Implementation of a NativeArray that allows read-only access to its members. This will generally
17+
* be constructed and filled in native code so you shouldn't construct one yourself.
18+
*/
19+
@DoNotStrip
20+
public open class ReadableNativeArray protected constructor() : NativeArray(), ReadableArray {
21+
22+
private val localArray: Array<Any?> by
23+
lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
24+
jniPassCounter++
25+
importArray()
26+
}
27+
28+
private external fun importArray(): Array<Any?>
29+
30+
private val localTypeArray: Array<ReadableType> by
31+
lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
32+
jniPassCounter++
33+
val tempArray = importTypeArray()
34+
Arrays.copyOf(tempArray, tempArray.size, Array<ReadableType>::class.java)
35+
}
36+
37+
private external fun importTypeArray(): Array<Any>
38+
39+
override fun size(): Int = localArray.size
40+
41+
override fun isNull(index: Int): Boolean = localArray[index] == null
42+
43+
override fun getBoolean(index: Int): Boolean = localArray[index] as Boolean
44+
45+
override fun getDouble(index: Int): Double = localArray[index] as Double
46+
47+
override fun getInt(index: Int): Int = (localArray[index] as Double).toInt()
48+
49+
override fun getLong(index: Int): Long = localArray[index] as Long
50+
51+
override fun getString(index: Int): String? = localArray[index] as String?
52+
53+
override fun getArray(index: Int): ReadableNativeArray? =
54+
localArray[index] as ReadableNativeArray?
55+
56+
override fun getMap(index: Int): ReadableNativeMap? = localArray[index] as ReadableNativeMap?
57+
58+
override fun getType(index: Int): ReadableType = localTypeArray[index]
59+
60+
override fun getDynamic(index: Int): Dynamic = DynamicFromArray.create(this, index)
61+
62+
override fun hashCode(): Int = localArray.hashCode()
63+
64+
override fun equals(other: Any?): Boolean {
65+
if (other !is ReadableNativeArray) {
66+
return false
67+
}
68+
return localArray.contentDeepEquals(other.localArray)
69+
}
70+
71+
override fun toArrayList(): ArrayList<Any?> {
72+
val arrayList = ArrayList<Any?>()
73+
repeat(size()) { i ->
74+
when (getType(i)) {
75+
ReadableType.Null -> arrayList.add(null)
76+
ReadableType.Boolean -> arrayList.add(getBoolean(i))
77+
ReadableType.Number -> arrayList.add(getDouble(i))
78+
ReadableType.String -> arrayList.add(getString(i))
79+
ReadableType.Map -> arrayList.add(getMap(i)?.toHashMap())
80+
ReadableType.Array -> arrayList.add(getArray(i)?.toArrayList())
81+
}
82+
}
83+
return arrayList
84+
}
85+
86+
private companion object {
87+
@get:JvmStatic
88+
@get:JvmName("getJNIPassCounter")
89+
public var jniPassCounter: Int = 0
90+
private set
91+
}
92+
}

0 commit comments

Comments
 (0)