From c8141ec0549f810ebbf96fd0e48c0a51c591ed60 Mon Sep 17 00:00:00 2001 From: Daniel Leong Date: Tue, 19 Jul 2022 15:26:57 -0400 Subject: [PATCH 1/2] Only workaround the broken VelocityTracker on Android P See https://app.asana.com/0/1200546912788443/1202237077179474/f --- .../react/views/scroll/ReactScrollView.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) 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 b5376ccd3749..2326516d1b21 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 @@ -439,18 +439,7 @@ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point of @Override public void fling(int velocityY) { - // Workaround. - // On Android P if a ScrollView is inverted, we will get a wrong sign for - // velocityY (see https://issuetracker.google.com/issues/112385925). - // At the same time, mOnScrollDispatchHelper tracks the correct velocity direction. - // - // Hence, we can use the absolute value from whatever the OS gives - // us and use the sign of what mOnScrollDispatchHelper has tracked. - float signum = Math.signum(mOnScrollDispatchHelper.getYFlingVelocity()); - if (signum == 0) { - signum = Math.signum(velocityY); - } - final int correctedVelocityYOld = (int) (Math.abs(velocityY) * signum); + final int correctedVelocityYOld = adjustFlingVelocitySign(velocityY); final int correctedVelocityY; if (MAX_FLING_VELOCITY != null) { correctedVelocityY = (int) ((Math.min(Math.abs(correctedVelocityYOld), MAX_FLING_VELOCITY)) * @@ -496,6 +485,25 @@ public void fling(int velocityY) { handlePostTouchScrolling(0, correctedVelocityY); } + private int adjustFlingVelocitySign(int velocityY) { + if (Build.VERSION.SDK_INT != Build.VERSION_CODES.P) { + return velocityY; + } + + // Workaround. + // On Android P if a ScrollView is inverted, we will get a wrong sign for + // velocityY (see https://issuetracker.google.com/issues/112385925). + // At the same time, mOnScrollDispatchHelper tracks the correct velocity direction. + // + // Hence, we can use the absolute value from whatever the OS gives + // us and use the sign of what mOnScrollDispatchHelper has tracked. + float signum = Math.signum(mOnScrollDispatchHelper.getYFlingVelocity()); + if (signum == 0) { + signum = Math.signum(velocityY); + } + return (int) (Math.abs(velocityY) * signum); + } + private void enableFpsListener() { if (isScrollPerfLoggingEnabled()) { Assertions.assertNotNull(mFpsListener); From 0d64e9274cdfef852b0c3a5887d802f6a0cdca69 Mon Sep 17 00:00:00 2001 From: Daniel Leong Date: Tue, 19 Jul 2022 15:44:57 -0400 Subject: [PATCH 2/2] Actually import Build Derp. --- .../java/com/facebook/react/views/scroll/ReactScrollView.java | 1 + 1 file changed, 1 insertion(+) 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 2326516d1b21..14217d12e790 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 @@ -20,6 +20,7 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.os.Build; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View;