Index: remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java |
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java b/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java |
index 3cb12eae226cfba263a6d1b38bf1f5753b9205c7..dedbbb4e0361a6c33121c0b22a15f8cd5dc2cdb8 100644 |
--- a/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java |
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/GlDisplay.java |
@@ -4,7 +4,10 @@ |
package org.chromium.chromoting.jni; |
+import android.graphics.Matrix; |
+import android.graphics.PointF; |
import android.view.Surface; |
+import android.view.SurfaceHolder; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
@@ -13,6 +16,8 @@ import org.chromium.chromoting.DesktopView; |
import org.chromium.chromoting.DesktopViewFactory; |
import org.chromium.chromoting.Event; |
import org.chromium.chromoting.GlDesktopView; |
+import org.chromium.chromoting.InputFeedbackRadiusMapper; |
+import org.chromium.chromoting.RenderStub; |
import org.chromium.chromoting.SizeChangedEventParameter; |
/** |
@@ -24,12 +29,16 @@ import org.chromium.chromoting.SizeChangedEventParameter; |
* Events will only be triggered on UI. |
*/ |
@JNINamespace("remoting") |
-public class GlDisplay { |
+public class GlDisplay implements SurfaceHolder.Callback, RenderStub { |
private volatile long mNativeJniGlDisplay; |
+ private final Event.Raisable<SizeChangedEventParameter> mOnClientSizeChanged = |
+ new Event.Raisable<>(); |
private final Event.Raisable<SizeChangedEventParameter> mOnHostSizeChanged = |
new Event.Raisable<>(); |
private final Event.Raisable<Void> mOnCanvasRendered = |
new Event.Raisable<>(); |
+ private InputFeedbackRadiusMapper mFeedbackRadiusMapper; |
+ private float mScaleFactor = 0; |
private GlDisplay(long nativeJniGlDisplay) { |
mNativeJniGlDisplay = nativeJniGlDisplay; |
@@ -46,11 +55,12 @@ public class GlDisplay { |
/** |
* Notifies the OpenGL renderer that a surface for OpenGL to draw is created. |
- * @param surface the surface to be drawn on |
+ * @param holder the surface holder that holds the surface. |
*/ |
- public void surfaceCreated(Surface surface) { |
+ @Override |
+ public void surfaceCreated(SurfaceHolder holder) { |
if (mNativeJniGlDisplay != 0) { |
- nativeOnSurfaceCreated(mNativeJniGlDisplay, surface); |
+ nativeOnSurfaceCreated(mNativeJniGlDisplay, holder.getSurface()); |
} |
} |
@@ -60,7 +70,9 @@ public class GlDisplay { |
* @param width the width of the surface |
* @param height the height of the surface |
*/ |
- public void surfaceChanged(int width, int height) { |
+ @Override |
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
+ mOnClientSizeChanged.raise(new SizeChangedEventParameter(width, height)); |
if (mNativeJniGlDisplay != 0) { |
nativeOnSurfaceChanged(mNativeJniGlDisplay, width, height); |
} |
@@ -69,39 +81,83 @@ public class GlDisplay { |
/** |
* Notifies the OpenGL renderer that the current surface being used is about to be destroyed. |
*/ |
- public void surfaceDestroyed() { |
+ @Override |
+ public void surfaceDestroyed(SurfaceHolder holder) { |
if (mNativeJniGlDisplay != 0) { |
nativeOnSurfaceDestroyed(mNativeJniGlDisplay); |
} |
} |
+ @Override |
+ public void setDesktopView(DesktopView view) { |
+ mFeedbackRadiusMapper = new InputFeedbackRadiusMapper(view); |
+ } |
+ |
/** |
* Sets the transformation matrix (in pixel coordinates). |
* @param matrix the transformation matrix |
*/ |
- public void pixelTransformationChanged(float[] matrix) { |
+ @Override |
+ public void setTransformation(Matrix matrix) { |
if (mNativeJniGlDisplay != 0) { |
- nativeOnPixelTransformationChanged(mNativeJniGlDisplay, matrix); |
+ float[] matrixArray = new float[9]; |
+ matrix.getValues(matrixArray); |
+ nativeOnPixelTransformationChanged(mNativeJniGlDisplay, matrixArray); |
+ mScaleFactor = matrix.mapRadius(1); |
} |
} |
/** Moves the cursor to the corresponding location on the desktop. */ |
- public void cursorPixelPositionChanged(float x, float y) { |
+ @Override |
+ public void moveCursor(PointF position) { |
if (mNativeJniGlDisplay != 0) { |
- nativeOnCursorPixelPositionChanged(mNativeJniGlDisplay, x, y); |
+ nativeOnCursorPixelPositionChanged(mNativeJniGlDisplay, position.x, position.y); |
} |
} |
/** |
* Decides whether the cursor should be shown on the canvas. |
*/ |
- public void cursorVisibilityChanged(boolean visible) { |
+ @Override |
+ public void setCursorVisibility(boolean visible) { |
if (mNativeJniGlDisplay != 0) { |
nativeOnCursorVisibilityChanged(mNativeJniGlDisplay, visible); |
} |
} |
/** |
+ * Shows the cursor input feedback animation with the given diameter at the given desktop |
+ * location. |
+ */ |
+ @Override |
+ public void showInputFeedback(InputFeedbackType feedbackToShow, PointF pos) { |
+ if (mNativeJniGlDisplay == 0 || feedbackToShow.equals(InputFeedbackType.NONE)) { |
+ return; |
+ } |
+ float diameter = mFeedbackRadiusMapper |
+ .getFeedbackRadius(feedbackToShow, mScaleFactor) * 2.0f; |
+ if (diameter <= 0.0f) { |
+ return; |
+ } |
+ nativeOnCursorInputFeedback(mNativeJniGlDisplay, pos.x, pos.y, diameter); |
+ } |
+ |
+ @Override |
+ public Event<SizeChangedEventParameter> onClientSizeChanged() { |
+ return mOnClientSizeChanged; |
+ } |
+ |
+ @Override |
+ public Event<SizeChangedEventParameter> onHostSizeChanged() { |
+ return mOnHostSizeChanged; |
+ } |
+ |
+ @Override |
+ public Event<Void> onCanvasRendered() { |
+ return mOnCanvasRendered; |
+ } |
+ |
+ /** |
* Called by native code to notify GlDisplay that the size of the canvas (=size of desktop) has |
* changed. |
* @param width width of the canvas |
@@ -113,13 +169,6 @@ public class GlDisplay { |
} |
/** |
- * An {@link Event} triggered when the size of the host desktop is changed. |
- */ |
- public Event<SizeChangedEventParameter> onHostSizeChanged() { |
- return mOnHostSizeChanged; |
- } |
- |
- /** |
* Called by native code when a render request has been done by the OpenGL renderer. This |
* will only be called when the render event callback is enabled. |
*/ |
@@ -128,24 +177,6 @@ public class GlDisplay { |
mOnCanvasRendered.raise(null); |
} |
- /** |
- * An {@link} triggered when render event callback is enabled and a render request has been done |
- * by the OpenGL renderer. |
- */ |
- public Event<Void> onCanvasRendered() { |
- return mOnCanvasRendered; |
- } |
- |
- /** |
- * Shows the cursor input feedback animation with the given diameter at the given desktop |
- * location. |
- */ |
- public void showCursorInputFeedback(float x, float y, float diameter) { |
- if (mNativeJniGlDisplay != 0) { |
- nativeOnCursorInputFeedback(mNativeJniGlDisplay, x, y, diameter); |
- } |
- } |
- |
@CalledByNative |
private void initializeClient(Client client) { |
client.setDesktopViewFactory(new DesktopViewFactory() { |