Skip to content

Commit 88e8967

Browse files
committed
Consolidate skew detection into a single hasAffine2DSkewTransform
Replace the hasSkewTransform + isAffine2DTransform pair at the BaseViewManager call site with one public hasAffine2DSkewTransform; the two predicates are now internal but still unit-tested. Mark the intentionally-ignored NumberFormatException catches with `_`, and refresh the ReactAndroid API snapshot.
1 parent 06d9d5f commit 88e8967

4 files changed

Lines changed: 36 additions & 9 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4113,8 +4113,7 @@ public abstract class com/facebook/react/uimanager/SimpleViewManager : com/faceb
41134113
public final class com/facebook/react/uimanager/SkewMatrixHelper {
41144114
public static final field INSTANCE Lcom/facebook/react/uimanager/SkewMatrixHelper;
41154115
public static final fun buildAffine2DMatrix (Lcom/facebook/react/bridge/ReadableArray;FFLcom/facebook/react/bridge/ReadableArray;)Landroid/graphics/Matrix;
4116-
public static final fun hasSkewTransform (Lcom/facebook/react/bridge/ReadableArray;)Z
4117-
public static final fun isAffine2DTransform (Lcom/facebook/react/bridge/ReadableArray;)Z
4116+
public static final fun hasAffine2DSkewTransform (Lcom/facebook/react/bridge/ReadableArray;)Z
41184117
}
41194118

41204119
public final class com/facebook/react/uimanager/Spacing {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,7 @@ protected void setTransformProperty(
583583
}
584584

585585
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
586-
&& SkewMatrixHelper.hasSkewTransform(transforms)
587-
&& SkewMatrixHelper.isAffine2DTransform(transforms)) {
586+
&& SkewMatrixHelper.hasAffine2DSkewTransform(transforms)) {
588587
Matrix affine =
589588
SkewMatrixHelper.buildAffine2DMatrix(
590589
transforms,

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/SkewMatrixHelper.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,16 @@ import com.facebook.react.common.ReactConstants
2222
*/
2323
public object SkewMatrixHelper {
2424

25+
/**
26+
* Returns true only when [transforms] both contains a `skewX` / `skewY` operation and is fully
27+
* representable as a 2D-affine [Matrix] (see [isAffine2DTransform]) — i.e. the case
28+
* [BaseViewManager.setTransformProperty] applies via `View.setAnimationMatrix` on Android Q+.
29+
*/
2530
@JvmStatic
26-
public fun hasSkewTransform(transforms: ReadableArray): Boolean {
31+
public fun hasAffine2DSkewTransform(transforms: ReadableArray): Boolean =
32+
hasSkewTransform(transforms) && isAffine2DTransform(transforms)
33+
34+
internal fun hasSkewTransform(transforms: ReadableArray): Boolean {
2735
if (isRawMatrixShorthand(transforms)) return false
2836
for (i in 0 until transforms.size()) {
2937
if (transforms.getType(i) != ReadableType.Map) continue
@@ -41,8 +49,7 @@ public object SkewMatrixHelper {
4149
* a `translate` with a non-zero Z component, and the raw 16-element matrix shorthand used by
4250
* Fabric LayoutAnimations.
4351
*/
44-
@JvmStatic
45-
public fun isAffine2DTransform(transforms: ReadableArray): Boolean {
52+
internal fun isAffine2DTransform(transforms: ReadableArray): Boolean {
4653
if (isRawMatrixShorthand(transforms)) return false
4754
for (i in 0 until transforms.size()) {
4855
if (transforms.getType(i) != ReadableType.Map) continue
@@ -165,7 +172,7 @@ public object SkewMatrixHelper {
165172
if (!part.endsWith("%")) return defaultDip
166173
try {
167174
(part.dropLast(1).toDouble() * dimensionDip / 100.0).toFloat()
168-
} catch (e: NumberFormatException) {
175+
} catch (_: NumberFormatException) {
169176
defaultDip
170177
}
171178
}
@@ -198,7 +205,7 @@ public object SkewMatrixHelper {
198205
} else {
199206
s.toDouble()
200207
}
201-
} catch (e: NumberFormatException) {
208+
} catch (_: NumberFormatException) {
202209
FLog.w(ReactConstants.TAG, "Invalid translate value: $s")
203210
0.0
204211
}

packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/SkewMatrixHelperTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,28 @@ class SkewMatrixHelperTest {
118118
assertThat(SkewMatrixHelper.isAffine2DTransform(transforms)).isTrue()
119119
}
120120

121+
@Test
122+
fun hasAffine2DSkewTransform_trueForSkewX() {
123+
val transforms = JavaOnlyArray.of(JavaOnlyMap.of("skewX", "20deg"))
124+
assertThat(SkewMatrixHelper.hasAffine2DSkewTransform(transforms)).isTrue()
125+
}
126+
127+
@Test
128+
fun hasAffine2DSkewTransform_falseForSkewWithRotateX() {
129+
val transforms =
130+
JavaOnlyArray.of(
131+
JavaOnlyMap.of("skewX", "20deg"),
132+
JavaOnlyMap.of("rotateX", "10deg"),
133+
)
134+
assertThat(SkewMatrixHelper.hasAffine2DSkewTransform(transforms)).isFalse()
135+
}
136+
137+
@Test
138+
fun hasAffine2DSkewTransform_falseForRotateOnly() {
139+
val transforms = JavaOnlyArray.of(JavaOnlyMap.of("rotate", "30deg"))
140+
assertThat(SkewMatrixHelper.hasAffine2DSkewTransform(transforms)).isFalse()
141+
}
142+
121143
@Test
122144
fun buildAffine2DMatrix_pureSkewX_producesExpectedEntries() {
123145
val transforms = JavaOnlyArray.of(JavaOnlyMap.of("skewX", "20deg"))

0 commit comments

Comments
 (0)