From 6cf12aae0ac98aa2a7027e4788e29df29dee650c Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Wed, 4 Sep 2019 11:12:00 -0700 Subject: [PATCH 1/7] Initial attempt at fixing issue #23870 by overriding getChildVisibleRect() in ReactViewGroup --- .../react/views/view/ReactViewGroup.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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 e6b8dcd9bdc1d8..80ced4d1b47078 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 @@ -24,6 +24,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import android.view.ViewStructure; import android.view.animation.Animation; import androidx.annotation.NonNull; @@ -455,6 +456,53 @@ private void updateSubviewClipStatus(View subview) { } } + @Override + public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + // This is based on the Android ViewGroup implementation, modified to clip child rects + // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which + // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false + // regardless of whether clipping is desired. + + final RectF rect = new RectF(); + rect.set(r); + + child.getMatrix().mapRect(rect); + + final int dx = child.getLeft() - getScrollX(); + int dy = child.getTop() - getScrollY(); + + rect.offset(dx, dy); + + if (offset != null) { + float[] position = new float[2]; + position[0] = offset.x; + position[1] = offset.y; + child.getMatrix().mapPoints(position); + offset.x = Math.round(position[0]) + dx; + offset.y = Math.round(position[1]) + dy; + } + + final int width = getRight() - getLeft(); + final int height = getBottom() - getTop(); + + boolean rectIsVisible = true; + + ViewParent parent = getParent(); + String overflow = getOverflow(); + if (parent == null || + (overflow != null && overflow.equals(ViewProps.HIDDEN))) { + rectIsVisible = rect.intersect(0, 0, width, height); + } + + r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), + (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); + + if (rectIsVisible && parent != null) { + rectIsVisible = parent.getChildVisibleRect(this, r, offset); + } + return rectIsVisible; + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); From 4a8359c6ea4e5f338945a78224a02889b1e7f9a1 Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Wed, 4 Sep 2019 13:32:08 -0700 Subject: [PATCH 2/7] Ensure non-ReactViewGroup-derived ViewGroups will use the correct implementation of getChildVisibleRect, misc cleanup --- .../facebook/react/views/view/ReactViewGroup.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 80ced4d1b47078..70965949ee1e69 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 @@ -462,7 +462,6 @@ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point of // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false // regardless of whether clipping is desired. - final RectF rect = new RectF(); rect.set(r); @@ -488,9 +487,7 @@ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point of boolean rectIsVisible = true; ViewParent parent = getParent(); - String overflow = getOverflow(); - if (parent == null || - (overflow != null && overflow.equals(ViewProps.HIDDEN))) { + if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { rectIsVisible = rect.intersect(0, 0, width, height); } @@ -503,6 +500,14 @@ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point of return rectIsVisible; } + // Override the @hide decorated API as well, because ViewGroups will call it. + public boolean getChildVisibleRect( + View child, Rect r, android.graphics.Point offset, boolean forceParentCheck) { + // It's safe to discard 'forceParentCheck' as it is only used internal to the Android SDK + // for testing ViewGroup. + return getChildVisibleRect(child, r, offset); + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); From c33899c1037203ba493905da837afd6c083f7a15 Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Thu, 12 Sep 2019 16:54:23 -0700 Subject: [PATCH 3/7] Remove uncalled override of @hide marked API, add getChildVisibleRect to additional implementers of ReactClippingViewGroup --- .../scroll/ReactHorizontalScrollView.java | 47 +++++++++++++++++++ .../react/views/scroll/ReactScrollView.java | 47 +++++++++++++++++++ .../react/views/view/ReactViewGroup.java | 8 ---- 3 files changed, 94 insertions(+), 8 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index b0c12831a01476..2fa4a57028459f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -10,6 +10,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; @@ -17,6 +18,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.ViewParent; import android.widget.HorizontalScrollView; import android.widget.OverScroller; import androidx.annotation.Nullable; @@ -491,6 +493,51 @@ public void getClippingRect(Rect outClippingRect) { outClippingRect.set(Assertions.assertNotNull(mClippingRect)); } + @Override + public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + Log.e(getClass().toString(), "public override"); + // This is based on the Android ViewGroup implementation, modified to clip child rects + // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which + // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false + // regardless of whether clipping is desired. + final RectF rect = new RectF(); + rect.set(r); + + child.getMatrix().mapRect(rect); + + final int dx = child.getLeft() - getScrollX(); + int dy = child.getTop() - getScrollY(); + + rect.offset(dx, dy); + + if (offset != null) { + float[] position = new float[2]; + position[0] = offset.x; + position[1] = offset.y; + child.getMatrix().mapPoints(position); + offset.x = Math.round(position[0]) + dx; + offset.y = Math.round(position[1]) + dy; + } + + final int width = getRight() - getLeft(); + final int height = getBottom() - getTop(); + + boolean rectIsVisible = true; + + ViewParent parent = getParent(); + if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { + rectIsVisible = rect.intersect(0, 0, width, height); + } + + r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), + (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); + + if (rectIsVisible && parent != null) { + rectIsVisible = parent.getChildVisibleRect(this, r, offset); + } + return rectIsVisible; + } + private int getSnapInterval() { if (mSnapInterval != 0) { return mSnapInterval; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index db071fbb49ded7..832f26de300b45 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -9,6 +9,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; @@ -16,6 +17,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import android.widget.OverScroller; import android.widget.ScrollView; import androidx.annotation.Nullable; @@ -342,6 +344,51 @@ public void getClippingRect(Rect outClippingRect) { outClippingRect.set(Assertions.assertNotNull(mClippingRect)); } + @Override + public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + Log.e(getClass().toString(), "public override"); + // This is based on the Android ViewGroup implementation, modified to clip child rects + // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which + // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false + // regardless of whether clipping is desired. + final RectF rect = new RectF(); + rect.set(r); + + child.getMatrix().mapRect(rect); + + final int dx = child.getLeft() - getScrollX(); + int dy = child.getTop() - getScrollY(); + + rect.offset(dx, dy); + + if (offset != null) { + float[] position = new float[2]; + position[0] = offset.x; + position[1] = offset.y; + child.getMatrix().mapPoints(position); + offset.x = Math.round(position[0]) + dx; + offset.y = Math.round(position[1]) + dy; + } + + final int width = getRight() - getLeft(); + final int height = getBottom() - getTop(); + + boolean rectIsVisible = true; + + ViewParent parent = getParent(); + if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { + rectIsVisible = rect.intersect(0, 0, width, height); + } + + r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), + (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); + + if (rectIsVisible && parent != null) { + rectIsVisible = parent.getChildVisibleRect(this, r, offset); + } + return rectIsVisible; + } + @Override public void fling(int velocityY) { // Workaround. 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 70965949ee1e69..dabb9f4f8205af 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 @@ -500,14 +500,6 @@ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point of return rectIsVisible; } - // Override the @hide decorated API as well, because ViewGroups will call it. - public boolean getChildVisibleRect( - View child, Rect r, android.graphics.Point offset, boolean forceParentCheck) { - // It's safe to discard 'forceParentCheck' as it is only used internal to the Android SDK - // for testing ViewGroup. - return getChildVisibleRect(child, r, offset); - } - @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); From 85febce5e13e74b9fa4610a0af8e450405a09d55 Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Sun, 15 Sep 2019 17:28:13 -0700 Subject: [PATCH 4/7] remove unnecessary log statements --- .../facebook/react/views/scroll/ReactHorizontalScrollView.java | 1 - .../java/com/facebook/react/views/scroll/ReactScrollView.java | 1 - 2 files changed, 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 2fa4a57028459f..ffeaac41641c81 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -495,7 +495,6 @@ public void getClippingRect(Rect outClippingRect) { @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - Log.e(getClass().toString(), "public override"); // This is based on the Android ViewGroup implementation, modified to clip child rects // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 832f26de300b45..7f48e266716a0e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -346,7 +346,6 @@ public void getClippingRect(Rect outClippingRect) { @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - Log.e(getClass().toString(), "public override"); // This is based on the Android ViewGroup implementation, modified to clip child rects // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false From 57383f6faed2296316ce86447681d3e5be65f60a Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Mon, 16 Sep 2019 14:07:26 -0700 Subject: [PATCH 5/7] One more getChildVisibleRect override was necessary to maintain recursion for compat. with ReactHorizontalScrollView --- .../ReactHorizontalScrollContainerView.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java index f64600b13a6102..84f1d37564374b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java @@ -6,10 +6,15 @@ package com.facebook.react.views.scroll; import android.content.Context; +import android.graphics.Rect; +import android.graphics.RectF; +import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import android.widget.HorizontalScrollView; import androidx.core.view.ViewCompat; import com.facebook.react.modules.i18nmanager.I18nUtil; +import com.facebook.react.uimanager.ViewProps; /** Container of Horizontal scrollViews that supports RTL scrolling. */ public class ReactHorizontalScrollContainerView extends ViewGroup { @@ -45,4 +50,48 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto } mCurrentWidth = getWidth(); } + + @Override + public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + // This is based on the Android ViewGroup implementation, modified to clip child rects + // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which + // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false + // regardless of whether clipping is desired. + final RectF rect = new RectF(); + rect.set(r); + + child.getMatrix().mapRect(rect); + + final int dx = child.getLeft() - getScrollX(); + int dy = child.getTop() - getScrollY(); + + rect.offset(dx, dy); + + if (offset != null) { + float[] position = new float[2]; + position[0] = offset.x; + position[1] = offset.y; + child.getMatrix().mapPoints(position); + offset.x = Math.round(position[0]) + dx; + offset.y = Math.round(position[1]) + dy; + } + + final int width = getRight() - getLeft(); + final int height = getBottom() - getTop(); + + boolean rectIsVisible = true; + + ViewParent parent = getParent(); + if (parent == null) { + rectIsVisible = rect.intersect(0, 0, width, height); + } + + r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), + (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); + + if (rectIsVisible && parent != null) { + rectIsVisible = parent.getChildVisibleRect(this, r, offset); + } + return rectIsVisible; + } } From 149ef3ed8d08d359c604a883d1a27a484a5709cd Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Wed, 18 Sep 2019 09:50:25 -0700 Subject: [PATCH 6/7] Move replicated code into ReactClippingViewGroupHelper.java, missing `final` --- .../ReactClippingViewGroupHelper.java | 44 +++++++++++++++++++ .../ReactHorizontalScrollContainerView.java | 42 +----------------- .../scroll/ReactHorizontalScrollView.java | 41 +---------------- .../react/views/scroll/ReactScrollView.java | 41 +---------------- .../react/views/view/ReactViewGroup.java | 41 +---------------- 5 files changed, 49 insertions(+), 160 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java index 78e51eaa21b08c..e47c2618802997 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java @@ -7,6 +7,7 @@ package com.facebook.react.uimanager; import android.graphics.Rect; +import android.graphics.RectF; import android.view.View; import android.view.ViewParent; import javax.annotation.concurrent.NotThreadSafe; @@ -55,4 +56,47 @@ public static void calculateClippingRect(View view, Rect outputRect) { } view.getDrawingRect(outputRect); } + + public static boolean getChildVisibleRectHelper(View child, Rect r, android.graphics.Point offset, View parent, String overflow) { + // This is based on the Android ViewGroup implementation, modified to clip child rects + // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which + // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false + // regardless of whether clipping is desired. + final RectF rect = new RectF(); + rect.set(r); + + child.getMatrix().mapRect(rect); + + final int dx = child.getLeft() - parent.getScrollX(); + final int dy = child.getTop() - parent.getScrollY(); + + rect.offset(dx, dy); + + if (offset != null) { + float[] position = new float[2]; + position[0] = offset.x; + position[1] = offset.y; + child.getMatrix().mapPoints(position); + offset.x = Math.round(position[0]) + dx; + offset.y = Math.round(position[1]) + dy; + } + + final int width = parent.getRight() - parent.getLeft(); + final int height = parent.getBottom() - parent.getTop(); + + boolean rectIsVisible = true; + + ViewParent grandparent = parent.getParent(); + if (grandparent == null || ViewProps.HIDDEN.equals(overflow)) { + rectIsVisible = rect.intersect(0, 0, width, height); + } + + r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), + (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); + + if (rectIsVisible && grandparent != null) { + rectIsVisible = grandparent.getChildVisibleRect(parent, r, offset); + } + return rectIsVisible; + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java index 84f1d37564374b..27410fd513f020 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java @@ -14,6 +14,7 @@ import android.widget.HorizontalScrollView; import androidx.core.view.ViewCompat; import com.facebook.react.modules.i18nmanager.I18nUtil; +import com.facebook.react.uimanager.ReactClippingViewGroupHelper; import com.facebook.react.uimanager.ViewProps; /** Container of Horizontal scrollViews that supports RTL scrolling. */ @@ -53,45 +54,6 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - // This is based on the Android ViewGroup implementation, modified to clip child rects - // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which - // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false - // regardless of whether clipping is desired. - final RectF rect = new RectF(); - rect.set(r); - - child.getMatrix().mapRect(rect); - - final int dx = child.getLeft() - getScrollX(); - int dy = child.getTop() - getScrollY(); - - rect.offset(dx, dy); - - if (offset != null) { - float[] position = new float[2]; - position[0] = offset.x; - position[1] = offset.y; - child.getMatrix().mapPoints(position); - offset.x = Math.round(position[0]) + dx; - offset.y = Math.round(position[1]) + dy; - } - - final int width = getRight() - getLeft(); - final int height = getBottom() - getTop(); - - boolean rectIsVisible = true; - - ViewParent parent = getParent(); - if (parent == null) { - rectIsVisible = rect.intersect(0, 0, width, height); - } - - r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), - (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); - - if (rectIsVisible && parent != null) { - rectIsVisible = parent.getChildVisibleRect(this, r, offset); - } - return rectIsVisible; + return ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, ViewProps.SCROLL); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index ffeaac41641c81..54a7ded5538a53 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -495,46 +495,7 @@ public void getClippingRect(Rect outClippingRect) { @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - // This is based on the Android ViewGroup implementation, modified to clip child rects - // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which - // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false - // regardless of whether clipping is desired. - final RectF rect = new RectF(); - rect.set(r); - - child.getMatrix().mapRect(rect); - - final int dx = child.getLeft() - getScrollX(); - int dy = child.getTop() - getScrollY(); - - rect.offset(dx, dy); - - if (offset != null) { - float[] position = new float[2]; - position[0] = offset.x; - position[1] = offset.y; - child.getMatrix().mapPoints(position); - offset.x = Math.round(position[0]) + dx; - offset.y = Math.round(position[1]) + dy; - } - - final int width = getRight() - getLeft(); - final int height = getBottom() - getTop(); - - boolean rectIsVisible = true; - - ViewParent parent = getParent(); - if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { - rectIsVisible = rect.intersect(0, 0, width, height); - } - - r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), - (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); - - if (rectIsVisible && parent != null) { - rectIsVisible = parent.getChildVisibleRect(this, r, offset); - } - return rectIsVisible; + return ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow); } private int getSnapInterval() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 7f48e266716a0e..5c7c64f5359ccd 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -346,46 +346,7 @@ public void getClippingRect(Rect outClippingRect) { @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - // This is based on the Android ViewGroup implementation, modified to clip child rects - // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which - // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false - // regardless of whether clipping is desired. - final RectF rect = new RectF(); - rect.set(r); - - child.getMatrix().mapRect(rect); - - final int dx = child.getLeft() - getScrollX(); - int dy = child.getTop() - getScrollY(); - - rect.offset(dx, dy); - - if (offset != null) { - float[] position = new float[2]; - position[0] = offset.x; - position[1] = offset.y; - child.getMatrix().mapPoints(position); - offset.x = Math.round(position[0]) + dx; - offset.y = Math.round(position[1]) + dy; - } - - final int width = getRight() - getLeft(); - final int height = getBottom() - getTop(); - - boolean rectIsVisible = true; - - ViewParent parent = getParent(); - if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { - rectIsVisible = rect.intersect(0, 0, width, height); - } - - r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), - (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); - - if (rectIsVisible && parent != null) { - rectIsVisible = parent.getChildVisibleRect(this, r, offset); - } - return rectIsVisible; + return ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow); } @Override 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 dabb9f4f8205af..12c3bd924160ae 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 @@ -458,46 +458,7 @@ private void updateSubviewClipStatus(View subview) { @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - // This is based on the Android ViewGroup implementation, modified to clip child rects - // if overflow is set to ViewProps.HIDDEN. This effectively solves Issue #23870 which - // appears to have been introduced by FLAG_CLIP_CHILDREN being forced false - // regardless of whether clipping is desired. - final RectF rect = new RectF(); - rect.set(r); - - child.getMatrix().mapRect(rect); - - final int dx = child.getLeft() - getScrollX(); - int dy = child.getTop() - getScrollY(); - - rect.offset(dx, dy); - - if (offset != null) { - float[] position = new float[2]; - position[0] = offset.x; - position[1] = offset.y; - child.getMatrix().mapPoints(position); - offset.x = Math.round(position[0]) + dx; - offset.y = Math.round(position[1]) + dy; - } - - final int width = getRight() - getLeft(); - final int height = getBottom() - getTop(); - - boolean rectIsVisible = true; - - ViewParent parent = getParent(); - if (parent == null || ViewProps.HIDDEN.equals(mOverflow)) { - rectIsVisible = rect.intersect(0, 0, width, height); - } - - r.set((int) Math.floor(rect.left), (int) Math.floor(rect.top), - (int) Math.ceil(rect.right), (int) Math.ceil(rect.bottom)); - - if (rectIsVisible && parent != null) { - rectIsVisible = parent.getChildVisibleRect(this, r, offset); - } - return rectIsVisible; + return ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow); } @Override From ee4f12cd3a512c79d1b311d8c8beb152c4a63412 Mon Sep 17 00:00:00 2001 From: David Biedenbach Date: Wed, 18 Sep 2019 16:08:05 -0700 Subject: [PATCH 7/7] Clean up unused imports --- .../react/views/scroll/ReactHorizontalScrollContainerView.java | 2 -- .../facebook/react/views/scroll/ReactHorizontalScrollView.java | 2 -- .../java/com/facebook/react/views/scroll/ReactScrollView.java | 2 -- .../main/java/com/facebook/react/views/view/ReactViewGroup.java | 1 - 4 files changed, 7 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java index 27410fd513f020..d6cc31856807d3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java @@ -7,10 +7,8 @@ import android.content.Context; import android.graphics.Rect; -import android.graphics.RectF; import android.view.View; import android.view.ViewGroup; -import android.view.ViewParent; import android.widget.HorizontalScrollView; import androidx.core.view.ViewCompat; import com.facebook.react.modules.i18nmanager.I18nUtil; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 54a7ded5538a53..626509abd3ee7b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -10,7 +10,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; @@ -18,7 +17,6 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewParent; import android.widget.HorizontalScrollView; import android.widget.OverScroller; import androidx.annotation.Nullable; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 5c7c64f5359ccd..4a274848f1da91 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -9,7 +9,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.Log; @@ -17,7 +16,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.ViewParent; import android.widget.OverScroller; import android.widget.ScrollView; import androidx.annotation.Nullable; 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 12c3bd924160ae..75689340b29e35 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 @@ -24,7 +24,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.ViewParent; import android.view.ViewStructure; import android.view.animation.Animation; import androidx.annotation.NonNull;