Extract getViewportOffset out RootView

Summary:
This diff moves the method getViewportOffset out of ReactRootView. This is necessary to avoid Fabric to depend from paper.

changelog: [internal] internal

Reviewed By: JoshuaGross

Differential Revision: D26716901

fbshipit-source-id: cec67c24860a776fb361d7cda08d3142e1214c8c
This commit is contained in:
David Vacca 2021-03-01 17:52:20 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 21a434ceec
Коммит 05f687fa88
6 изменённых файлов: 24 добавлений и 20 удалений

Просмотреть файл

@ -30,6 +30,7 @@ rn_android_library(
react_native_target("java/com/facebook/react/common:common"),
react_native_target("java/com/facebook/react/devsupport:devsupport"),
react_native_target("java/com/facebook/react/devsupport:interfaces"),
react_native_target("java/com/facebook/react/fabric:fabric"),
react_native_target("java/com/facebook/react/jscexecutor:jscexecutor"),
react_native_target("java/com/facebook/react/jstasks:jstasks"),
react_native_target("java/com/facebook/react/module/annotations:annotations"),

Просмотреть файл

@ -27,7 +27,6 @@ import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.facebook.common.logging.FLog;
import com.facebook.infer.annotation.Assertions;
import com.facebook.infer.annotation.ThreadConfined;
@ -52,6 +51,7 @@ import com.facebook.react.uimanager.JSTouchDispatcher;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ReactRoot;
import com.facebook.react.uimanager.RootView;
import com.facebook.react.uimanager.RootViewUtil;
import com.facebook.react.uimanager.UIManagerHelper;
import com.facebook.react.uimanager.common.UIManagerType;
import com.facebook.react.uimanager.events.EventDispatcher;
@ -420,21 +420,6 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
return mState;
}
@UiThread
public static Point getViewportOffset(View v) {
int[] locationInWindow = new int[2];
v.getLocationInWindow(locationInWindow);
// we need to subtract visibleWindowCoords - to subtract possible window insets, split
// screen or multi window
Rect visibleWindowFrame = new Rect();
v.getWindowVisibleDisplayFrame(visibleWindowFrame);
locationInWindow[0] -= visibleWindowFrame.left;
locationInWindow[1] -= visibleWindowFrame.top;
return new Point(locationInWindow[0], locationInWindow[1]);
}
/**
* Call whenever measure specs change, or if you want to force an update of offsetX/offsetY. If
* measureSpecsChanged is false and the offsetX/offsetY don't change, updateRootLayoutSpecs will
@ -472,7 +457,7 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
int offsetX = 0;
int offsetY = 0;
if (getUIManagerType() == FABRIC) {
Point viewportOffset = getViewportOffset(this);
Point viewportOffset = RootViewUtil.getViewportOffset(this);
offsetX = viewportOffset.x;
offsetY = viewportOffset.y;
}

Просмотреть файл

@ -33,7 +33,6 @@ rn_android_library(
react_native_target("java/com/facebook/react/bridge:bridge"),
react_native_target("java/com/facebook/react/config:config"),
react_native_target("java/com/facebook/react/fabric/jni:jni"),
react_native_target("java/com/facebook/react:react"),
react_native_target("java/com/facebook/react/module/annotations:annotations"),
react_native_target("java/com/facebook/react/modules/core:core"),
react_native_target("java/com/facebook/react/modules/i18nmanager:i18nmanager"),

Просмотреть файл

@ -91,6 +91,7 @@ public class Binding {
jsMessageQueueThread,
componentFactory,
reactNativeConfig);
setPixelDensity(PixelUtil.getDisplayMetricDensity());
}

Просмотреть файл

@ -35,7 +35,6 @@ import com.facebook.debug.holder.PrinterHolder;
import com.facebook.debug.tags.ReactDebugOverlayTags;
import com.facebook.infer.annotation.ThreadConfined;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.ReactRootView;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.NativeArray;
import com.facebook.react.bridge.NativeMap;
@ -73,6 +72,7 @@ import com.facebook.react.uimanager.IllegalViewOperationException;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ReactRoot;
import com.facebook.react.uimanager.ReactRootViewTagGenerator;
import com.facebook.react.uimanager.RootViewUtil;
import com.facebook.react.uimanager.StateWrapper;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIManagerHelper;
@ -252,7 +252,7 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
// ViewportOffset during measurement or onLayout.
@SuppressLint("WrongThread")
Point viewportOffset =
UiThreadUtil.isOnUiThread() ? ReactRootView.getViewportOffset(rootView) : new Point(0, 0);
UiThreadUtil.isOnUiThread() ? RootViewUtil.getViewportOffset(rootView) : new Point(0, 0);
mBinding.startSurfaceWithConstraints(
rootTag,

Просмотреть файл

@ -7,8 +7,11 @@
package com.facebook.react.uimanager;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewParent;
import androidx.annotation.UiThread;
import com.facebook.infer.annotation.Assertions;
public class RootViewUtil {
@ -28,4 +31,19 @@ public class RootViewUtil {
current = (View) next;
}
}
@UiThread
public static Point getViewportOffset(View v) {
int[] locationInWindow = new int[2];
v.getLocationInWindow(locationInWindow);
// we need to subtract visibleWindowCoords - to subtract possible window insets, split
// screen or multi window
Rect visibleWindowFrame = new Rect();
v.getWindowVisibleDisplayFrame(visibleWindowFrame);
locationInWindow[0] -= visibleWindowFrame.left;
locationInWindow[1] -= visibleWindowFrame.top;
return new Point(locationInWindow[0], locationInWindow[1]);
}
}