From 46eb3ec474ac3746d650adc817146d1d5373911d Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Sat, 24 Oct 2020 07:19:50 -0700 Subject: [PATCH] Disable `childrenDrawingOrder` of ReactViewGroup in Fabric Summary: Fabric should be inserting Views into the hierarchy in the correct order based on z-index already, so there should be no reason to enable this mechanism. At best it's a perf pessimisation and at worst it could be causing consistency issues or crashing (TBD). Most likely this is a noop. Changelog: [Internal] Reviewed By: ejanzer Differential Revision: D24512203 fbshipit-source-id: b9336240ef8506742bcbd8d08fc8b830f82cdfe2 --- .../react/config/ReactFeatureFlags.java | 3 ++ .../react/views/view/ReactViewGroup.java | 42 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index b83c4c821d9..358bc8a0861 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -71,4 +71,7 @@ public class ReactFeatureFlags { /** Enable caching of Spannable objects using equality of ReadableNativeMaps */ public static boolean enableSpannableCacheByReadableNativeMapEquality = true; + + /** Disable customDrawOrder in ReactViewGroup under Fabric only. */ + public static boolean disableCustomDrawOrderFabric = false; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java index 20e916290cf..659a8afb341 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java @@ -48,6 +48,8 @@ import com.facebook.react.uimanager.RootView; import com.facebook.react.uimanager.RootViewUtil; import com.facebook.react.uimanager.ViewGroupDrawingOrderHelper; import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.uimanager.common.UIManagerType; +import com.facebook.react.uimanager.common.ViewUtil; import com.facebook.yoga.YogaConstants; /** @@ -433,12 +435,28 @@ public class ReactViewGroup extends ViewGroup } } + private boolean customDrawOrderDisabled() { + if (getId() == NO_ID) { + return false; + } + if (ViewUtil.getUIManagerType(getId()) != UIManagerType.FABRIC) { + return false; + } + + return ReactFeatureFlags.disableCustomDrawOrderFabric; + } + @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { // This will get called for every overload of addView so there is not need to override every // method. - mDrawingOrderHelper.handleAddView(child); - setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + + if (!customDrawOrderDisabled()) { + mDrawingOrderHelper.handleAddView(child); + setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + } else { + setChildrenDrawingOrderEnabled(false); + } super.addView(child, index, params); } @@ -447,8 +465,12 @@ public class ReactViewGroup extends ViewGroup public void removeView(View view) { UiThreadUtil.assertOnUiThread(); - mDrawingOrderHelper.handleRemoveView(view); - setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + if (!customDrawOrderDisabled()) { + mDrawingOrderHelper.handleRemoveView(view); + setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + } else { + setChildrenDrawingOrderEnabled(false); + } super.removeView(view); } @@ -457,8 +479,12 @@ public class ReactViewGroup extends ViewGroup public void removeViewAt(int index) { UiThreadUtil.assertOnUiThread(); - mDrawingOrderHelper.handleRemoveView(getChildAt(index)); - setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + if (!customDrawOrderDisabled()) { + mDrawingOrderHelper.handleRemoveView(getChildAt(index)); + setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); + } else { + setChildrenDrawingOrderEnabled(false); + } super.removeViewAt(index); } @@ -479,6 +505,10 @@ public class ReactViewGroup extends ViewGroup @Override public void updateDrawingOrder() { + if (customDrawOrderDisabled()) { + return; + } + mDrawingOrderHelper.update(); setChildrenDrawingOrderEnabled(mDrawingOrderHelper.shouldEnableCustomDrawingOrder()); invalidate();