Gate off % translate on Android Paper (#45946)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45946

This code is forked on iOS, where we have been, as a policy, avoiding Paper-specific changes. This code is shared between renderers on Android, but it is confusing developer experience to have it work on Android Paper, to then fail on iOS unless it is on new arch.

This change disables support on Android Paper for consistency.

Changelog:
[Android][Removed] - Gate off % translate on Android Paper

Reviewed By: joevilches

Differential Revision: D60970266

fbshipit-source-id: 5df73b948464f5093941528b0af2e694827a9460
This commit is contained in:
Nick Gerleman
2024-08-08 19:44:49 -07:00
committed by Facebook GitHub Bot
parent 620b1221fa
commit 0273123dde
3 changed files with 46 additions and 13 deletions
@@ -5174,6 +5174,7 @@ public class com/facebook/react/uimanager/TransformHelper {
public fun <init> ()V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[D)V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[DFFLcom/facebook/react/bridge/ReadableArray;)V
public static fun processTransform (Lcom/facebook/react/bridge/ReadableArray;[DFFLcom/facebook/react/bridge/ReadableArray;Z)V
}
public abstract interface class com/facebook/react/uimanager/UIBlock {
@@ -572,13 +572,16 @@ public abstract class BaseViewManager<T extends View, C extends LayoutShadowNode
return;
}
boolean allowPercentageResolution = ViewUtil.getUIManagerType(view) == UIManagerType.FABRIC;
sMatrixDecompositionContext.reset();
TransformHelper.processTransform(
transforms,
sTransformDecompositionArray,
PixelUtil.toDIPFromPixel(view.getWidth()),
PixelUtil.toDIPFromPixel(view.getHeight()),
transformOrigin);
transformOrigin,
allowPercentageResolution);
MatrixMathHelper.decomposeMatrix(sTransformDecompositionArray, sMatrixDecompositionContext);
view.setTranslationX(
PixelUtil.toPixelFromDIP(
@@ -45,8 +45,27 @@ public class TransformHelper {
return inRadians ? value : MatrixMathHelper.degreesToRadians(value);
}
/**
* @deprecated Use {@link #processTransform(ReadableArray, double[], float, float, ReadableArray,
* boolean)} instead.
*/
@Deprecated(forRemoval = true, since = "0.75")
public static void processTransform(ReadableArray transforms, double[] result) {
processTransform(transforms, result, 0, 0, null);
processTransform(transforms, result, 0, 0, null, false);
}
/**
* @deprecated Use {@link #processTransform(ReadableArray, double[], float, float, ReadableArray,
* boolean)} instead.
*/
@Deprecated(forRemoval = true, since = "0.75")
public static void processTransform(
ReadableArray transforms,
double[] result,
float viewWidth,
float viewHeight,
ReadableArray transformOrigin) {
processTransform(transforms, result, viewWidth, viewHeight, transformOrigin, false);
}
public static void processTransform(
@@ -54,10 +73,13 @@ public class TransformHelper {
double[] result,
float viewWidth,
float viewHeight,
ReadableArray transformOrigin) {
ReadableArray transformOrigin,
boolean allowPercentageResolution) {
double[] helperMatrix = sHelperMatrix.get();
MatrixMathHelper.resetIdentityMatrix(result);
float[] offsets = getTranslateForTransformOrigin(viewWidth, viewHeight, transformOrigin);
float[] offsets =
getTranslateForTransformOrigin(
viewWidth, viewHeight, transformOrigin, allowPercentageResolution);
if (offsets != null) {
MatrixMathHelper.resetIdentityMatrix(helperMatrix);
@@ -104,13 +126,13 @@ public class TransformHelper {
} else if ("translate".equals(transformType)) {
ReadableArray value = transform.getArray(transformType);
double x = 0;
if (value.getType(0) == ReadableType.String) {
if (value.getType(0) == ReadableType.String && allowPercentageResolution) {
x = parseTranslateValue(value.getString(0), viewWidth);
} else {
x = value.getDouble(0);
}
double y = 0;
if (value.getType(1) == ReadableType.String) {
if (value.getType(1) == ReadableType.String && allowPercentageResolution) {
y = parseTranslateValue(value.getString(1), viewHeight);
} else {
y = value.getDouble(1);
@@ -119,7 +141,8 @@ public class TransformHelper {
MatrixMathHelper.applyTranslate3D(helperMatrix, x, y, z);
} else if ("translateX".equals(transformType)) {
double translateValue = 0;
if (transform.getType(transformType) == ReadableType.String) {
if (transform.getType(transformType) == ReadableType.String
&& allowPercentageResolution) {
translateValue = parseTranslateValue(transform.getString(transformType), viewWidth);
} else {
translateValue = transform.getDouble(transformType);
@@ -127,7 +150,8 @@ public class TransformHelper {
MatrixMathHelper.applyTranslate2D(helperMatrix, translateValue, 0d);
} else if ("translateY".equals(transformType)) {
double translateValue = 0;
if (transform.getType(transformType) == ReadableType.String) {
if (transform.getType(transformType) == ReadableType.String
&& allowPercentageResolution) {
translateValue = parseTranslateValue(transform.getString(transformType), viewHeight);
} else {
translateValue = transform.getDouble(transformType);
@@ -167,7 +191,10 @@ public class TransformHelper {
}
private static float[] getTranslateForTransformOrigin(
float viewWidth, float viewHeight, ReadableArray transformOrigin) {
float viewWidth,
float viewHeight,
ReadableArray transformOrigin,
boolean allowPercentageResolution) {
if (transformOrigin == null || (viewHeight == 0 && viewWidth == 0)) {
return null;
}
@@ -183,10 +210,12 @@ public class TransformHelper {
break;
case String:
{
String part = transformOrigin.getString(i);
if (part.endsWith("%")) {
float val = Float.parseFloat(part.substring(0, part.length() - 1));
origin[i] = (i == 0 ? viewWidth : viewHeight) * val / 100.0f;
if (allowPercentageResolution) {
String part = transformOrigin.getString(i);
if (part.endsWith("%")) {
float val = Float.parseFloat(part.substring(0, part.length() - 1));
origin[i] = (i == 0 ? viewWidth : viewHeight) * val / 100.0f;
}
}
break;
}