From 3665046c140ecebb12f4f136fe3ca5386f20bffb Mon Sep 17 00:00:00 2001 From: Gijs Weterings Date: Wed, 9 Apr 2025 09:07:30 -0700 Subject: [PATCH] fix nullsafe FIXMEs for DynamicFromArray.java and mark nullsafe Summary: D65596278 marked the non-primitive return types from ReadableArray as optional, so we have to follow suit Gone trough all the FIXMEs added in the previous diff by the nullsafe tool, marked the class as nullsafe and ensured no remaining violations. Changelog: [Android][Fixed] Made DynamicFromArray.java nullsafe Reviewed By: alanleedev Differential Revision: D72384069 fbshipit-source-id: c67dc5bfb540af9190f740d565e5bda63d1caaa8 --- .../src/main/java/com/facebook/react/bridge/Dynamic.kt | 6 +++--- .../java/com/facebook/react/bridge/DynamicFromArray.java | 9 +++------ .../com/facebook/react/uimanager/LengthPercentage.kt | 2 +- .../react/views/drawer/ReactDrawerLayoutManager.kt | 2 +- .../com/facebook/react/views/view/ReactViewManager.kt | 4 ++++ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Dynamic.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Dynamic.kt index 734816b93ab..db4b4570caf 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Dynamic.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/Dynamic.kt @@ -16,7 +16,7 @@ public interface Dynamic { public val isNull: Boolean - public fun asArray(): ReadableArray + public fun asArray(): ReadableArray? public fun asBoolean(): Boolean @@ -24,9 +24,9 @@ public interface Dynamic { public fun asInt(): Int - public fun asMap(): ReadableMap + public fun asMap(): ReadableMap? - public fun asString(): String + public fun asString(): String? public fun recycle(): Unit } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromArray.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromArray.java index 18f05966437..a77e237b5fd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromArray.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/DynamicFromArray.java @@ -70,29 +70,26 @@ class DynamicFromArray implements Dynamic { } @Override - public String asString() { + public @Nullable String asString() { if (mArray == null) { throw new IllegalStateException("This dynamic value has been recycled"); } - // NULLSAFE_FIXME[Return Not Nullable] return mArray.getString(mIndex); } @Override - public ReadableArray asArray() { + public @Nullable ReadableArray asArray() { if (mArray == null) { throw new IllegalStateException("This dynamic value has been recycled"); } - // NULLSAFE_FIXME[Return Not Nullable] return mArray.getArray(mIndex); } @Override - public ReadableMap asMap() { + public @Nullable ReadableMap asMap() { if (mArray == null) { throw new IllegalStateException("This dynamic value has been recycled"); } - // NULLSAFE_FIXME[Return Not Nullable] return mArray.getMap(mIndex); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LengthPercentage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LengthPercentage.kt index a33b6b4d0f9..6a9a79ea719 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LengthPercentage.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LengthPercentage.kt @@ -36,7 +36,7 @@ public data class LengthPercentage( } ReadableType.String -> { val s = dynamic.asString() - if (s.endsWith("%")) { + if (s != null && s.endsWith("%")) { try { val value = s.substring(0, s.length - 1).toFloat() if (value >= 0f) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt index e277dc9ad8d..dd736acce06 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt @@ -76,7 +76,7 @@ public class ReactDrawerLayoutManager : } drawerPosition.type == ReadableType.String -> - setDrawerPositionInternal(view, drawerPosition.asString()) + setDrawerPositionInternal(view, checkNotNull(drawerPosition.asString())) else -> { FLog.w(ReactConstants.TAG, "drawerPosition must be a string or int") diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt index 49f724944b0..50dbdfc93c0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt @@ -188,6 +188,10 @@ public open class ReactViewManager : ReactClippingViewManager() when (hitSlop.type) { ReadableType.Map -> { val hitSlopMap = hitSlop.asMap() + if (hitSlopMap == null) { + view.setHitSlopRect(null) + return + } view.setHitSlopRect( Rect( hitSlopMap.px("left"),