Commit 98c28a6f authored by Ian Vollick's avatar Ian Vollick Committed by Commit Bot

Reland "[vr] Tune scroll event stream"

This is a reland of 0e9a15da

In this reland, I've combined the change with https://crrev.com/c/1124405
since the smoothing in the original CL was actually just a scaling.

Original change's description:
> [vr] Tune scroll event stream
>
> This change applies three heuristics to make trackpad scrolling feel
> smoother. We increase the frequency at which we submit scroll events to
> the platform, we also decrease the scroll scale factor (to make the
> scrolls less jumpy), and we do some simple filtering of our scroll
> values.
>
> I pair-programmed much of this change with asimjour@ and he wrote the
> initial code to interpolate events in the android ui gesture target.
>
> Bug: 859075
> Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:linux_vr;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
> Change-Id: I2fe42940214d01d99618ddacd182f202ff271dad
> Reviewed-on: https://chromium-review.googlesource.com/1120425
> Reviewed-by: Michael Thiessen <mthiesse@chromium.org>
> Commit-Queue: Ian Vollick <vollick@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#571535}

Bug: 859075
Change-Id: Ib1a9f801c6930b709624233d8e00aeabc59f576d
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:linux_vr;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Reviewed-on: https://chromium-review.googlesource.com/1124908Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Reviewed-by: default avatarAmirhossein Simjour <asimjour@chromium.org>
Commit-Queue: Ian Vollick <vollick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#572364}
parent 2e3335cb
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.vr_shell; package org.chromium.chrome.browser.vr_shell;
import android.os.Handler;
import android.view.InputDevice; import android.view.InputDevice;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
...@@ -38,6 +39,19 @@ public class AndroidUiGestureTarget { ...@@ -38,6 +39,19 @@ public class AndroidUiGestureTarget {
0 /* index */, x, y, 0 /* id */, MotionEvent.TOOL_TYPE_STYLUS); 0 /* index */, x, y, 0 /* id */, MotionEvent.TOOL_TYPE_STYLUS);
} }
@CalledByNative
private void setDelayedEvent(int x, int y, int action, long timeInMs, int delayMs) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mMotionEventSynthesizer.setPointer(
0 /* index */, x, y, 0 /* id */, MotionEvent.TOOL_TYPE_STYLUS);
mMotionEventSynthesizer.inject(action, 1 /* pointerCount */, timeInMs + delayMs,
InputDevice.SOURCE_CLASS_POINTER);
}
}, delayMs);
}
@CalledByNative @CalledByNative
private long getNativeObject() { private long getNativeObject() {
return mNativePointer; return mNativePointer;
......
...@@ -16,6 +16,9 @@ using base::android::JavaParamRef; ...@@ -16,6 +16,9 @@ using base::android::JavaParamRef;
using base::android::JavaRef; using base::android::JavaRef;
using content::MotionEventAction; using content::MotionEventAction;
static constexpr int kFrameDurationMs = 16;
static constexpr int kScrollEventsPerFrame = 2;
namespace vr { namespace vr {
AndroidUiGestureTarget::AndroidUiGestureTarget(JNIEnv* env, AndroidUiGestureTarget::AndroidUiGestureTarget(JNIEnv* env,
...@@ -77,12 +80,21 @@ void AndroidUiGestureTarget::DispatchWebInputEvent( ...@@ -77,12 +80,21 @@ void AndroidUiGestureTarget::DispatchWebInputEvent(
SetPointer(scroll_x_, scroll_y_); SetPointer(scroll_x_, scroll_y_);
Inject(content::MOTION_EVENT_ACTION_END, event_time_ms); Inject(content::MOTION_EVENT_ACTION_END, event_time_ms);
break; break;
case blink::WebGestureEvent::kGestureScrollUpdate: case blink::WebGestureEvent::kGestureScrollUpdate: {
scroll_x_ += (scroll_ratio_ * gesture->data.scroll_update.delta_x); float scale = scroll_ratio_ / kScrollEventsPerFrame;
scroll_y_ += (scroll_ratio_ * gesture->data.scroll_update.delta_y); scroll_x_ += gesture->data.scroll_update.delta_x * scale;
scroll_y_ += gesture->data.scroll_update.delta_y * scale;
SetPointer(scroll_x_, scroll_y_); SetPointer(scroll_x_, scroll_y_);
Inject(content::MOTION_EVENT_ACTION_MOVE, event_time_ms); Inject(content::MOTION_EVENT_ACTION_MOVE, event_time_ms);
scroll_x_ += gesture->data.scroll_update.delta_x * scale;
scroll_y_ += gesture->data.scroll_update.delta_y * scale;
SetDelayedEvent(scroll_x_, scroll_y_, content::MOTION_EVENT_ACTION_MOVE,
event_time_ms, kFrameDurationMs / kScrollEventsPerFrame);
break; break;
}
case blink::WebGestureEvent::kGestureTapDown: case blink::WebGestureEvent::kGestureTapDown:
SetPointer(gesture->PositionInWidget().x, gesture->PositionInWidget().y); SetPointer(gesture->PositionInWidget().x, gesture->PositionInWidget().y);
Inject(content::MOTION_EVENT_ACTION_START, event_time_ms); Inject(content::MOTION_EVENT_ACTION_START, event_time_ms);
...@@ -146,6 +158,21 @@ void AndroidUiGestureTarget::SetPointer(int x, int y) { ...@@ -146,6 +158,21 @@ void AndroidUiGestureTarget::SetPointer(int x, int y) {
y * scale_factor_); y * scale_factor_);
} }
void AndroidUiGestureTarget::SetDelayedEvent(int x,
int y,
MotionEventAction action,
int64_t time_ms,
int delay_ms) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
if (obj.is_null())
return;
Java_AndroidUiGestureTarget_setDelayedEvent(env, obj, x * scale_factor_,
y * scale_factor_, action,
time_ms, delay_ms);
}
// static // static
AndroidUiGestureTarget* AndroidUiGestureTarget::FromJavaObject( AndroidUiGestureTarget* AndroidUiGestureTarget::FromJavaObject(
const JavaRef<jobject>& obj) { const JavaRef<jobject>& obj) {
......
...@@ -34,6 +34,11 @@ class AndroidUiGestureTarget { ...@@ -34,6 +34,11 @@ class AndroidUiGestureTarget {
private: private:
void Inject(content::MotionEventAction action, int64_t time_ms); void Inject(content::MotionEventAction action, int64_t time_ms);
void SetPointer(int x, int y); void SetPointer(int x, int y);
void SetDelayedEvent(int x,
int y,
content::MotionEventAction action,
int64_t time_ms,
int delay_ms);
int scroll_x_ = 0; int scroll_x_ = 0;
int scroll_y_ = 0; int scroll_y_ = 0;
......
...@@ -11,7 +11,7 @@ namespace vr { ...@@ -11,7 +11,7 @@ namespace vr {
namespace { namespace {
constexpr float kDisplacementScaleFactor = 300.0f; constexpr float kDisplacementScaleFactor = 129.0f;
constexpr int kMaxNumOfExtrapolations = 2; constexpr int kMaxNumOfExtrapolations = 2;
......
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