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

Unified Diff: remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java

Issue 1427453004: Fixing image canvas resize problems when showing/hiding system UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing Hide action from ActionBar when autohide is enabled. Created 5 years, 2 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: remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
diff --git a/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java b/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
index cd4a4626fb79bcede7bffa99ed3b5e0ab2ecb30c..1dd6158123e5d96bc37364a24e6bf3cf5ea5df1a 100644
--- a/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
+++ b/remoting/android/java/src/org/chromium/chromoting/TrackingInputHandler.java
@@ -7,6 +7,8 @@ package org.chromium.chromoting;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
+import android.graphics.Rect;
+import android.graphics.RectF;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
@@ -79,6 +81,18 @@ public class TrackingInputHandler implements TouchInputHandler {
*/
private boolean mSwipeCompleted = false;
+ /**
+ * Represents the amount of vertical space in pixels used by the soft input device and
+ * accompanying system UI.
+ */
+ private int mInputMethodOffsetY = 0;
+
+ /**
+ * Represents the amount of horizontal space in pixels used by the soft input device and
+ * accompanying system UI.
+ */
+ private int mInputMethodOffsetX = 0;
+
public TrackingInputHandler(DesktopViewInterface viewer, Context context,
RenderData renderData) {
mViewer = viewer;
@@ -130,14 +144,17 @@ public class TrackingInputHandler implements TouchInputHandler {
*/
private void repositionImage() {
synchronized (mRenderData) {
+ float adjustedScreenWidth = mRenderData.screenWidth - mInputMethodOffsetX;
+ float adjustedScreenHeight = mRenderData.screenHeight - mInputMethodOffsetY;
+
// Get the current cursor position in screen coordinates.
float[] cursorScreen = {mCursorPosition.x, mCursorPosition.y};
mRenderData.transform.mapPoints(cursorScreen);
// Translate so the cursor is displayed in the middle of the screen.
mRenderData.transform.postTranslate(
- (float) mRenderData.screenWidth / 2 - cursorScreen[0],
- (float) mRenderData.screenHeight / 2 - cursorScreen[1]);
+ (float) adjustedScreenWidth / 2 - cursorScreen[0],
+ (float) adjustedScreenHeight / 2 - cursorScreen[1]);
// Now the cursor is displayed in the middle of the screen, see if the image can be
// panned so that more of it is visible. The primary goal is to show as much of the
@@ -145,17 +162,17 @@ public class TrackingInputHandler implements TouchInputHandler {
// Get the coordinates of the desktop rectangle (top-left/bottom-right corners) in
// screen coordinates. Order is: left, top, right, bottom.
- float[] rectScreen = {0, 0, mRenderData.imageWidth, mRenderData.imageHeight};
- mRenderData.transform.mapPoints(rectScreen);
+ RectF rectScreen = new RectF(0, 0, mRenderData.imageWidth, mRenderData.imageHeight);
+ mRenderData.transform.mapRect(rectScreen);
- float leftDelta = rectScreen[0];
- float rightDelta = rectScreen[2] - mRenderData.screenWidth;
- float topDelta = rectScreen[1];
- float bottomDelta = rectScreen[3] - mRenderData.screenHeight;
+ float leftDelta = rectScreen.left;
+ float rightDelta = rectScreen.right - mRenderData.screenWidth + mInputMethodOffsetX;
+ float topDelta = rectScreen.top;
+ float bottomDelta = rectScreen.bottom - mRenderData.screenHeight + mInputMethodOffsetY;
float xAdjust = 0;
float yAdjust = 0;
- if (rectScreen[2] - rectScreen[0] < mRenderData.screenWidth) {
+ if (rectScreen.right - rectScreen.left < adjustedScreenWidth) {
// Image is narrower than the screen, so center it.
xAdjust = -(rightDelta + leftDelta) / 2;
} else if (leftDelta > 0 && rightDelta > 0) {
@@ -167,7 +184,7 @@ public class TrackingInputHandler implements TouchInputHandler {
}
// Apply similar logic for yAdjust.
- if (rectScreen[3] - rectScreen[1] < mRenderData.screenHeight) {
+ if (rectScreen.bottom - rectScreen.top < adjustedScreenHeight) {
yAdjust = -(bottomDelta + topDelta) / 2;
} else if (topDelta > 0 && bottomDelta > 0) {
yAdjust = -Math.min(topDelta, bottomDelta);
@@ -289,6 +306,19 @@ public class TrackingInputHandler implements TouchInputHandler {
}
@Override
+ public void onSoftInputMethodVisibilityChanged(boolean inputMethodVisible, Rect bounds) {
+ if (inputMethodVisible) {
+ mInputMethodOffsetY = mRenderData.screenHeight - bounds.bottom;
Lambros 2015/11/02 19:48:54 Add synchronized (mRenderData) { .. }
+ mInputMethodOffsetX = mRenderData.screenWidth - bounds.right;
+ } else {
+ mInputMethodOffsetY = 0;
+ mInputMethodOffsetX = 0;
+ }
+
+ repositionImageWithZoom();
+ }
+
+ @Override
public void processAnimation() {
int previousX = mFlingScroller.getCurrX();
int previousY = mFlingScroller.getCurrY();

Powered by Google App Engine
This is Rietveld 408576698