/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.views.scroll; import android.os.SystemClock; /** * Android has a bug where onScrollChanged is called twice per frame with the same params during * flings. We hack around that here by trying to detect that duplicate call and not dispatch it. See * https://code.google.com/p/android/issues/detail?id=39473 */ public class OnScrollDispatchHelper { private static final int MIN_EVENT_SEPARATION_MS = 10; private int mPrevX = Integer.MIN_VALUE; private int mPrevY = Integer.MIN_VALUE; private long mLastScrollEventTimeMs = -(MIN_EVENT_SEPARATION_MS + 1); /** * Call from a ScrollView in onScrollChanged, returns true if this onScrollChanged is legit (not a * duplicate) and should be dispatched. */ public boolean onScrollChanged(int x, int y) { long eventTime = SystemClock.uptimeMillis(); boolean shouldDispatch = eventTime - mLastScrollEventTimeMs > MIN_EVENT_SEPARATION_MS || mPrevX != x || mPrevY != y; mLastScrollEventTimeMs = eventTime; mPrevX = x; mPrevY = y; return shouldDispatch; } }