Commit c7d4c175 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Handle FlingEndAck event through GestureListenerManager

FlingEnd events can be viewed as one of gesture ack events
except it comes from InputRouter. This CL reroutes the flow
for it and the other gesture events to RenderWidgetHostViewAndroid/
GestureListenerManager diretly to match how it is handled in other
platforms.

Bug: 598880
Change-Id: Ie650aa7a24042d55f68cbffe67330007e80c8089
Reviewed-on: https://chromium-review.googlesource.com/934102Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#538995}
parent e63b3706
...@@ -483,14 +483,6 @@ void ContentViewCore::RequestDisallowInterceptTouchEvent() { ...@@ -483,14 +483,6 @@ void ContentViewCore::RequestDisallowInterceptTouchEvent() {
Java_ContentViewCoreImpl_requestDisallowInterceptTouchEvent(env, obj); Java_ContentViewCoreImpl_requestDisallowInterceptTouchEvent(env, obj);
} }
void ContentViewCore::DidStopFlinging() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
if (!obj.is_null())
Java_ContentViewCoreImpl_onNativeFlingStopped(env, obj);
}
gfx::Size ContentViewCore::GetViewportSizePix() const { gfx::Size ContentViewCore::GetViewportSizePix() const {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
......
...@@ -205,8 +205,6 @@ class ContentViewCore : public WebContentsObserver { ...@@ -205,8 +205,6 @@ class ContentViewCore : public WebContentsObserver {
void RequestDisallowInterceptTouchEvent(); void RequestDisallowInterceptTouchEvent();
bool FilterInputEvent(const blink::WebInputEvent& event); bool FilterInputEvent(const blink::WebInputEvent& event);
void DidStopFlinging();
// Returns the context with which the ContentViewCore was created, typically // Returns the context with which the ContentViewCore was created, typically
// the Activity context. // the Activity context.
base::android::ScopedJavaLocalRef<jobject> GetContext() const; base::android::ScopedJavaLocalRef<jobject> GetContext() const;
......
...@@ -24,8 +24,7 @@ namespace content { ...@@ -24,8 +24,7 @@ namespace content {
GestureListenerManager::GestureListenerManager(JNIEnv* env, GestureListenerManager::GestureListenerManager(JNIEnv* env,
const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& obj,
WebContents* web_contents) WebContents* web_contents)
: java_ref_(env, obj) { : RenderWidgetHostConnector(web_contents), java_ref_(env, obj) {}
}
GestureListenerManager::~GestureListenerManager() { GestureListenerManager::~GestureListenerManager() {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
...@@ -91,6 +90,24 @@ void GestureListenerManager::GestureEventAck( ...@@ -91,6 +90,24 @@ void GestureListenerManager::GestureEventAck(
} }
} }
void GestureListenerManager::DidStopFlinging() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
if (j_obj.is_null())
return;
Java_GestureListenerManagerImpl_onFlingEnd(env, j_obj);
}
void GestureListenerManager::UpdateRenderProcessConnection(
RenderWidgetHostViewAndroid* old_rwhva,
RenderWidgetHostViewAndroid* new_rwhva) {
if (old_rwhva)
old_rwhva->set_gesture_listener_manager(nullptr);
if (new_rwhva) {
new_rwhva->set_gesture_listener_manager(this);
}
}
jlong JNI_GestureListenerManagerImpl_Init( jlong JNI_GestureListenerManagerImpl_Init(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& obj,
...@@ -98,11 +115,9 @@ jlong JNI_GestureListenerManagerImpl_Init( ...@@ -98,11 +115,9 @@ jlong JNI_GestureListenerManagerImpl_Init(
auto* web_contents = WebContents::FromJavaWebContents(jweb_contents); auto* web_contents = WebContents::FromJavaWebContents(jweb_contents);
CHECK(web_contents) << "Should be created with a valid WebContents."; CHECK(web_contents) << "Should be created with a valid WebContents.";
WebContentsViewAndroid* view = static_cast<WebContentsViewAndroid*>( // Owns itself and gets destroyed when |WebContentsDestroyed| is called.
static_cast<WebContentsImpl*>(web_contents)->GetView());
auto* manager = new GestureListenerManager(env, obj, web_contents); auto* manager = new GestureListenerManager(env, obj, web_contents);
view->SetGestureListenerManager( manager->Initialize();
std::unique_ptr<GestureListenerManager>(manager));
return reinterpret_cast<intptr_t>(manager); return reinterpret_cast<intptr_t>(manager);
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/android/jni_weak_ref.h" #include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/macros.h" #include "base/macros.h"
#include "content/browser/android/render_widget_host_connector.h"
#include "content/public/common/input_event_ack_state.h" #include "content/public/common/input_event_ack_state.h"
namespace blink { namespace blink {
...@@ -18,18 +19,23 @@ namespace content { ...@@ -18,18 +19,23 @@ namespace content {
class WebContents; class WebContents;
// Native class for GestureListenerManagerImpl. Owned by // Native class for GestureListenerManagerImpl.
// |WebContentsViewAndroid|. class GestureListenerManager : public RenderWidgetHostConnector {
class GestureListenerManager {
public: public:
GestureListenerManager(JNIEnv* env, GestureListenerManager(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
WebContents* web_contents); WebContents* web_contents);
~GestureListenerManager(); ~GestureListenerManager() override;
void Reset(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void Reset(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void GestureEventAck(const blink::WebGestureEvent& event, void GestureEventAck(const blink::WebGestureEvent& event,
InputEventAckState ack_result); InputEventAckState ack_result);
void DidStopFlinging();
// RendetWidgetHostConnector implementation.
void UpdateRenderProcessConnection(
RenderWidgetHostViewAndroid* old_rwhva,
RenderWidgetHostViewAndroid* new_rhwva) override;
private: private:
// A weak reference to the Java GestureListenerManager object. // A weak reference to the Java GestureListenerManager object.
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "content/browser/accessibility/browser_accessibility_manager_android.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h"
#include "content/browser/accessibility/web_contents_accessibility_android.h" #include "content/browser/accessibility/web_contents_accessibility_android.h"
#include "content/browser/android/content_view_core.h" #include "content/browser/android/content_view_core.h"
#include "content/browser/android/gesture_listener_manager.h"
#include "content/browser/android/ime_adapter_android.h" #include "content/browser/android/ime_adapter_android.h"
#include "content/browser/android/overscroll_controller_android.h" #include "content/browser/android/overscroll_controller_android.h"
#include "content/browser/android/selection_popup_controller.h" #include "content/browser/android/selection_popup_controller.h"
...@@ -176,6 +177,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( ...@@ -176,6 +177,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
tap_disambiguator_(nullptr), tap_disambiguator_(nullptr),
selection_popup_controller_(nullptr), selection_popup_controller_(nullptr),
text_suggestion_host_(nullptr), text_suggestion_host_(nullptr),
gesture_listener_manager_(nullptr),
background_color_(SK_ColorWHITE), background_color_(SK_ColorWHITE),
cached_background_color_(SK_ColorWHITE), cached_background_color_(SK_ColorWHITE),
view_(this, ui::ViewAndroid::LayoutType::MATCH_PARENT), view_(this, ui::ViewAndroid::LayoutType::MATCH_PARENT),
...@@ -1485,9 +1487,9 @@ void RenderWidgetHostViewAndroid::GestureEventAck( ...@@ -1485,9 +1487,9 @@ void RenderWidgetHostViewAndroid::GestureEventAck(
if (overscroll_controller_) if (overscroll_controller_)
overscroll_controller_->OnGestureEventAck(event, ack_result); overscroll_controller_->OnGestureEventAck(event, ack_result);
auto* view = GetRenderViewHostDelegateView(); if (!gesture_listener_manager_)
if (view) return;
view->GestureEventAck(event, ack_result); gesture_listener_manager_->GestureEventAck(event, ack_result);
} }
RenderViewHostDelegateView* RenderViewHostDelegateView*
...@@ -1794,8 +1796,9 @@ void RenderWidgetHostViewAndroid::DidOverscroll( ...@@ -1794,8 +1796,9 @@ void RenderWidgetHostViewAndroid::DidOverscroll(
} }
void RenderWidgetHostViewAndroid::DidStopFlinging() { void RenderWidgetHostViewAndroid::DidStopFlinging() {
if (content_view_core_) if (!gesture_listener_manager_)
content_view_core_->DidStopFlinging(); return;
gesture_listener_manager_->DidStopFlinging();
} }
RenderWidgetHostImpl* RenderWidgetHostViewAndroid::GetRenderWidgetHostImpl() RenderWidgetHostImpl* RenderWidgetHostViewAndroid::GetRenderWidgetHostImpl()
......
...@@ -49,6 +49,7 @@ struct DidOverscrollParams; ...@@ -49,6 +49,7 @@ struct DidOverscrollParams;
namespace content { namespace content {
class ContentViewCore; class ContentViewCore;
class GestureListenerManager;
class ImeAdapterAndroid; class ImeAdapterAndroid;
class OverscrollControllerAndroid; class OverscrollControllerAndroid;
class RenderWidgetHostImpl; class RenderWidgetHostImpl;
...@@ -269,6 +270,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid ...@@ -269,6 +270,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
TextSuggestionHostAndroid* text_suggestion_host) { TextSuggestionHostAndroid* text_suggestion_host) {
text_suggestion_host_ = text_suggestion_host; text_suggestion_host_ = text_suggestion_host;
} }
void set_gesture_listener_manager(GestureListenerManager* manager) {
gesture_listener_manager_ = manager;
}
base::WeakPtr<RenderWidgetHostViewAndroid> GetWeakPtrAndroid(); base::WeakPtr<RenderWidgetHostViewAndroid> GetWeakPtrAndroid();
...@@ -415,6 +419,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid ...@@ -415,6 +419,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
TapDisambiguator* tap_disambiguator_; TapDisambiguator* tap_disambiguator_;
SelectionPopupController* selection_popup_controller_; SelectionPopupController* selection_popup_controller_;
TextSuggestionHostAndroid* text_suggestion_host_; TextSuggestionHostAndroid* text_suggestion_host_;
GestureListenerManager* gesture_listener_manager_;
// The background color of the widget. // The background color of the widget.
SkColor background_color_; SkColor background_color_;
......
...@@ -90,8 +90,7 @@ WebContentsViewAndroid::WebContentsViewAndroid( ...@@ -90,8 +90,7 @@ WebContentsViewAndroid::WebContentsViewAndroid(
content_view_core_(NULL), content_view_core_(NULL),
delegate_(delegate), delegate_(delegate),
view_(this, ui::ViewAndroid::LayoutType::NORMAL), view_(this, ui::ViewAndroid::LayoutType::NORMAL),
synchronous_compositor_client_(nullptr), synchronous_compositor_client_(nullptr) {}
gesture_listener_manager_(nullptr) {}
WebContentsViewAndroid::~WebContentsViewAndroid() { WebContentsViewAndroid::~WebContentsViewAndroid() {
if (view_.GetLayer()) if (view_.GetLayer())
...@@ -160,12 +159,6 @@ WebContentsViewAndroid::GetRenderWidgetHostViewAndroid() { ...@@ -160,12 +159,6 @@ WebContentsViewAndroid::GetRenderWidgetHostViewAndroid() {
web_contents_->GetRenderWidgetHostView()); web_contents_->GetRenderWidgetHostView());
} }
void WebContentsViewAndroid::SetGestureListenerManager(
std::unique_ptr<GestureListenerManager> manager) {
DCHECK(!gesture_listener_manager_);
gesture_listener_manager_ = std::move(manager);
}
gfx::NativeWindow WebContentsViewAndroid::GetTopLevelNativeWindow() const { gfx::NativeWindow WebContentsViewAndroid::GetTopLevelNativeWindow() const {
return content_view_core_ ? content_view_core_->GetWindowAndroid() : nullptr; return content_view_core_ ? content_view_core_->GetWindowAndroid() : nullptr;
} }
...@@ -493,14 +486,6 @@ bool WebContentsViewAndroid::DoBrowserControlsShrinkBlinkSize() const { ...@@ -493,14 +486,6 @@ bool WebContentsViewAndroid::DoBrowserControlsShrinkBlinkSize() const {
return delegate ? delegate->DoBrowserControlsShrinkBlinkSize() : false; return delegate ? delegate->DoBrowserControlsShrinkBlinkSize() : false;
} }
void WebContentsViewAndroid::GestureEventAck(
const blink::WebGestureEvent& event,
InputEventAckState ack_result) {
if (!gesture_listener_manager_)
return;
gesture_listener_manager_->GestureEventAck(event, ack_result);
}
bool WebContentsViewAndroid::OnTouchEvent(const ui::MotionEventAndroid& event) { bool WebContentsViewAndroid::OnTouchEvent(const ui::MotionEventAndroid& event) {
if (event.GetAction() == ui::MotionEventAndroid::Action::DOWN) if (event.GetAction() == ui::MotionEventAndroid::Action::DOWN)
content_view_core_->OnTouchDown(event.GetJavaObject()); content_view_core_->OnTouchDown(event.GetJavaObject());
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "content/browser/android/gesture_listener_manager.h"
#include "content/browser/renderer_host/render_view_host_delegate_view.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h"
#include "content/browser/web_contents/web_contents_view.h" #include "content/browser/web_contents/web_contents_view.h"
#include "content/public/browser/web_contents_view_delegate.h" #include "content/public/browser/web_contents_view_delegate.h"
...@@ -19,10 +18,6 @@ ...@@ -19,10 +18,6 @@
#include "ui/android/view_client.h" #include "ui/android/view_client.h"
#include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/rect_f.h"
namespace blink {
class WebGestureEvent;
}
namespace content { namespace content {
class ContentViewCore; class ContentViewCore;
class RenderWidgetHostViewAndroid; class RenderWidgetHostViewAndroid;
...@@ -56,9 +51,6 @@ class WebContentsViewAndroid : public WebContentsView, ...@@ -56,9 +51,6 @@ class WebContentsViewAndroid : public WebContentsView,
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid(); RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
void SetGestureListenerManager(
std::unique_ptr<GestureListenerManager> manager);
// WebContentsView implementation -------------------------------------------- // WebContentsView implementation --------------------------------------------
gfx::NativeView GetNativeView() const override; gfx::NativeView GetNativeView() const override;
gfx::NativeView GetContentNativeView() const override; gfx::NativeView GetContentNativeView() const override;
...@@ -110,8 +102,6 @@ class WebContentsViewAndroid : public WebContentsView, ...@@ -110,8 +102,6 @@ class WebContentsViewAndroid : public WebContentsView,
int GetTopControlsHeight() const override; int GetTopControlsHeight() const override;
int GetBottomControlsHeight() const override; int GetBottomControlsHeight() const override;
bool DoBrowserControlsShrinkBlinkSize() const override; bool DoBrowserControlsShrinkBlinkSize() const override;
void GestureEventAck(const blink::WebGestureEvent& event,
InputEventAckState ack_result) override;
// ui::ViewClient implementation. // ui::ViewClient implementation.
bool OnTouchEvent(const ui::MotionEventAndroid& event) override; bool OnTouchEvent(const ui::MotionEventAndroid& event) override;
...@@ -151,9 +141,6 @@ class WebContentsViewAndroid : public WebContentsView, ...@@ -151,9 +141,6 @@ class WebContentsViewAndroid : public WebContentsView,
// Interface used to get notified of events from the synchronous compositor. // Interface used to get notified of events from the synchronous compositor.
SynchronousCompositorClient* synchronous_compositor_client_; SynchronousCompositorClient* synchronous_compositor_client_;
// The manager for gesture event listeners.
std::unique_ptr<GestureListenerManager> gesture_listener_manager_;
gfx::PointF drag_location_; gfx::PointF drag_location_;
gfx::PointF drag_screen_location_; gfx::PointF drag_screen_location_;
......
...@@ -111,7 +111,13 @@ public class ContentViewCoreImpl ...@@ -111,7 +111,13 @@ public class ContentViewCoreImpl
private class ContentGestureStateListener implements GestureStateListener { private class ContentGestureStateListener implements GestureStateListener {
@Override @Override
public void onFlingStartGesture(int scrollOffsetY, int scrollExtentY) { public void onFlingStartGesture(int scrollOffsetY, int scrollExtentY) {
mPotentiallyActiveFlingCount++; setTouchScrollInProgress(false);
}
@Override
public void onFlingEndGesture(int scrollOffsetY, int scrollExtentY) {
// Note that mTouchScrollInProgress should normally be false at this
// point, but we reset it anyway as another failsafe.
setTouchScrollInProgress(false); setTouchScrollInProgress(false);
} }
...@@ -174,10 +180,6 @@ public class ContentViewCoreImpl ...@@ -174,10 +180,6 @@ public class ContentViewCoreImpl
// sequence, so this will also be true for the duration of a pinch gesture. // sequence, so this will also be true for the duration of a pinch gesture.
private boolean mTouchScrollInProgress; private boolean mTouchScrollInProgress;
// The outstanding fling start events that hasn't got fling end yet. It may be > 1 because
// onNativeFlingStopped() is called asynchronously.
private int mPotentiallyActiveFlingCount;
/** /**
* PID used to indicate an invalid render process. * PID used to indicate an invalid render process.
*/ */
...@@ -473,7 +475,7 @@ public class ContentViewCoreImpl ...@@ -473,7 +475,7 @@ public class ContentViewCoreImpl
@Override @Override
public boolean isScrollInProgress() { public boolean isScrollInProgress() {
return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; return mTouchScrollInProgress || getGestureListenerManager().hasPotentiallyActiveFling();
} }
private void setTouchScrollInProgress(boolean inProgress) { private void setTouchScrollInProgress(boolean inProgress) {
...@@ -756,7 +758,7 @@ public class ContentViewCoreImpl ...@@ -756,7 +758,7 @@ public class ContentViewCoreImpl
// It's a very real (and valid) possibility that a fling may still // It's a very real (and valid) possibility that a fling may still
// be active when programatically scrolling. Cancelling the fling in // be active when programatically scrolling. Cancelling the fling in
// such cases ensures a consistent gesture event stream. // such cases ensures a consistent gesture event stream.
if (mPotentiallyActiveFlingCount > 0) { if (getGestureListenerManager().hasPotentiallyActiveFling()) {
getEventForwarder().onCancelFling(time); getEventForwarder().onCancelFling(time);
} }
// x/y represents starting location of scroll. // x/y represents starting location of scroll.
...@@ -1043,23 +1045,10 @@ public class ContentViewCoreImpl ...@@ -1043,23 +1045,10 @@ public class ContentViewCoreImpl
if (!isScrollInProgress()) return; if (!isScrollInProgress()) return;
final boolean touchScrollInProgress = mTouchScrollInProgress; final boolean touchScrollInProgress = mTouchScrollInProgress;
final int potentiallyActiveFlingCount = mPotentiallyActiveFlingCount;
mPotentiallyActiveFlingCount = 0;
setTouchScrollInProgress(false); setTouchScrollInProgress(false);
if (touchScrollInProgress) getGestureListenerManager().updateOnScrollEnd(); if (touchScrollInProgress) getGestureListenerManager().updateOnScrollEnd();
if (potentiallyActiveFlingCount > 0) getGestureListenerManager().updateOnFlingEnd(); getGestureListenerManager().resetFlingGesture();
}
@CalledByNative
private void onNativeFlingStopped() {
if (mPotentiallyActiveFlingCount > 0) {
mPotentiallyActiveFlingCount--;
getGestureListenerManager().updateOnFlingEnd();
}
// Note that mTouchScrollInProgress should normally be false at this
// point, but we reset it anyway as another failsafe.
setTouchScrollInProgress(false);
} }
// DisplayAndroidObserver method. // DisplayAndroidObserver method.
......
...@@ -33,6 +33,10 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo ...@@ -33,6 +33,10 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
private final ObserverList<GestureStateListener> mListeners; private final ObserverList<GestureStateListener> mListeners;
private final RewindableIterator<GestureStateListener> mIterator; private final RewindableIterator<GestureStateListener> mIterator;
// The outstanding fling start events that hasn't got fling end yet. It may be > 1 because
// onFlingEnd() is called asynchronously.
private int mPotentiallyActiveFlingCount;
private long mNativeGestureListenerManager; private long mNativeGestureListenerManager;
/** /**
...@@ -74,6 +78,11 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo ...@@ -74,6 +78,11 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
for (mIterator.rewind(); mIterator.hasNext();) mIterator.next().onTouchDown(); for (mIterator.rewind(); mIterator.hasNext();) mIterator.next().onTouchDown();
} }
/** Checks if there's outstanding fling start events that hasn't got fling end yet. */
public boolean hasPotentiallyActiveFling() {
return mPotentiallyActiveFlingCount > 0;
}
// WindowEventObserver // WindowEventObserver
@Override @Override
...@@ -112,8 +121,17 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo ...@@ -112,8 +121,17 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
} }
} }
/** Update all the listeners after fling end event occurred. */ /* Called when ongoing fling gesture needs to be reset. */
public void updateOnFlingEnd() { public void resetFlingGesture() {
if (mPotentiallyActiveFlingCount > 0) {
onFlingEnd();
mPotentiallyActiveFlingCount = 0;
}
}
@CalledByNative
private void onFlingEnd() {
if (mPotentiallyActiveFlingCount > 0) mPotentiallyActiveFlingCount--;
for (mIterator.rewind(); mIterator.hasNext();) { for (mIterator.rewind(); mIterator.hasNext();) {
mIterator.next().onFlingEndGesture(verticalScrollOffset(), verticalScrollExtent()); mIterator.next().onFlingEndGesture(verticalScrollOffset(), verticalScrollExtent());
} }
...@@ -121,6 +139,7 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo ...@@ -121,6 +139,7 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
@CalledByNative @CalledByNative
private void onFlingStartEventConsumed() { private void onFlingStartEventConsumed() {
mPotentiallyActiveFlingCount++;
for (mIterator.rewind(); mIterator.hasNext();) { for (mIterator.rewind(); mIterator.hasNext();) {
mIterator.next().onFlingStartGesture(verticalScrollOffset(), verticalScrollExtent()); mIterator.next().onFlingStartGesture(verticalScrollOffset(), verticalScrollExtent());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment