Chromium Code Reviews| Index: remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| index 52151c6e009c3adfde20b6143c2d84709fbf1f6c..f02dd789979cfe49db851ba8f45154ff7faa668a 100644 |
| --- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| +++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java |
| @@ -4,7 +4,8 @@ |
| package org.chromium.chromoting; |
| -import android.content.Context; |
| +import android.app.ActionBar; |
| +import android.app.Activity; |
| import android.graphics.Bitmap; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| @@ -52,6 +53,8 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| UNDEFINED, WIDTH, HEIGHT |
| } |
| + private ActionBar mActionBar; |
| + |
| private GestureDetector mScroller; |
| private ScaleGestureDetector mZoomer; |
| @@ -64,6 +67,9 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| /** Specifies the dimension by which the zoom level is being lower-bounded. */ |
| private Constraint mConstraint; |
|
Sergey Ulanov
2013/07/30 19:19:27
Should this be called mZoomConstraint?
solb
2013/07/30 21:30:54
Not really, since it also affects panning behavior
|
| + /** Whether the dimension of constraint should be reckecked on the next aspect ratio change. */ |
| + private boolean mRecheckConstraint; |
| + |
| /** Whether the right edge of the image was visible on-screen during the last render. */ |
| private boolean mRightUsedToBeOut; |
| @@ -73,11 +79,10 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| private int mMouseButton; |
| private boolean mMousePressed; |
| - /** Whether the canvas needs to be redrawn. The update occurs when its size is next updated. */ |
| - private boolean mCanvasNeedsRedraw; |
| - |
| - public DesktopView(Context context) { |
| + public DesktopView(Activity context) { |
| super(context); |
| + mActionBar = context.getActionBar(); |
| + |
| getHolder().addCallback(this); |
| DesktopListener listener = new DesktopListener(); |
| mScroller = new GestureDetector(context, listener); |
| @@ -86,15 +91,15 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| mTransform = new Matrix(); |
| mScreenWidth = 0; |
| mScreenHeight = 0; |
| + |
| mConstraint = Constraint.UNDEFINED; |
| + mRecheckConstraint = false; |
| mRightUsedToBeOut = false; |
| mBottomUsedToBeOut = false; |
| mMouseButton = BUTTON_UNDEFINED; |
| mMousePressed = false; |
| - |
| - mCanvasNeedsRedraw = false; |
| } |
| /** |
| @@ -127,8 +132,8 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| boolean recenter = false; |
| if (mConstraint == Constraint.UNDEFINED) { |
| - mConstraint = image.getWidth()/image.getHeight() > mScreenWidth/mScreenHeight ? |
| - Constraint.WIDTH : Constraint.HEIGHT; |
| + mConstraint = (double)image.getWidth()/image.getHeight() > |
|
Sergey Ulanov
2013/07/30 19:19:27
mConstraint is calculated and used in the same met
solb
2013/07/30 21:30:54
Sometimes we need to keep the old value between re
|
| + (double)mScreenWidth/mScreenHeight ? Constraint.WIDTH : Constraint.HEIGHT; |
| recenter = true; // We always rescale and recenter after a rotation. |
| } |
| @@ -209,9 +214,15 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| getHolder().unlockCanvasAndPost(canvas); |
| } |
| - /** Causes the canvas to be redrawn the next time our surface changes. */ |
| - public void requestCanvasRedraw() { |
| - mCanvasNeedsRedraw = true; |
| + /** |
| + * Causes the next canvas redraw to perform a check for which screen dimension more tightly |
| + * constrains the view of the image. This should be called between the time that a screen size |
| + * change is requested and the time it actually occurs. If it is not called in such a case, the |
| + * screen will not be rearranged as aggressively (which is desirable when the software keyboard |
| + * appears in order to allow it to cover the image without forcing a resize). |
| + */ |
| + public void requestRecheckConstrainingDimension() { |
| + mRecheckConstraint = true; |
|
Sergey Ulanov
2013/07/30 19:19:27
Can we reset mContraint here?
solb
2013/07/30 21:30:54
No, because we won't know the screen size until on
|
| } |
| /** |
| @@ -221,15 +232,20 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| @Override |
| public void surfaceChanged( |
| SurfaceHolder holder, int format, int width, int height) { |
| + mActionBar.hide(); |
| + |
| synchronized (mTransform) { |
| mScreenWidth = width; |
| mScreenHeight = height; |
| - mConstraint = Constraint.UNDEFINED; |
| + |
| + if (mRecheckConstraint) { |
| + mConstraint = Constraint.UNDEFINED; |
| + mRecheckConstraint = false; |
| + } |
| } |
| - if (mCanvasNeedsRedraw) { |
| - JniInterface.redrawGraphics(); |
| - mCanvasNeedsRedraw = false; |
| + if (!JniInterface.redrawGraphics()) { |
| + JniInterface.provideRedrawCallback(this); |
| } |
| } |
| @@ -237,7 +253,6 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| @Override |
| public void surfaceCreated(SurfaceHolder holder) { |
| Log.i("deskview", "DesktopView.surfaceCreated(...)"); |
| - JniInterface.provideRedrawCallback(this); |
| } |
| /** |
| @@ -247,10 +262,9 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| @Override |
| public void surfaceDestroyed(SurfaceHolder holder) { |
| Log.i("deskview", "DesktopView.surfaceDestroyed(...)"); |
| - JniInterface.provideRedrawCallback(null); |
| - // Redraw the desktop as soon as the user switches back to this window. |
| - mCanvasNeedsRedraw = true; |
| + // Stop this canvas from being redrawn. |
| + JniInterface.provideRedrawCallback(null); |
| } |
| /** Called when a mouse action is made. */ |
| @@ -270,9 +284,13 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder. |
| */ |
| @Override |
| public boolean onTouchEvent(MotionEvent event) { |
| + if (event.getPointerCount() == 3) { |
| + mActionBar.show(); |
| + } |
| + |
| boolean handled = mScroller.onTouchEvent(event) || mZoomer.onTouchEvent(event); |
| - if (event.getPointerCount()==1) { |
| + if (event.getPointerCount() == 1) { |
|
Sergey Ulanov
2013/07/30 19:19:27
Do we still need to handle the event here when han
solb
2013/07/30 21:30:54
Unfortunately, in order to ensure the gesture dete
|
| float[] coordinates = {event.getRawX(), event.getY()}; |
| switch (event.getActionMasked()) { |