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() {
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 {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
......
......@@ -205,8 +205,6 @@ class ContentViewCore : public WebContentsObserver {
void RequestDisallowInterceptTouchEvent();
bool FilterInputEvent(const blink::WebInputEvent& event);
void DidStopFlinging();
// Returns the context with which the ContentViewCore was created, typically
// the Activity context.
base::android::ScopedJavaLocalRef<jobject> GetContext() const;
......
......@@ -24,8 +24,7 @@ namespace content {
GestureListenerManager::GestureListenerManager(JNIEnv* env,
const JavaParamRef<jobject>& obj,
WebContents* web_contents)
: java_ref_(env, obj) {
}
: RenderWidgetHostConnector(web_contents), java_ref_(env, obj) {}
GestureListenerManager::~GestureListenerManager() {
JNIEnv* env = AttachCurrentThread();
......@@ -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(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
......@@ -98,11 +115,9 @@ jlong JNI_GestureListenerManagerImpl_Init(
auto* web_contents = WebContents::FromJavaWebContents(jweb_contents);
CHECK(web_contents) << "Should be created with a valid WebContents.";
WebContentsViewAndroid* view = static_cast<WebContentsViewAndroid*>(
static_cast<WebContentsImpl*>(web_contents)->GetView());
// Owns itself and gets destroyed when |WebContentsDestroyed| is called.
auto* manager = new GestureListenerManager(env, obj, web_contents);
view->SetGestureListenerManager(
std::unique_ptr<GestureListenerManager>(manager));
manager->Initialize();
return reinterpret_cast<intptr_t>(manager);
}
......
......@@ -8,6 +8,7 @@
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "content/browser/android/render_widget_host_connector.h"
#include "content/public/common/input_event_ack_state.h"
namespace blink {
......@@ -18,18 +19,23 @@ namespace content {
class WebContents;
// Native class for GestureListenerManagerImpl. Owned by
// |WebContentsViewAndroid|.
class GestureListenerManager {
// Native class for GestureListenerManagerImpl.
class GestureListenerManager : public RenderWidgetHostConnector {
public:
GestureListenerManager(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
WebContents* web_contents);
~GestureListenerManager();
~GestureListenerManager() override;
void Reset(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void GestureEventAck(const blink::WebGestureEvent& event,
InputEventAckState ack_result);
void DidStopFlinging();
// RendetWidgetHostConnector implementation.
void UpdateRenderProcessConnection(
RenderWidgetHostViewAndroid* old_rwhva,
RenderWidgetHostViewAndroid* new_rhwva) override;
private:
// A weak reference to the Java GestureListenerManager object.
......
......@@ -32,6 +32,7 @@
#include "content/browser/accessibility/browser_accessibility_manager_android.h"
#include "content/browser/accessibility/web_contents_accessibility_android.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/overscroll_controller_android.h"
#include "content/browser/android/selection_popup_controller.h"
......@@ -176,6 +177,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
tap_disambiguator_(nullptr),
selection_popup_controller_(nullptr),
text_suggestion_host_(nullptr),
gesture_listener_manager_(nullptr),
background_color_(SK_ColorWHITE),
cached_background_color_(SK_ColorWHITE),
view_(this, ui::ViewAndroid::LayoutType::MATCH_PARENT),
......@@ -1485,9 +1487,9 @@ void RenderWidgetHostViewAndroid::GestureEventAck(
if (overscroll_controller_)
overscroll_controller_->OnGestureEventAck(event, ack_result);
auto* view = GetRenderViewHostDelegateView();
if (view)
view->GestureEventAck(event, ack_result);
if (!gesture_listener_manager_)
return;
gesture_listener_manager_->GestureEventAck(event, ack_result);
}
RenderViewHostDelegateView*
......@@ -1794,8 +1796,9 @@ void RenderWidgetHostViewAndroid::DidOverscroll(
}
void RenderWidgetHostViewAndroid::DidStopFlinging() {
if (content_view_core_)
content_view_core_->DidStopFlinging();
if (!gesture_listener_manager_)
return;
gesture_listener_manager_->DidStopFlinging();
}
RenderWidgetHostImpl* RenderWidgetHostViewAndroid::GetRenderWidgetHostImpl()
......
......@@ -49,6 +49,7 @@ struct DidOverscrollParams;
namespace content {
class ContentViewCore;
class GestureListenerManager;
class ImeAdapterAndroid;
class OverscrollControllerAndroid;
class RenderWidgetHostImpl;
......@@ -269,6 +270,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
TextSuggestionHostAndroid* text_suggestion_host) {
text_suggestion_host_ = text_suggestion_host;
}
void set_gesture_listener_manager(GestureListenerManager* manager) {
gesture_listener_manager_ = manager;
}
base::WeakPtr<RenderWidgetHostViewAndroid> GetWeakPtrAndroid();
......@@ -415,6 +419,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
TapDisambiguator* tap_disambiguator_;
SelectionPopupController* selection_popup_controller_;
TextSuggestionHostAndroid* text_suggestion_host_;
GestureListenerManager* gesture_listener_manager_;
// The background color of the widget.
SkColor background_color_;
......
......@@ -90,8 +90,7 @@ WebContentsViewAndroid::WebContentsViewAndroid(
content_view_core_(NULL),
delegate_(delegate),
view_(this, ui::ViewAndroid::LayoutType::NORMAL),
synchronous_compositor_client_(nullptr),
gesture_listener_manager_(nullptr) {}
synchronous_compositor_client_(nullptr) {}
WebContentsViewAndroid::~WebContentsViewAndroid() {
if (view_.GetLayer())
......@@ -160,12 +159,6 @@ WebContentsViewAndroid::GetRenderWidgetHostViewAndroid() {
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 {
return content_view_core_ ? content_view_core_->GetWindowAndroid() : nullptr;
}
......@@ -493,14 +486,6 @@ bool WebContentsViewAndroid::DoBrowserControlsShrinkBlinkSize() const {
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) {
if (event.GetAction() == ui::MotionEventAndroid::Action::DOWN)
content_view_core_->OnTouchDown(event.GetJavaObject());
......
......@@ -8,7 +8,6 @@
#include <memory>
#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/web_contents/web_contents_view.h"
#include "content/public/browser/web_contents_view_delegate.h"
......@@ -19,10 +18,6 @@
#include "ui/android/view_client.h"
#include "ui/gfx/geometry/rect_f.h"
namespace blink {
class WebGestureEvent;
}
namespace content {
class ContentViewCore;
class RenderWidgetHostViewAndroid;
......@@ -56,9 +51,6 @@ class WebContentsViewAndroid : public WebContentsView,
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
void SetGestureListenerManager(
std::unique_ptr<GestureListenerManager> manager);
// WebContentsView implementation --------------------------------------------
gfx::NativeView GetNativeView() const override;
gfx::NativeView GetContentNativeView() const override;
......@@ -110,8 +102,6 @@ class WebContentsViewAndroid : public WebContentsView,
int GetTopControlsHeight() const override;
int GetBottomControlsHeight() const override;
bool DoBrowserControlsShrinkBlinkSize() const override;
void GestureEventAck(const blink::WebGestureEvent& event,
InputEventAckState ack_result) override;
// ui::ViewClient implementation.
bool OnTouchEvent(const ui::MotionEventAndroid& event) override;
......@@ -151,9 +141,6 @@ class WebContentsViewAndroid : public WebContentsView,
// Interface used to get notified of events from the synchronous compositor.
SynchronousCompositorClient* synchronous_compositor_client_;
// The manager for gesture event listeners.
std::unique_ptr<GestureListenerManager> gesture_listener_manager_;
gfx::PointF drag_location_;
gfx::PointF drag_screen_location_;
......
......@@ -111,7 +111,13 @@ public class ContentViewCoreImpl
private class ContentGestureStateListener implements GestureStateListener {
@Override
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);
}
......@@ -174,10 +180,6 @@ public class ContentViewCoreImpl
// sequence, so this will also be true for the duration of a pinch gesture.
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.
*/
......@@ -473,7 +475,7 @@ public class ContentViewCoreImpl
@Override
public boolean isScrollInProgress() {
return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0;
return mTouchScrollInProgress || getGestureListenerManager().hasPotentiallyActiveFling();
}
private void setTouchScrollInProgress(boolean inProgress) {
......@@ -756,7 +758,7 @@ public class ContentViewCoreImpl
// It's a very real (and valid) possibility that a fling may still
// be active when programatically scrolling. Cancelling the fling in
// such cases ensures a consistent gesture event stream.
if (mPotentiallyActiveFlingCount > 0) {
if (getGestureListenerManager().hasPotentiallyActiveFling()) {
getEventForwarder().onCancelFling(time);
}
// x/y represents starting location of scroll.
......@@ -1043,23 +1045,10 @@ public class ContentViewCoreImpl
if (!isScrollInProgress()) return;
final boolean touchScrollInProgress = mTouchScrollInProgress;
final int potentiallyActiveFlingCount = mPotentiallyActiveFlingCount;
mPotentiallyActiveFlingCount = 0;
setTouchScrollInProgress(false);
if (touchScrollInProgress) getGestureListenerManager().updateOnScrollEnd();
if (potentiallyActiveFlingCount > 0) getGestureListenerManager().updateOnFlingEnd();
}
@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);
getGestureListenerManager().resetFlingGesture();
}
// DisplayAndroidObserver method.
......
......@@ -33,6 +33,10 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
private final ObserverList<GestureStateListener> mListeners;
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;
/**
......@@ -74,6 +78,11 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
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
@Override
......@@ -112,8 +121,17 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
}
}
/** Update all the listeners after fling end event occurred. */
public void updateOnFlingEnd() {
/* Called when ongoing fling gesture needs to be reset. */
public void resetFlingGesture() {
if (mPotentiallyActiveFlingCount > 0) {
onFlingEnd();
mPotentiallyActiveFlingCount = 0;
}
}
@CalledByNative
private void onFlingEnd() {
if (mPotentiallyActiveFlingCount > 0) mPotentiallyActiveFlingCount--;
for (mIterator.rewind(); mIterator.hasNext();) {
mIterator.next().onFlingEndGesture(verticalScrollOffset(), verticalScrollExtent());
}
......@@ -121,6 +139,7 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
@CalledByNative
private void onFlingStartEventConsumed() {
mPotentiallyActiveFlingCount++;
for (mIterator.rewind(); mIterator.hasNext();) {
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