Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(812)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java

Issue 1089663002: (NOT FOR REVIEW) Smooth gamepad scroll via scrollBy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: scrollBy Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index a01472a628829a5f6f15019651d132f1338f8d2b..5c23b8d1895647a752388364f5e024d1f813a260 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -523,6 +523,7 @@ public class ContentViewCore
// Cached copy of all positions and scales as reported by the renderer.
private final RenderCoordinates mRenderCoordinates;
+ private final JoystickScrollProvider mJoystickScrollProvider;
private boolean mIsMobileOptimizedHint;
@@ -618,6 +619,8 @@ public class ContentViewCore
// screen orientation.
private boolean mFullscreenRequiredForOrientationLock = true;
+ private boolean mShowingSoftKeyboard;
+
// A ViewAndroidDelegate that delegates to the current container view.
private ContentViewAndroidDelegate mViewAndroidDelegate;
@@ -649,6 +652,7 @@ public class ContentViewCore
mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext);
mRenderCoordinates = new RenderCoordinates();
+ mJoystickScrollProvider = new JoystickScrollProvider(this);
float deviceScaleFactor = getContext().getResources().getDisplayMetrics().density;
String forceScaleFactor = CommandLine.getInstance().getSwitchValue(
ContentSwitches.FORCE_DEVICE_SCALE_FACTOR);
@@ -682,6 +686,9 @@ public class ContentViewCore
return mContainerView;
}
+ public boolean getSoftKeyboardShowFlag() {
+ return mShowingSoftKeyboard;
+ }
/**
* @return The WebContents currently being rendered.
*/
@@ -762,6 +769,7 @@ public class ContentViewCore
@Override
public void onDismissInput() {
getContentViewClient().onImeStateChangeRequested(false);
+ mShowingSoftKeyboard = false;
}
@Override
@@ -780,9 +788,11 @@ public class ContentViewCore
return new ResultReceiver(new Handler()) {
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
+ mShowingSoftKeyboard = resultCode == InputMethodManager.RESULT_SHOWN
+ || resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN;
getContentViewClient().onImeStateChangeRequested(
- resultCode == InputMethodManager.RESULT_SHOWN
- || resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN);
+ mShowingSoftKeyboard);
+
if (resultCode == InputMethodManager.RESULT_SHOWN) {
// If OSK is newly shown, delay the form focus until
// the onSizeChanged (in order to adjust relative to the
@@ -1795,6 +1805,16 @@ public class ContentViewCore
mContainerView.postDelayed(mFakeMouseMoveRunnable, 250);
return true;
}
+ } else if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
+ // Handle left stick event
+ mJoystickScrollProvider.onMotion(event);
+ /**
+ * Android framework generates secondary DPAD_[DIRECTION] events from unhandled
+ * (LS,RS)joystick events. These events cause webview focus to change to next
+ * focus-able item or force default scroll action. Setting the location to 0,0
+ *effectively disable these DPAD events.
+ */
+ event.setLocation(0, 0);
}
return mContainerViewInternals.super_onGenericMotionEvent(event);
}
@@ -1823,11 +1843,9 @@ public class ContentViewCore
* are overridden, so that View's mScrollX and mScrollY will be unchanged at
* (0, 0). This is critical for drawing ContentView correctly.
*/
- public void scrollBy(int xPix, int yPix) {
- if (mNativeContentViewCore != 0) {
- nativeScrollBy(mNativeContentViewCore,
- SystemClock.uptimeMillis(), 0, 0, xPix, yPix);
- }
+ public void scrollBy(int dxPix, int dyPix) {
+ if (mNativeContentViewCore == 0) return;
+ scrollByImpl(dxPix, dyPix);
}
/**
@@ -1839,18 +1857,20 @@ public class ContentViewCore
final float yCurrentPix = mRenderCoordinates.getScrollYPix();
final float dxPix = xPix - xCurrentPix;
final float dyPix = yPix - yCurrentPix;
- if (dxPix != 0 || dyPix != 0) {
- long time = SystemClock.uptimeMillis();
- // 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) nativeFlingCancel(mNativeContentViewCore, time);
- nativeScrollBegin(mNativeContentViewCore, time,
- xCurrentPix, yCurrentPix, -dxPix, -dyPix);
- nativeScrollBy(mNativeContentViewCore,
- time, xCurrentPix, yCurrentPix, dxPix, dyPix);
- nativeScrollEnd(mNativeContentViewCore, time);
- }
+ scrollByImpl(dxPix, dyPix);
+ }
+
+ private void scrollByImpl(float dxPix, float dyPix) {
sshelke 2015/05/12 12:09:05 Implementation for ScrollBy and ScrollTo looks sam
jdduke (slow) 2015/05/12 15:13:11 The difference is that |ScrollTo| computes the del
+ if (mNativeContentViewCore == 0) return;
+ if (dxPix == 0 && dyPix == 0) return;
+ long time = SystemClock.uptimeMillis();
+ // 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) nativeFlingCancel(mNativeContentViewCore, time);
+ nativeScrollBegin(mNativeContentViewCore, time, 0, 0, -dxPix, -dyPix);
+ nativeScrollBy(mNativeContentViewCore, time, 0, 0, dxPix, dyPix);
+ nativeScrollEnd(mNativeContentViewCore, time);
}
// NOTE: this can go away once ContentView.getScrollX() reports correct values.
@@ -2309,6 +2329,7 @@ public class ContentViewCore
// We cannot trust ContentViewClient#onImeStateChangeRequested to
// hide the input window because it has an empty default implementation.
// So we need to explicitly hide the input method window here.
+ mShowingSoftKeyboard = false;
if (mInputMethodManagerWrapper.isActive(mContainerView)) {
mInputMethodManagerWrapper.hideSoftInputFromWindow(
mContainerView.getWindowToken(), 0, null);

Powered by Google App Engine
This is Rietveld 408576698