From 588320831f1ecc6e26f344cc08f137b364da7ffc Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Fri, 17 Dec 2021 11:22:06 -0800 Subject: [PATCH] Initialize RootView size to the display size Summary: Inits RootView to display size for the early surface start experiment. Before that experiment, we always had the view measured before the surface was initialized, but here layout can sometimes happen before measure. Surface defaults use [0; Inf) for size constraints, potentially causing a crash in Yoga. This change avoids that by making a guess on default layout size with `displayMetrics` Changelog: [Internal] Reviewed By: feedthejim Differential Revision: D33190397 fbshipit-source-id: 3b1b84135a4980ef2fde4024ec84a448199e00b8 --- .../java/com/facebook/react/ReactRootView.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index fc0e891a289..6b528916857 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -19,6 +19,7 @@ import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.view.DisplayCutout; import android.view.KeyEvent; import android.view.MotionEvent; @@ -443,6 +444,11 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot { // if in this experiment, we initialize the root earlier in startReactApplication // instead of waiting for the initial measure if (ReactFeatureFlags.enableEagerRootViewAttachment) { + if (!mWasMeasured) { + // Ideally, those values will be used by default, but we only update them here to scope + // this change to `enableEagerRootViewAttachment` experiment. + setSurfaceConstraintsToScreenSize(); + } attachToReactInstanceManager(); } } finally { @@ -450,6 +456,14 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot { } } + private void setSurfaceConstraintsToScreenSize() { + DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); + mWidthMeasureSpec = + MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels, MeasureSpec.AT_MOST); + mHeightMeasureSpec = + MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST); + } + @Override public int getWidthMeasureSpec() { return mWidthMeasureSpec;