Skip to content

Commit 53f89ba

Browse files
CalixTangfacebook-github-bot
authored andcommitted
VirtualView v2 support in HorizontalScrollView native component (Android) (facebook#53890)
Summary: Pull Request resolved: facebook#53890 Changelog: [Internal] - Adds support for VirtualView v2 in Android HorizontalScrollView native component by implementing VirtualViewContainer interface. Only on Android because iOS equivalent native components are already set up to support virtualview v2 on horizontal scrollviews. ## Changes in Detail Adds necessary changes to Android `HorizontalScrollView` native component to support the experimental version of VirtualView. Reviewed By: lunaleaps Differential Revision: D82783403 fbshipit-source-id: 1e55eb054ab098af5ca8dd526b27c574025943c4
1 parent 14dc03e commit 53f89ba

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5566,7 +5566,7 @@ public final class com/facebook/react/views/scroll/ReactHorizontalScrollContaine
55665566
public final class com/facebook/react/views/scroll/ReactHorizontalScrollContainerViewManager$Companion {
55675567
}
55685568

5569-
public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android/widget/HorizontalScrollView, android/view/View$OnLayoutChangeListener, android/view/ViewGroup$OnHierarchyChangeListener, com/facebook/react/uimanager/ReactClippingViewGroup, com/facebook/react/uimanager/ReactOverflowViewWithInset, com/facebook/react/views/scroll/ReactAccessibleScrollView, com/facebook/react/views/scroll/ReactScrollViewHelper$HasFlingAnimator, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollEventThrottle, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollState, com/facebook/react/views/scroll/ReactScrollViewHelper$HasSmoothScroll, com/facebook/react/views/scroll/ReactScrollViewHelper$HasStateWrapper {
5569+
public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android/widget/HorizontalScrollView, android/view/View$OnLayoutChangeListener, android/view/ViewGroup$OnHierarchyChangeListener, com/facebook/react/uimanager/ReactClippingViewGroup, com/facebook/react/uimanager/ReactOverflowViewWithInset, com/facebook/react/views/scroll/ReactAccessibleScrollView, com/facebook/react/views/scroll/ReactScrollViewHelper$HasFlingAnimator, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollEventThrottle, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollState, com/facebook/react/views/scroll/ReactScrollViewHelper$HasSmoothScroll, com/facebook/react/views/scroll/ReactScrollViewHelper$HasStateWrapper, com/facebook/react/views/scroll/VirtualViewContainer {
55705570
public fun <init> (Landroid/content/Context;)V
55715571
public fun <init> (Landroid/content/Context;Lcom/facebook/react/views/scroll/FpsListener;)V
55725572
public fun abortAnimation ()V
@@ -5596,6 +5596,7 @@ public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android
55965596
public fun getScrollEnabled ()Z
55975597
public fun getScrollEventThrottle ()I
55985598
public fun getStateWrapper ()Lcom/facebook/react/uimanager/StateWrapper;
5599+
public fun getVirtualViewContainerState ()Lcom/facebook/react/views/scroll/VirtualViewContainerState;
55995600
protected fun handleInterceptedTouchEvent (Landroid/view/MotionEvent;)V
56005601
public fun isPartiallyScrolledInView (Landroid/view/View;)Z
56015602
protected fun onAttachedToWindow ()V

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public class ReactHorizontalScrollView extends HorizontalScrollView
7979
HasStateWrapper,
8080
HasFlingAnimator,
8181
HasScrollEventThrottle,
82-
HasSmoothScroll {
82+
HasSmoothScroll,
83+
VirtualViewContainer {
8384

8485
private static boolean DEBUG_MODE = false && ReactBuildConfig.DEBUG;
8586
private static String TAG = ReactHorizontalScrollView.class.getSimpleName();
@@ -100,6 +101,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView
100101
private final ValueAnimator DEFAULT_FLING_ANIMATOR = ObjectAnimator.ofInt(this, "scrollX", 0, 0);
101102

102103
private Rect mOverflowInset = new Rect();
104+
private @Nullable VirtualViewContainerState mVirtualViewContainerState;
103105
private boolean mActivelyScrolling;
104106
private @Nullable Rect mClippingRect;
105107
private Overflow mOverflow = Overflow.SCROLL;
@@ -156,6 +158,7 @@ public ReactHorizontalScrollView(Context context, @Nullable FpsListener fpsListe
156158
*/
157159
private void initView() {
158160
mOverflowInset = new Rect();
161+
mVirtualViewContainerState = null;
159162
mActivelyScrolling = false;
160163
mClippingRect = null;
161164
// The default value for `overflow` is set to `Visible` in the Yoga style props.
@@ -209,6 +212,15 @@ private void initView() {
209212

210213
private void updateView() {}
211214

215+
@Override
216+
public VirtualViewContainerState getVirtualViewContainerState() {
217+
if (mVirtualViewContainerState == null) {
218+
mVirtualViewContainerState = new VirtualViewContainerState(this);
219+
}
220+
221+
return mVirtualViewContainerState;
222+
}
223+
212224
@Override
213225
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
214226
super.onInitializeAccessibilityNodeInfo(info);
@@ -512,6 +524,9 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
512524
}
513525

514526
ReactScrollViewHelper.emitLayoutEvent(this);
527+
if (mVirtualViewContainerState != null) {
528+
mVirtualViewContainerState.updateState();
529+
}
515530
}
516531

517532
/**
@@ -605,7 +620,11 @@ protected void onScrollChanged(int x, int y, int oldX, int oldY) {
605620
this,
606621
mOnScrollDispatchHelper.getXFlingVelocity(),
607622
mOnScrollDispatchHelper.getYFlingVelocity());
623+
if (mVirtualViewContainerState != null) {
624+
mVirtualViewContainerState.updateState();
625+
}
608626
}
627+
609628
} finally {
610629
Systrace.endSection(Systrace.TRACE_TAG_REACT);
611630
}
@@ -856,6 +875,9 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
856875
if (mRemoveClippedSubviews) {
857876
updateClippingRect();
858877
}
878+
if (mVirtualViewContainerState != null) {
879+
mVirtualViewContainerState.updateState();
880+
}
859881
}
860882

861883
@Override
@@ -875,6 +897,9 @@ protected void onDetachedFromWindow() {
875897
if (mMaintainVisibleContentPositionHelper != null) {
876898
mMaintainVisibleContentPositionHelper.stop();
877899
}
900+
if (mVirtualViewContainerState != null) {
901+
mVirtualViewContainerState.cleanup();
902+
}
878903
}
879904

880905
@Override

0 commit comments

Comments
 (0)